Diffie-Hellman 密钥交换原理

在使用对称加密中,有一些无法避免的问题:

  • 密钥如何从加密方传递给解密方。窃听者如果可以劫获密文,那么也可能劫获密钥.
  • 如果窃听者破解了密钥,加密方如何将新的密钥安全地交给解密方

DH 密钥交换

解决上述问题的一种方法就是 DH 密钥交换 技术 。

DH 密钥交换全称为 Diffie-Hellman 密钥交换 ,是1976年由 Whitfiedl Diffle 和 Martin Hellman 共同发明的一种算法。使用这种方法,通信双方可以在窃听者眼皮子底下来安全地传输密码。

DH 交换的步骤如下:

  1. E 向 D 发送两个数 G,PG,P , PP 是一个非常大的质数,GG 是一个与 PP 相关的数,称为 生成元(generator) (这个概念在会后面讲到). GGPP 不需要保密 。(其实这两个数也可以由 D 来生成)
  2. E 生成随机数 AA AA 是一个介于 1P21 \dots P-2 之间的数,这个数是只有 E 知道的私密数字
  3. D 生成随机数 BB 同样,BB 也介于 1P21 \dots P-2, 且这个数只能由 D 知道
  4. E 将 RA=GAmodPRA = G^A \mod P 发送给 D RARA 是可以公开的
  5. D 将 RB=GBmodPRB = G^B \mod P 发送给 E 同样, RBRB 可以公开
  6. E 计算共享密钥 KA=(GBmodP)AmodP=GB×AmodPKA = (G^B \mod P)^A \mod P = G^{B\times A} \mod P
  7. D 计算共享密钥 KB= (GAmodP)BmodP=GA×BmodPKB = (G^A \mod P)^B \mod P = G^{A\times B} \mod P

由此可以得出 KA==KBKA == KB

DH交换的安全性

在上述步骤中,窃听者可以得到的信息有4 个: P,G,GAmodP,GBmodPP, G, G^A\mod P, G^B\mod P . 由这 4 个数字计算出 GA×BmodPG^{A\times B} \mod P 是非常困难的。要计算  GA×BmodPG^{A\times B} \mod P  ,则要算出 ABA \text{和} B 。如果知道 GAG^A 算出 AA 并不难,而根据 GAmodPG^A \mod P 算出 AA 则是不可能的(当 PP 足够大时,至少在现在不可能)。 由 GAmodPG^A \mod P 计算 AA  的问题称为 有限域上的离散对数问题, 其复杂度即是 DH 密钥交换的基础。

生成元

生成元是 数论 中的概念。如果整数 g,pg,p 满足 gcd(g,p)=1\text{gcd}(g,p)=1 (即 g,pg,p 互质), 那么根据欧拉定理, gx1modpg^x \equiv 1 \mod p 必然存在正整数解。若 nn 为所有解中的最小正整数,那么称 nngmodpg \mod p 的阶,记作 ordpg=n\text{ord}_p g = n  。 对于整数 pp, 存在正整数 gg 满足 ordpg=φ(p)\text{ord}_p g = \varphi(p), 则称 ggpp 的一个原根 ,也可以称 ggpp 的一个生成元。
对于 群 (S,)\mathbb(S,\oplus) , 存在 g,aS,ga生成集合T,S=Tg,a \in \mathbb{S}, \text{且} g \oplus a \text{生成集合} \mathbb{T}, \mathbb{S} = \mathbb{T} , 那么 gg,即是 (S,)\mathbb(S,\oplus) 的生成元。结合此文,S\mathbb{S} 即为与 PP 互质的有限域,即 {p1PP1}\{p | 1 \leqslant P \leqslant P-1\}, \oplus 即为 modP\mod P.

实践

  1. E 选择质数 P=13P =13, 生成元 G=2G = 2 ,并发送给 D
  2. E 生成随机数 A . 假如 A = 9
  3. D 生成随机数 B, 假如 B = 7
  4. E 发送RA 给 D, RA = 29mod13=52^9 \mod 13 = 5
  5. D 发送RB 给 E, RB = 27mod13=112^7 \mod 13 = 11
  6. E 算出 KA, KA = RBAmodP=119mod13=8RB^{A} \mod P = 11^9 \mod 13 = 8
  7. D 算出 KB, KB = RABmodP=57mod13=8RA^{B}\mod P = 5^7 \mod 13 = 8

通过上述步骤,E 和 D 都生成了共享密钥 8.