带你读《2022技术人的百宝黑皮书》——HTTPS的原理浅析与本地开发实践(7)https://developer.aliyun.com/article/1340623?groupCode=taobaotech
基于DH的秘钥协商(依靠秘钥交换算法) 客户端先连上服务端;
服务端生成一个随机数 s 作为自己的私钥,然后根据算法参数计算出公钥 S(算法参数通常是固定的); 服务端使用某种签名算法把“算法参数(模数P,基数G)和服务端公钥S”作为一个整体进行签名;
服务端把“算法参数(模数P,基数G)、服务端公钥S、签名”发送给客户端; 客户端收到后验证签名是否有效;
客户端生成一个随机数 c 作为自己的私钥,然后根据算法参数计算出公钥 C; 客户端把 C 发送给服务端;
客户端和服务端(根据上述 DH 算法)各自计算出 K 作为会话密钥;
DH协商秘钥协商算法计算性能不佳,因为协商过程中双方都需要做大量的乘法运算,为了提升 DHE算法的性能, 所以就出现了现在广泛用于密钥交换算法 —— ECDHE算法。
基于ECDHE的秘钥协商
ECDHE 算法是在 DHE 算法的基础上利用了 ECC 椭圆曲线特性,可以用更少的计算量计算出公钥,以及最终的会话密钥。
小红和小明使用 ECDHE 密钥交换算法的过程:
- 双方事先确定好使用的椭圆曲线类型以及曲线上的基点 G,这两个参数都是公开的,一般采用密码学中比较著名的椭圆曲线函数,例如本次会话用到的Curve25519曲线;
- 双方各自随机生成一个随机数作为私钥d,并与基点 G相乘得到公钥Q(Q = dG),此时小红的公私钥为 Q1 和d1,小明的公私钥为 Q2 和 d2;
- 双方交换各自的公钥Q1和Q2;
- 通过椭圆曲线特性计算得到相同的x坐标作为协商秘钥K,过程如下: 小红计算点
小明计算点
基于椭圆曲线的特性 d1Q2 = d1d2G = d2d1G = d2Q1 ,因此双方的 x 坐标 是相等的,所以它是共享密钥, 也就是会话密钥。(详细的数学原理 :https://www.cnblogs.com/kalafinaian/p/7392505.html)
这个过程中,双方的私钥都是随机、临时生成的,都是不公开的,即使根据公开的信息(椭圆曲线、公钥、基点G)也是很难计算出椭圆曲线上的离散对数(私钥)。
第三步:Server Hello done,S端已经完成向C端的消息发送;
带你读《2022技术人的百宝黑皮书》——HTTPS的原理浅析与本地开发实践(9)https://developer.aliyun.com/article/1340621?groupCode=taobaotech