1. ECDHE加密算法的简单数学原理:
ECDHE = ephemeral Elliptic Cure Diffie-Hellman,“短暂-椭圆曲线-迪菲-赫尔曼” 算法。
对于公式:
A = G ^ a % P
B = G ^ b % P
其中,G为底数,P为模数,a为对数,A为真数。
当已知a时,可以推算出A;反之,当已知A时,却几乎无法推算出a。
这就形成了一个“单向函数”。
映射到加密算法中,a为私钥,A为公钥。
并且由于幂运算的交换性,两个表达式的计算结果相等:
B ^ a % P = A ^ b % P
2. ECDHE为什么比RSA更适合做密钥交换?
TLS握手的核心目的在于密钥交换,服务器与客户端“协商”得出主密钥(所谓“协商”就是互相交换几个随机数,你说一个数,我说一个数,最后根据大家的数计算出一个结果)。
不论RSA还是ECDHE,最终计算主密钥的公式都是相同的:
client random + server random + pre-master = master secret
前两个随机数完全明文,保密的关键在于 pre-master
。
在RSA中,pre-master 是单纯的由客户端生成,通过服务器的公钥加密后发给服务器,服务器使用私钥解密拿到 pre-master。
一旦服务器的私钥被破解,主密钥就会被攻击者算出,并且会导致过往的主密钥泄漏(RSA不具备“向前安全性”)。
在ECDHE中,服务器生成一个 “椭圆曲线的公钥” Server Params
,对应公式中的A,使用私钥加密后将其发送给客户端;
客户端也生成一个“椭圆曲线的公钥” Client Params
,对应公式中的B,使用服务器的公钥加密后发给服务器;
而私钥 a 和 b 由服务器和客户端分别保管。
随后客户端与服务器分别在本地计算 pre-master:
在客户端上: A ^ b % P = Server Params ^ b % P = pre-master
在服务器上: B ^ a % P = Client Params ^ a % P = pre-master
由此可见,在ECDHE中,即使破解了服务器的私钥,拿到的也只是客户端发送的 Client Params
,没有椭圆曲线的私钥a和b,就无法计算出 pre-master。
就算攻击者的算力强大,能够进一步破解出椭圆曲线的私钥,但每次密钥协商时服务器与客户端都是使用椭圆曲线随机生成私钥的,因此ECDHE算法具备了 “向前安全性”。
总而言之,想要破解对称加密过程中的密钥:
(1)对于RSA算法需要破解一次私钥(服务器的私钥);
(2)对于ECDHE算法需要破解两次私钥(服务器私钥 + 椭圆曲线私钥),且椭圆曲线私钥每次握手都会随机生成,保证了向前安全性。
3. 使用ECDHE加密算法的TLS握手流程图:
流程图:
消息流程:
1. client hello
2. server hello
3. certificate
4. server key exchange --- server params
5. server hello done
6. client key exchange --- client params
7. change cipher spec --- master secret
8. encrypted handshake message(finished)
9. change cipher spec --- master secret
10. encrypted handshake message(finished)
4. wireshark抓包分析使用ECDHE的TLS握手流程:
TLS四次握手的整体流程:
4.1 TLS第一次握手:
客户端发送 Client Hello
消息,跟服务器打招呼,其中主要携带:
客户端的TLS版本号(Version)、
客户端支持的加密套件列表(Cipher Suites)、
客户端生成的随机数(Client Random)
4.2 TLS第二次握手:
4.2.1 Server Hello :
服务器收到客户端的 Client Hello
消息后,回复 Server Hello
消息,其中主要包括:
服务器确认支持客户端的TLS版本(Version)、
服务器从客户端发来的加密套件中选出一个最合适的加密组合(Cipher Suite)、
服务器生成的随机数(Server Random)
4.2.2 Certificate :
随后,服务器为了证明身份,会给客户端发送数字证书,即 Certificate
消息:
(其中包括CA机构为服务器颁发的公钥、CA机构签名等信息)
4.2.3 Server Key Exchange :
接下来的这一步非常关键,这是ECDHE算法与RSA算法的不同之处,服务器会在发送证书后,再发送 Server Key Exchange
消息给客户端,其中带有 椭圆曲线公钥 Server Params
,用来实现密钥交换(密钥协商),再加上自己的私钥签名认证(签名算法为RSA)。
4.2.4 Server Hello Done :
最后,服务器发送 Server Hello Done
消息给客户端,通知客户端所有消息已经发送完毕。
4.3 TLS第三次握手:
4.3.1 Client Key Exchange :
客户端收到服务器的 Certificate
消息后,使用操作系统内置的CA机构的公钥对证书解密,如果解密成功,得到 数据原文 及 摘要值 H1,然后客户端使用与CA机构相同的摘要算法(散列算法,SHA或MD5)对数据原文进行计算得到 摘要值 H2,比较 H1 与 H2,若完全相同则说明证书合法且未被其他人篡改,从而拿到服务器的RSA公钥。
随后,客户端将自身的椭圆曲线公钥(Pubkey)使用服务器RSA公钥加密后,通过 Client Key Exchange
消息发给服务器:
4.3.2 Change Cipher Spec :
客户端 首先根据 服务器的椭圆曲线公钥Server Params
及自身的椭圆曲线私钥计算出第三个随机数 Pre-Master
,然后再使用 Client Random
、Server Random
、Pre-Master
这三个随机数计算出 主密钥 Master Secret
,并使用 Change Cipher Spec
消息将主密钥使用服务器的RSA私钥加密后发给服务器,通知服务器开始使用对称加密的方式进行通信。
客户端计算:
step 1 : Sever Params ^ 客户端椭圆曲线私钥 % P = pre-master
step 2 : client random + server random + pre-master = master secret
4.3.3 Encrypted Handshake Message :
最后,客户端发送 Encrypted Handshake Message
消息,使用主密钥Master Secret
将之前的握手消息加密后发给服务器,一来验证新生成的对称密钥是否正确,二来让服务器验证之前的握手数据是否被篡改过。
4.4 TLS第四次握手:
4.4.1 Change Cipher Spec :
服务器收到客户端的 Client Key Exchange
消息后,使用私钥解密得到客户端的椭圆曲线公钥 Client Params
,至此服务器也可以计算出pre-master:
服务器计算:
step 1 : Client Params ^ 服务器椭圆曲线私钥 % P = pre-master
step 2 : client random + server random + pre-master = master secret
4.4.2 Encrypted Handshake Message :
服务使用上一步中生成的主密钥 Master Secret
对之前的握手数据进行对称加密,然后通过 Encrypted Handshake Message
消息发送给客户端进行验证。
5. 其他:
通过前面对ECDHE算法的简单分析可以看到,这类非对称加密算法的数学计算是非常复杂的,测试结果显示:
RSA的运算速度是非常慢的,2048位的加密强度大约是 15 KB/s,而 AES128 则是 13 MB/s,差了几百倍。
这也是为什么非对称加密只用于密钥交换阶段,后续的HTTPS加密数据传输都采用对称加密算法的原因之一。
参考内容: