一 什么是 DH 密钥交换
DH 密钥交换是 1976 年由 Diffie 和 Hellman 共同发明的一种算法。使用这种算法,通信双方仅通过交换一些可以公开的信息就能够生成出共享的密码数字,而这一密码数字就可以被用作对称密码的密钥。IPsec 中就使用了经过改良的 DH 密钥交换。
虽然这种方法的名字叫“密钥交换”,但实际上双方并没有真正交换密钥,而是通过计算生成出一个相同的共享密钥。因此,这种方法也称 DH 密钥协商。
二 DH 密钥交换的步骤
现在假设 Alice 和 Bob 需要共享一个对称密码的密钥,然而双方之间的通信线路已经被窃听者窃听。这时,Alice 和 Bob 可以通过下面的方法进行 DH 密钥交换,从而生成共享密钥。
1 Alice 向 Bob 发送两个质数 P 和 G
P 必须是一个非常大的质数,而 G 则是一个和 P 相关的数,称为生成元。G 可以是一个较小的数字。
P 和 G 不需要保密,被窃听者获取了也没关系。
此外,P 和 G 可以由 Alice 和 Bob 中的任意一方生成。
2 Alice 生成一个随机数 A
A 是一个 1~P- 2 之间的整数。这个数是一个只有 Alice 知道的秘密数字,没有必要告诉 Bob,也不能让窃听者知道。
3 Bob 生成一个随机数 B
B 是一个 1~P- 2 之间的整数。这个数是一个只有 Bob 知道的秘密数字,没有必要高数 Alice,也不能让窃听者知道。
4 Alice 将 G 的 A 次方 mod P 这个数发送给 Bob
这个数让窃听者知道也没关系。
5 Bob 将 G 的 B 次方 mod P 这个数发送给 Alice
这个数让窃听者知道也没关系。
6 Alice 用 Bob 发过来的数计算 A 次方并求 mod P
这个数就是共享密钥。
上面将 mod P 的“G 的 B 次方的 A 次方”改写成了“G 的 A * B 次方”
7 Bob 用 Alice 发过来的数计算 B 次方并求 mod P
上面将 mod P 的“G 的 A 次方的 B 次方”改写成了“G 的 A * B 次方”
于是 Alice 和 Bob 就计算出相等的共享密钥了。