TLS 的目的便是解决数据的
一、Record 记录协议 (对称加解密)
二、HandShake 握手,挥手
验证通讯双方身份
交换加解密的安全套件
协商加密解密参数
非对称加密
当一个TLS会话建立好之后,会使用对称加密的密钥去通信,那么如何实现事先将对称加密的密钥传递给TLS会话的另一方呢。利用的就是非对称加密。分对称加密比对称加密慢数千倍,所以只是使用对称加密传递之后加密使用的对称加密的密钥。之后的加密安全性靠的是对称加密来解决。
非对称加密是有一把公钥和一把私钥,公钥可以公开,而私钥不能。
用公钥加密成密文,再将密文用私钥解密就能实现加解密过程。
而用私钥加密,公钥解密就是签名认证过程。
常见的非对称加密方式分为两大类
RSA(大数的因数分解)
ECC (椭圆曲线)
RSA 没有向前安全性,也就是需要每次的对称加密密钥的传递都是基于 公钥加密,服务端私钥解密。如果服务端的私钥丢失了,那几年前的通信数据都有可能被解密。所以这是极度不安全的,私钥的地位太重了,如果每次的加解密都是临时生成的密码来解决安全性,才不会对私钥的安全性有如此强的依赖。在2013年的棱镜门事件中,某个CA机构迫于美国政府压力向其提交了CA的私钥,这就是十分危险的。如果向前不安全,那么之前利用该CA私钥都会全部遭殃。所以这里说的是更安全的 DH类非对称加密。
下图就是DH密钥交换的TLS握手过程
DH 握手
DH 密钥交换协议
DH 密钥交换协议,Diffile-Hellman key Exchange,简称 DH 或 DHE 。它可以让双方在完全没有对方任何预先信息的条件下通过一个不安全的信道创建一个密钥。
1、客户端浏览器随机生成一个值Ra,计算Pa(x,y) = Ra*Q(x,y), Q(x,y)为全世界公认的某个椭圆曲线算法的基点。将Pa(x,y)发送至服务器。
假设 p = 97 g = 3
2、服务器随机生成一个值Rb,计算 Pb(x,y) = Rb * Q(x,y)。将Pb(x,y)发送到客户端浏览器。
a = 6 (Alice 的私钥)
b =21 (Bob的私钥)
3、客户端计算Sa(x,y) = Ra * Pb(x,y),服务器计算Sb(x,y)=Rb*Pa(x,y)
A = (g**a)%p (Alice计算得到的公钥 传递给Bob)
B = (g**b)%p (Bob计算得到公钥 传递给Alice)
4、算法保证了Sa=Sb=S, 提取其中的S的x向量作为密钥。
(B ** a) % p = 47
(A ** b) % p = 47
其安全性是和RSA是一样的,其安全性依赖于大数因数分解,所以提高安全性只能靠增加位数来保证,这样就涉及大量的乘法运算。性能比较低下。
ECC 椭圆曲线
为了解决上述DH的问题,引入了ECC椭圆曲线,进而进化为 ECDHE 算法,称为 Elliptic Curve Diffie-Hellman Key Exchange。ECC和RSA 在288字节的长度下,破解RSA需要煮沸一勺水的能量,而破解相同位数的ECC 就需要煮沸整个地球水的能量。RSA 为了提高安全性,只能靠增大密钥位数。尴尬的是现在的超算越来越厉害。量子计算下秀尔算法可8h内轻松破解2048位的RSA。RSA只能再增大密钥位数,但是再增大位数,移动端设备就惨了,你增大的密钥是运营商要收取流量费用的,而且加解密太费电。
ECC 的数学原理是椭圆曲线和离散对数。椭圆曲线很复杂。为了提升性能,还需要选择一个椭圆曲线,但是它不是真正的椭圆形,下面有图可以看到,只是运算上用到了椭圆算法。
但是ECC也有很多问题,1、ECC 可能有后门,如NSA(美国国家安全局发布的一套算法),这个算法就是被怀疑被植入后门了。2、而且ECC很多的算法都被注册专利了,一不小心就要吃官司,其专利大部分都被黑莓注册。
ECC 椭圆曲线的定义
-
椭圆曲线表达式:
- 如下四种不同的椭圆曲线。始终是关于x轴对称的(y平方)
ECC 曲线的特性 : +运算
A + B = E
E 为 A ,B 连续与曲线相交在X轴上的镜像
当 A 和 B 重合后 就可以得到 2A = E
ECC 的算法原理过于复杂,这里表示我也看不懂。点到为止吧。(以后看懂了再来补充)
这里的抓包结果就是用的EC DH E 算法来进行密钥交换的。这里选择的曲线是 secp256r1, 在这个曲线中,基点和参数已经给出了,PubKey 也给出了。
在 TLS1.3 中,一般使用的 X25519 曲线 (蒙哥马利曲线)
网友评论