DH 密钥交换和 ECDH
转 http://blog.csdn.net/sudochen/article/details/9164427
下面我们以 Alice 和 Bob 为例叙述 Diffie-Hellman 密钥交换的原理。
1,Diffie-Hellman 交换过程中涉及到的所有参与者定义一个组,在这个组中定义一个大质数 p,底数 g。
2,Diffie-Hellman 密钥交换是一个两部分的过程,Alice 和 Bob 都需要一个私有的数字 a,b。
下面是 DH 交换的过程图:
](http://blog.duantianhen.com/wp-content/uploads/2019/05/201905280740028.jpg)
本图片来自 wiki
下面我们进行一个实例
1.爱丽丝与鲍伯协定使用 p=23 以及 g=5.
2.爱丽丝选择一个秘密整数 a=6, 计算 A = g^a mod p 并发送给鲍伯。
A = 5^6 mod 23 = 8.
3.鲍伯选择一个秘密整数 b=15, 计算 B = g^b mod p 并发送给爱丽丝。
B = 5^15 mod 23 = 19.
4.爱丽丝计算 s = B a mod p
19^6 mod 23 = 2.
5.鲍伯计算 s = A b mod p
8^15 mod 23 = 2.
ECDH 密钥交换:
ECDH:
ECC 算法和 DH 结合使用,用于密钥磋商,这个密钥交换算法称为 ECDH。交换双方可以在不共享任何秘密的情况下协商出一个密钥。ECC 是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点 P,一个整数 k,求解 Q=kP 很容易;给定一个点 P、Q,知道 Q=kP,求整数 k 确是一个难题。ECDH 即建立在此数学难题之上。密钥磋商过程:
假设密钥交换双方为 Alice、Bob,其有共享曲线参数(椭圆曲线 E、阶 N、基点 G)。
1) Alice 生成随机整数 a,计算 A=a*G。 #生成 Alice 公钥
2) Bob 生成随机整数 b,计算 B=b*G。 #生产 Bob 公钥
3) Alice 将 A 传递给 Bob。A 的传递可以公开,即攻击者可以获取 A。
由于椭圆曲线的离散对数问题是难题,所以攻击者不可以通过 A、G 计算出 a。
4) Bob 将 B 传递给 Alice。同理,B 的传递可以公开。
5) Bob 收到 Alice 传递的 A,计算 Q =b*A #Bob 通过自己的私钥和 Alice 的公钥得到对称密钥 Q
6) Alice 收到 Bob 传递的 B,计算 Q`=a*B #Alice 通过自己的私钥和 Bob 的公钥得到对称密钥 Q’
Alice、Bob 双方即得 Q=bA=b(aG)=(ba)G=(ab)G=a(bG)=aB=Q’ (交换律和结合律),即双方得到一致的密钥 Q。
目前 Openssl 里面的 ECC 算法的套件支持是 ECDSA/ECDH。在国密的 SSL 套件中,可以使用 ECDSA/ECC(密钥加密传输),ECDSA/ECDH(密钥磋商)两种套件