那么,为什么不直接使用 RSA 的密钥对进行加密数据?因为 RSA 的密钥对数值太大,不太合适频繁地加解密数据,所以需要更小的密钥 。
另一个原因是服务端没有浏览器或者客户端的密钥,无法向浏览器发送加密的数据(不能用自己的私钥加密,因为公钥是公开的) 。所以需要进行密钥交换 。
密钥交换密钥交换的方式有两种:RSA 和 ECDHE,RSA 的方式比较简单,浏览器生成一把密钥,然后使用证书 RSA 的公钥进行加密发给服务端,服务再使用它的密钥进行解密得到密钥,这样就能够共享密钥了 。
它的缺点是攻击者虽然在发送的过程中无法破解,但是如果它保存了所有加密的数据,等到证书到期没有被维护之类的原因导致私钥泄露,那么它就可以使用这把私钥去解密之前传送过的所有数据 。
而使用 ECDHE 是一种更安全的密钥交换算法 。如下图所示,双方通过 ECDHE 进行密钥交换:

文章插图
ECDHE 的全称是 Elliptic Curve Diffie–Hellman key Exchange 椭圆曲线迪非-赫尔曼密钥交换,它是对迪非-赫尔曼密钥交换算法的改进 。
这个算法的思想如下图所示:

文章插图
为了得到共享秘钥 K,甲用它的私钥计算一个数 g^a,发送给乙,乙的私钥为 b,乙便得到 K= g^a^b,同时发送 g^b 给甲,甲也得到了 K=g^b^a 。
这个应该比较好理解,而引入椭圆曲线加密能够提高破解难度 。
椭圆曲线加密现在的证书的签名算法有两种:RSA 和新起的 EC 。如下图所示,google.com 便是使用的 ECC 证书:

文章插图
我们上面讨论的便是 RSA,破解 RSA 的难点在于无法对公钥的 N 进行质数分解 。
如果你能对证书的 N 拆成两个质数相乘,便可推算出证书的私钥,但是在当前的计算能力下是不可能的 。而 ECC 的破解难点在于找到指定点的系数 。
如下图所示,有一条椭圆曲线方程:
y ^ 3 = x ^ 2 + ax + b:
文章插图
给定一个起点 G(x,y),现在要计算点 P=2G 的坐标,其过程是在 G 点上做一条线与曲线相切于 -2G,做 -2G 相对于 x 轴的反射便得到 2G 点 。
为了计算 3G 的坐标,如下图所示:

文章插图
连接 2G 与 G 与曲线相郊于 -3G,再做反射得到 3G,同理计算 4G 便是连接 G 与 3G 再做反射 。如果最后一个点和起点的连线垂直于 x 轴,说明所有的点已用完 。
EC 的难点在于给定起点 G 和点 K:
K = kG想要得到 K(K 足够大)是一件很困难的事情 。这个 K 便是私钥,而 K=kG 便是公钥 。ECC 是怎么加解密数据的呢?假设要加密的数据为 m,把这个点当作x坐标得到在曲线上的一个点 M,取定一个随机数 r,计算点 C1=rG,C2=M+rK 。
把这两个点便是加密后的数据,发给对方,对方收到后使用私钥 K 进行解密,过程如下:
M = C2 - rK = C2 - rkG = C2 - rkG = C2 - kC1通过上面的计算便能还原得到 M,而不知道私钥 K 的人是无法解密的 。更多细节可见 Medium 的这篇文章《ECC elliptic curve encryption》 。这样我们便理解了 ECC 的原理,那么怎么利用 ECC 进行密钥交换呢?ECC 密钥交换原理很简单,如下图所示:

文章插图
之前交换的是两个幂次方的数,现在变成交换两个曲线上的点 。
而曲线方程是规定好的,例如 Curve X25519 使用的曲线方程为:
y^2 = x^3 + 486662x^2 + x在密钥交换里面会指定所使用的曲线方程,如下图所示:
文章插图
mozilla.org 所使用的曲线方程为 secp256r1,这个也是比较流行的一个,它的参数比 Curve X25519 大很多 。
密钥交换也使用了证书的私钥进行签名,保证交换的密钥不会被人篡改,只是这里的私钥是 mozilla 自己的私钥 。
也就是说从连接建立到现在都是明文传输的 。接下来双方发送 Change Cipher Spec 的包通知,接下来的包都按照之前约定好的方式进行加密 。至此整个安全连接建立完毕 。
推荐阅读
- 图解机器学习:人人都能懂的算法原理
- 冬季身体“偶遇”小麻烦 中医教你改善
- 女人气血不足老得快 4招教你改善
- 麦肯锡4大方法论,多维度提升你的全面能力
- 铁皮石斛花泡茶禁忌,教你九个喝茶的技巧
- 初春多晒太阳好处多 看专家教你晒太阳的诀窍
- lol词汇adc的全面介绍 adc是什么意思
- 教你用Python实现截图和文字识别,就是这么简单
- 人体足部反射区高清图解
- 教你这三个穴位按摩 涌泉穴的准确位置图
