
文章插图
上面展示的便是自己手动计算的值,拿这个值和之前的值进行比较是否相等便可知发过来的证书是否被修改过 。
那么,为什么不直接使用 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
在密钥交换里面会指定所使用的曲线方程,如下图所示:
推荐阅读
- 当你的Mssql数据库被黑客攻击时,快来看看如何抓住黑客
- 黑客攻防手把手教你操作实现
- 黑客远程代码执行,你的服务器还安全嘛?
- 如何"引诱"蜘蛛抓取SEO的技巧,你知道吗?
- 苹果电脑到底需不需要关机?关机和休眠你选择哪个?
- 君山银针,我是你手中的那杯茶
- 冰糖的保质期是多久
- 给你美容祛斑好气色圣花——玫瑰花茶
- 张维迎:你应该知道的10个经济学原理
- 腕表上的这些记号你认识多少?
