非对称加密
非对称加密需要两个密钥:公钥 (publickey) 和私钥(privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。
RSA 加密原理
| 步骤 | 说明 | 描述 | 备注 |
|---|---|---|---|
| 1 | 找出质数 | P 、Q | - |
| 2 | 计算公共模数 | N = P * Q | - |
| 3 | 欧拉函数 | φ(N) = (P-1)(Q-1) | φ(N) 代表在小于N的数中,有多少数与N互质 |
| 4 | 计算公钥E | 1 < E < φ(N) | E 的取值必须是整数 E 和 φ(N) 必须是互质数 |
| 5 | 计算私钥D | E * D % φ(N) = 1 | - |
| 6 | 加密 | C = ME mod N | C:密文 M:明文 |
| 7 | 解密 | M =CD mod N | C:密文 M:明文 |
示例
- 找出质数P、Q
P=3,Q=11
- 计算公共模数
N=3*11=33
- 欧拉函数
φ(33)=(P-1)(Q-1)=20
- 计算公钥E
1
取E =3
- 计算私钥D
3*D%20=1
D=7
- 加密
M(明文)=2,E=3
C = 23 % 33 = 8(加密后)
- 解密
对称加密
对称加密算法又称传统加密算法。 加密和解密使用同一个密钥。
总结对称和非对称加密
对称加密:
优点:算法简单,加密解密容易,效率高,执行快。
缺点:相对来说不算特别安全,只有一把钥匙,密文如果被拦截,且密钥也被劫持,那么,信息很容易被破译。
非对称加密:
优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。
缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。
https 连接
https 在传输数据阶段使用对称加密,对称加密的密钥采用非对称加密来传输
名词解释
| 名词 | 解释 |
|---|---|
| client-random / service-random | (客户端 / 服务端)随机数 |
| 加密套件 | 指加密的方法 |
| 加密套件列表 | 指浏览器能支持多少种加密方法列表 |
| CA | 数字证书颁发机构 |
SSL 握手
- 首先浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数 client-random;
- 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和数字证书;
- 浏览器验证数字证书正确后,利用 client-random 和 service-random 计算出来 pre-master,然后利用存在数字证书中的公钥对 pre-master 加密,并向服务器发送加密后的数据;
- 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。
- 服务器和浏览器就有了共同的 client-random、service-random 和 pre-master,所以最终生成的密钥也是相同的
ps :
- 生成对话密钥一共需要3个随机数。(为什么要3个随机数?)不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。pre-master 存在在于 SSL 协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机, 随机数可能会被猜出来。一个伪随机可能完全不随机,但是三个伪随机就十分接近随机了。
- 握手之后的对话使用对称加密,服务器的公钥和私钥只用于加密和解密非对称加密,无其他作用。
-
浏览器如何验证数字证书
首先浏览器读取证书中相关的明文信息,采用 CA 签名时相同的 Hash 函数来计算并得到信息摘要 A;
- 然后再利用对应 CA 的公钥解密签名数据,得到信息摘要 B;
- 对比信息摘要 A 和信息摘要 B,如果一致,则可以确认证书是合法的
ps :
- 证书存在的目的就是避免中间人攻击,避免发生经典的传令兵问题
- 有些 CA 可能比较小众,浏览器不知道该不该信任它,然后浏览器会继续查找给这个 CA 颁发证书的 CA,再以同样的方式验证它上级 CA 的可靠性。通常情况下,操作系统中会内置信任的顶级 CA 的证书信息(包含公钥),如果这个 CA 链中没有找到浏览器内置的顶级的 CA,证书也会被判定非法。
- 内置 CA 对应的证书称为根证书,根证书是最权威的机构,它们自己为自己签名,这称为自签名证书。
如何申请数字证书
- 首先需要准备一套私钥和公钥;
- 然后向 CA 机构提交公钥、公司、站点等信息并等待认证;
- CA 通过线上、线下等多种渠道来验证所提供信息的真实性,如公司是否存在、企业是否合法、域名是否归属该企业等;
如信息审核通过,CA 会签发认证的数字证书,包含了公钥、组织信息、CA 的信息、有效时间、证书序列号等,这些信息都是明文的,同时包含一个 CA生成的签名。
为什么不只用一种加密
如果只用非对称加密
第一个是非对称加密的效率太低。这会严重影响到加解密数据的速度,进而影响到用户打开页面的速度。
第二个是无法保证服务器发送给浏览器的数据安全。虽然浏览器端可以使用公钥来加密,但是服务器端只能采用私钥来加密,私钥加密只有公钥能解密,但黑客也是可以获取得到公钥的,这样就不能保证服务器端数据的安全了。
如果只用对称加密
其中传输 client-random 和 service-random 的过程却是明文的,这意味着黑客也可以拿到协商的加密套件和双方的随机数,由于利用随机数合成密钥的算法是公开的,所以黑客拿到随机数之后,也可以合成密钥,这样数据依然可以被破解,那么黑客也就可以使用密钥来伪造或篡改数据了。
wireshark 抓包百度
客户端发送随机数、加密套件
服务器返回选中的套件
服务器返回数字证书
服务器返回随机数和加密算法

当服务器私钥已泄露时,如果采用 RSA 算法,监听者即可获取全部的报文内容与信息( pre-master 密钥可直接解出)。采用 DH 算法则监听者必须攻破服务器/客户端之一,才能获得 DH 算法的密钥。浏览器发送加密后的 per-master
确认成功

这个报文的目的就是告诉对端自己在整个握手过程中收到了什么数据,发送了什么数据。来保证中间没人篡改报文。
- 其次,这个报文作用就是确认秘钥的正确性。因为 Encrypted handshake message 是使用对称秘钥进行加密的第一个报文,如果这个报文加解密校验成功,那么就说明对称秘钥是正确的。


