加密原理详解:对称式加密VS非对称式加密
一、前言
在了解加密原理前,我们来看看这样一个故事。
小红和小明是情侣,一天,小红给小明发短信说:“亲爱的,我银行卡上没有钱了,你给我转1万块吧。”有过上当受骗经历的人都知道这有可能是小偷偷了小红手提包,然后拿手机发的短信。不过我们小明学过加密原理,于是他回复说:“你直接拿我的银行卡刷吧,密码加上我们第一次约会的日期就是663156。”很明显,只有小明和小红知道他们第一次约会是什么时候,假设是2008年4月1号,那么小红就可以根据计算663156-200841=462315得到银行卡密码,就可以消费了。
这就是加密的本质,将信息与密钥相加得到加密后的信息。只有知道密钥的人才能解密。
二、什么是秘钥
既然加密需要密钥,那么密钥是什么呢?
密钥是作用于加密时的一串密码,通过密钥进行信息加密,传输,到达接收者和监听者,由于接收者也有密钥,所以接收者可以根据密钥进行解密。从而防止通讯信息泄露。
三、什么是对称加密
前言讲的故事就是一个对称式加密,小明和小红都知道第一次约会的日期。所以传统的对称式加密需要通讯双方都保存同一份密钥,通过这份密钥进行加密和解密。所以非对称加密也称为单密钥加密。
对称加密的优势在于加解密速度快,但是安全性较低,密钥一旦泄露,所有的加密信息都会被破解。同时密钥的传输和保密也成为难题。为了解决密钥传输的问题,出现通过密钥交换建立共享密钥的技术。具体如何建立共享密钥呢?我们往下看。
3.1 建立共享密匙
在小明、小红和小偷的三人世界中,由于小明是学过加密原理的,知道迪菲–赫尔曼密钥交换(Diffie-Hellman Key Exchange),所以他知道如何建立共享密钥。
3.1.1 颜料混合把戏:
接下来我们看看如何通过颜料混合把戏建立共享密钥吧。
假设在房间中有小明、小红和小偷三个人,每个人各自拥有相同颜色的颜料。在房间的正中间也有这些颜料。接下来,小明要和小红建立共享密钥了。此时,小明对大家说:“我要用蓝色。”然后小明从自己的颜料里选择了黄色,这个黄色就是小明的私钥,小红和小偷都不知道。小明将自己的私钥黄色与公钥蓝色混合后,得到了一种不能分解的颜色,我们就叫“小明-蓝色”吧(虽然大家都知道黄+蓝变绿,但是这里我们为了知道是谁的混合色,还是以名字加公钥颜色来称呼),然后小明将“小明-蓝色”公布了出来。同样,小红听到了小明说用蓝色后,也选择了自己的私钥红色与公钥蓝色混合,得到了“小红-蓝色”并公布了出来。
此时,房间中小明、小红、小偷三人都知道了几个信息。
1.他们都用了蓝色
2.小明公布了“小明-蓝色”(小红和小偷不知道是什么颜料与蓝色的混合)
3.小红公布了“小红-蓝色”(小红和小偷不知道是什么颜料与蓝色的混合)
接下来,见证奇迹的时刻到了,小明拿到“小红-蓝色”与自己的私钥“黄色”混合,得到“小红-蓝色-小明”的新颜料。同样的,小红拿到“小明-蓝色”与自己的私钥“红色”混合,得到“小明-蓝色-小红”。大家发现了吗?“小红-蓝色-小明”和“小明-蓝色-小红”是一模一样的颜色。而小偷不知道小明和小红的私钥颜色,无法混合出与他们相同的颜色。
至此,共享密钥建立起来了。在了解了共享密钥的建立过程后,我们将告别实体颜料,采用数字的方式来建立共享密钥。
注:大家可能想到了,小偷可以根据自己的颜料与公钥“蓝色”混合,尝试得出“小明-蓝色”和“小红-蓝色”。这样的方法称之为穷举法,也就是尝试所有的可能性,进行信息破解,所以加密算法在理论上都是可以通过穷举法破解的,只不过实际上,超级计算机都需要计算万亿年才能穷举出所有可能性。
3.1.2 乘法把戏:
首先,我们假设乘法如同颜料混合一样,是不能分解的,看看如何用乘法与数字建立共享密钥。
小明公开了一个数字5,然后小明选择了一个私人数字4,然后利用乘法将两者混合起来,得到“小明-5”(20),接下来小红也选择了一个私人数字7得到“小红-5”(35),小明拿到35*4=140,小红拿到20*7=140。共享密钥建立完成。
大家也发现了,小偷知道20,35,5这三个数字后,用除法就能算出小明和小红的私钥。所以,接下来我们将了解实际使用中的如何使用乘法把戏来防止私钥被计算出来的。
3.2 迪菲–赫尔曼密钥交换算法
我们都知道幂运算,但是要让计算机计算就比较难了。所以,我们会用幂运算作为建立共享密钥的乘法把戏。同时,我们还要了解钟算的原理,这里的钟可以理解成我们经常看到的时钟,我们常见的时钟最大是12,如果当前是10点,过了4个小时后,就变成了下午2点。也就是(10+4)mod12=2。了解了钟算和幂运算后,就开始进入正题吧。
还是小明、小红和小偷的房间,小明声明了钟为11,幂运算的底为2,接下来小明和小红分别选择了自己的私钥4和7。
第一步,小明混合自己的“小明-11,2”得到,小红混合自己的“小红-11,2”得到。
第二步,小明拿到“小红-11,2”(7)进行计算,小红拿到“小明-11,2”(5)进行计算。
大家注意到了吗,小明和小红建立了共享密钥3,而小偷无法根据已知的11,2,5,7这几个数字计算出密钥或小明小红的私钥。有了共享密钥后,小明和小红就可以安全进行加密传输了。

3.3 AES对称加密过程
AES 的全称是 Advanced Encryption Standard ,是最流行的对称加密算法,其加解密速度快。AES支持128位,192位,256位三种长度的密钥,密钥越长安全性越高。AES加密时会把明文切分成许多小块的明文,然后对每块明文单独加密,将加密后的密文传送出去,接收方再将密文切块解密,得到明文。
如下图所示:

上一步中小明和小红已经协商好了密钥3。接下来就可以通过对称加密进行通信了。
在小明、小红和小偷的房间中,小明想把密码“462315”告诉小红,于是:
第一步:将密码按照一位的长度进行切分(实际中通常按128位进行切分);就变成了“4”“6”“2”“3”“1”“5”;
第二步:对每块明文通过密钥3进行加密,结果就是“795648”,然后小明告诉小红和小偷:“我的密码是795648”;
第三步:小红拿到密文后,对密文进行切块,对每块通过密钥3进行解密,就得到了正确的密码“462315”,而小偷由于不知道密钥,就无法解密出正确的信息。
四、什么是非对称加密
在对称加密中,加密和解密使用的是同一份密钥。所以,在非对称加密中,加密和解密使用的是不同的密钥。非对称加密中的密钥分为公钥和私钥。公钥顾名思义就是公开的,任何人都可以通过公钥进行信息加密,但是只有用户私钥的人才能完成信息解密。非对称加密带来了一个好处,避免了对称式加密需要传输和保存同一份密钥的痛苦。
现在最流行的非对称加密算法就是RSA加密算法,具体是怎么做的呢,我们继续往下看。
4.1 RSA对称加密过程
维基百科是这么解释的:RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用。RSA是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。
前面我们讲了如何通过钟算和幂函数建立不可逆(计算机可以通过穷举法计算出私钥,实际场景中就算是超级计算机也要计算几万亿年之久)的共享密钥。由于小红是小明的女朋友,小明天天在小红面前给她讲RSA加密算法的原理,所以小红也知道怎么得出自己的公钥和私钥。接下来我们一起跟着小红的脚步,看看RSA加密的公钥和私钥是怎么计算出来的。
第一步:小红选择了两个很大的质数p和q,这里为了便于计算,选择2和11;
第二步:计算p和q的乘积n=p*q=2*11=22;
第三部:计算n的欧拉函数φ(n)=(p-1)*(q-1)=10;
第四步:选择一个小于φ(n)且与φ(n)互质的整数e,{1,3,7,9},这里选择e=7;
第五步:计算e对于φ(n)的模反元素(ed mode φ(n) = 1)d,d=3
到这里小红就得到了他自己的公钥(n,e)和私钥(n,d)。其中n就是钟大小,e和d就是幂函数的幂。接下来就通过计算出来的公钥和私钥进行数据的加解密。
还是小明、小红和小偷三个人,小红对大家说,我的公钥是(22,7),小明知道了小红的公钥后,想讲自己的信息“14”告诉小红,于是就用小红公开的公钥进行加密。
具体步骤如下:
第一步:小明根据要加密的信息14进行计算,得到加密后的信息20,然后将20告诉小红和小偷;
第二步:小红有自己的私钥,将加密信息20进行解密,,得到了小明想传递给小红的信息。而小偷呢,知道22,7,20,但是不知道小红的密钥(22,3),无法解密出正确的信息。
RSA加密算法在数字签名中也发挥着巨大的作用,假设小偷可以假冒小红,说小红的公钥是(22,9),而小明不知道是小偷假扮的,按照小偷的公钥加密后,结果被小偷解密了。数字签名的作用就是防止信息被篡改,小红说她的公钥是(22,7)的同时,使用私钥给这段信息(通常使用MD5值计算签名)加上签名,小明得到公钥(22,7)和签名13,小明拿到签名后利用公钥计算出信息是否被篡改。

五、加密的实际作用
本文使用的很小的数来进行加密原理的讲解,为了是读者可以方便进行计算。在实际使用中(n,e)都是特别大的数,其中n的长度都在768以上,1024长度被认为是基本安全的。
(1230186684530117755130494958384962720772853569595334792197322452151726400507263657518745202199786469389956474942774063845925192557326303453731548268507917026122142913461670429214311602221240479274737794080665351419597459856902143413=
33478071698956898786044169848212690817704794983713768568912431388982883793878002287614711652531743087737814467999489
×
36746043666799590428244633799627952632279158164343087642676032283815739666511279233373417143396810270092798736308917)
六、总结
最后总结一下,首先我们通过一个诈骗短信的例子,引出了加密的原理就是信息+密钥,密钥就是对信息进行加解密的一串数字。然后通过颜料混合把戏形象的演示了如何建立共享密钥。在使用乘法建立共享密钥的过程中,学习了钟算和幂运算,接着我们了解了RSA加密算法的过程,通过两个质数生成公钥和私钥,最后,我们根据公钥进行信息加密,再通过私钥完成信息解密。
七、写在最后
或许看到这里,大家心里还有许多疑惑。为什么小明和小红建立共享密钥时,通过几次幂运算和钟算就能得到一样的共享密钥?为什么RSA加密算法要用两个质数?为什么通过公钥加密的信息可以通过私钥解开?
加密算法的背后,是一道道迷人的数学难题,而RSA加密算法之所以被广泛运用,是因为一个名为整数分解的古老数学问题,你可以轻易找到两个很大的质数相乘得到一个结果n,但是要将这个结果n分解回两个质数就变得极其困难。尽管这个所谓的“整数分解”问题被研究了数个世纪,还没人能找到一个足够高效的通用方法解决它,并对标准RSA钟大小造成危害。
数学史中充满了未解决的问题,尽管这些迷人的问题缺乏任何实际应用,却单靠其美学特质就吸引了数学家进行深入探究。令人颇感惊讶的是,许多这类迷人但显然无用的问题后来都有了很大的实用价值,这一价值只有在问题被研究数个世纪后才得以破解。整数分解这一问题由来已久。对其最早的严肃研究似乎是在17世纪,由数学家费马(Fermat)和梅森(Mersenne)进行的。欧拉(Euler)和高斯(Gauss)两位数学“泰斗”也在接下来的世纪里对这一问题做出了贡献。但直到公钥加密于20世纪70年代被发明,分解大数字的困难才成为一个实际应用的关键。
八、参考资料
2.《RSA加密》
4.《改变未来的九大算法》
作者:vivo 互联网服务器团队-Deng Qian
加密原理详解:对称式加密VS非对称式加密的更多相关文章
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- 开源项目SMSS发开指南(五)——SSL/TLS加密通信详解(下)
继上一篇介绍如何在多种语言之间使用SSL加密通信,今天我们关注Java端的证书创建以及支持SSL的NioSocket服务端开发.完整源码 一.创建keystore文件 网上大多数是通过jdk命令创建秘 ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- [转帖]HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...
- 【转】HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并 ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- AES 加密算法的原理详解
AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...
- 2. EM算法-原理详解
1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...
- Storm概念、原理详解及其应用(一)BaseStorm
本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数“wordcount” ...
- CentOS 6.5 iptables原理详解以及功能说明
CentOS 6.5 iptables原理详解以及功能说明 来源 https://blog.51cto.com/tanxw/1389114 前言 iptables其实就是Linux下的一个开源的信息过 ...
随机推荐
- GUI界面实现小学生口算题卡功能(一)| 简要了解GUI
上课没认真听,下课不好好写. 关于GUI,首先了解了一下什么是GUI: GUI(Graphical User Interface),图形用户界面.采用图形方式显示的计算机操作用户接口.与早期计算机使用 ...
- Go 获取 IP 地址
1. 获取本地IP地址 使用 net 包可以获取本地机器的 IP 地址.以下是一个获取本地 IP 地址的简单示例: package main import ( "fmt" &quo ...
- 在 JMeter 中使用 JSON 提取器提取特定条件下的值
当你需要在 JMeter 中对接收到的 JSON 响应进行处理时,JSON 提取器是一个非常有用的工具.在本文中,我们将讨论如何使用 JSON 提取器来提取特定条件下的值,以满足你的需求. 问题描述 ...
- 一文搞定K8S监控告警平台选型
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 前言 最近在搞K8S的监控告警平台选型,对比了目前比较流行两款开源平台kube-prometheus.夜莺,也踩了一些坑分享 ...
- Nginx服务器常用参数设置
Nginx作为一个高性能的Web服务器和反向代理,它的性能可以通过调整底层操作系统的参数来进一步优化.以下是一些常见的操作系统级别的调整,通常针对Linux系统: File Descriptors L ...
- 确定了-C#是2023年度的编程语言!
大家好,我是沙漠尽头的狼.在朋友圈看到桂素伟大佬发的喜讯截图,站长赶紧翻译向大家报喜,确定了-C#是2023年度的编程语言! 在TIOBE指数的历史上,C#首次获得了年度编程语言的奖项.祝贺!二十多年 ...
- Aware依赖注入管理
1.Aware介绍 在Spring当中有一些内置的对象是未开放给我们使用的,例如Spring的上下文ApplicationContext.环境属性Environment,BeanFactory等等其他 ...
- 无法找到模块“element-plus/dist/locale/zh-cn.mjs”的声明文件
把 zhCn 的引入 改成 下面这个就可以了 import zhCn from "element-plus/es/locale/lang/zh-cn"; 贼拉拉管用,快去试试吧 ~
- throws和try、catch有什么区别?throws如何使用?
在Java中,异常处理是非常重要的一部分.当程序出现异常时,我们需要对其进行处理以确保程序的正确性和可靠性.Java提供了两种异常处理机制:throws和try.catch. 区别 throws和tr ...
- poj 3987 Computer Virus on Planet Pandora —— ac自动机复习
poj 3987 Computer Virus on Planet Pandora ac自动机复习 题意如下 给出多个模式串,最后给出一个文本串,求有多少个模式串被文本串包含或者被反序的文本串包含 几 ...