1976年,Diffie和Hellman在其题为《密码学的新方向》的论文中首次给出了公钥密码学的定义,并提出了Diffie-Hellman密钥交换算法。该算法解决了对称密码体制中的密钥分发问题,使得通信双方可以通过公开信道安全地交换共享密钥。其安全性建立在离散对数问题的困难性之上。
Diffie-Hellman密钥交换
Alice与Bob使用Diffie-Hellman密钥交换的步骤如下:
- 选取公开的大素数 p p p和它的一个生成元 g g g, 2 ≤ g ≤ p − 2 2{\leq}g{\leq}p-2 2≤g≤p−2。
- Alice选择随机数 a a a, 1 ≤ a ≤ p − 2 1{\leq}a{\leq}p-2 1≤a≤p−2,并计算 α = g a ( m o d   p ) \alpha=g^a(mod\,p) α=ga(modp)通过公开信道发送给Bob。 a a a是私密的,即只有Alice知道 a a a。
- Bob选择随机数 b b b, 1 ≤ b ≤ p − 2 1{\leq}b{\leq}p-2 1≤b≤p−2,并计算 β = g b ( m o d   p ) \beta=g^b(mod\,p) β=gb(modp)通过公开信道发送给Alice。 b b b是私密的,即只有Bob知道 b b b。
- Alice收到 β \beta β后计算 β a ( m o d   p ) = ( g b ) a ( m o d   p ) = g b a ( m o d   p ) \beta^a(mod\,p)=(g^b)^a(mod\,p)=g^{ba}(mod\,p) βa(modp)=(gb)a(modp)=gba(modp)。
- Bob收到 α \alpha α后计算 α b ( m o d   p ) = ( g a ) b ( m o d   p ) = g a b ( m o d   p ) \alpha^b(mod\,p)=(g^a)^b(mod\,p)=g^{ab}(mod\,p) αb(modp)=(ga)b(modp)=gab(modp)。
现在,Alice与Bob共享了密钥 K A B = g a b ( m o d   p ) K_{AB}=g^{ab}(mod\,p) KAB=gab(modp)。当Trudy拦截到 α \alpha α和 β \beta β,他想要计算出共享密钥 K A B K_{AB} KAB,就必须知道 a a a或 b b b,即根据 g a ( m o d   p ) g^a(mod\,p) ga(modp)计算出 a a a,或根据 g b ( m o d   p ) g^b(mod\,p) gb(modp)计算出 b b b。因此,D-H密钥交换协议的安全性依赖于离散对数问题的计算复杂度。事实上,给定 y , g , p y,g,p y,g,p,对于一般的 x x x,没有已知的有效算法求解 y = g x ( m o d   p ) y=g^x(mod\,p) y=gx(modp)。
中间人攻击
如果在密钥交换过程中没有验证参与者的身份,则Diffie-Hellman密钥交换将可能受到中间人攻击。
Alice和Bob进行密钥交换时,第三方Trudy进行中间人攻击的步骤如下:
- Trudy选择随机数 t t t,计算 γ = g t ( m o d   p ) \gamma=g^t(mod\,p) γ=gt(modp)。
- Trudy拦截 α \alpha α和 β \beta β,把 γ \gamma γ发送给Alice和Bob。
- Trudy计算 K A T = α t ( m o d   p ) = g a t ( m o d   p ) K_{AT}=\alpha^t(mod\,p)=g^{at}(mod\,p) KAT=αt(modp)=gat(modp)和 K B T = β t ( m o d   p ) = g b t ( m o d   p ) K_{BT}=\beta^t(mod\,p)=g^{bt}(mod\,p) KBT=βt(modp)=gbt(modp)。
- Alice计算 K A T = γ a ( m o d   p ) = g t a ( m o d   p ) K_{AT}=\gamma^a(mod\,p)=g^{ta}(mod\,p) KAT=γa(modp)=gta(modp)。
- Bob计算 K B T = γ b ( m o d   p ) = g t b ( m o d   p ) K_{BT}=\gamma^b(mod\,p)=g^{tb}(mod\,p) KBT=γb(modp)=gtb(modp)。
现在,Alice和Bob以为他们共享了密钥,但事实上是Alice与Trudy共享了密钥
K
A
T
K_{AT}
KAT,Bob与Trudy共享了密钥
K
B
T
K_{BT}
KBT。后续当Alice给Bob发送消息时,会用
K
A
T
K_{AT}
KAT进行加密。Trudy拦截下该消息,用
K
A
T
K_{AT}
KAT解密后可以查看或篡改消息,再用
K
B
T
K_{BT}
KBT加密后发送给Bob。Bob收到消息后用
K
B
T
K_{BT}
KBT解密查看消息,但他并不知道消息已经被Trudy查看或篡改。
想要避免中间人攻击只需对通信双方进行身份认证,比如在密钥交换时对密钥进行数字签名。Trudy无法伪造Alice和Bob的签名,因此无法进行中间人攻击。
离散对数算法
Diffie-Hellman密钥交换依赖于离散对数问题,因此如果能够求解离散对数,那么就可以破解D-H密钥交换协议。
假设Trudy拦截到
α
=
g
a
(
m
o
d
 
p
)
\alpha=g^a(mod\,p)
α=ga(modp),并已知
g
g
g和
p
p
p。下面给出三种求解
a
a
a的方法。
穷举搜索算法
- 计算 g 1 ( m o d   p ) , g 2 ( m o d   p ) , g 3 ( m o d   p ) , ⋯   , g p − 2 ( m o d   p ) g^1(mod\,p),g^2(mod\,p),g^3(mod\,p),\cdots,g^{p-2}(mod\,p) g1(modp),g2(modp),g3(modp),⋯,gp−2(modp)直至找到满足 g a ( m o d   p ) = α g^a(mod\,p)=\alpha ga(modp)=α的 a a a。
该算法中,乘法的期望次数约为 p / 2 p/2 p/2。
小步大步算法
- 计算 m = ┌ p − 1 ┐ m=\ulcorner\sqrt{p-1}\urcorner m=┌p−1┐。
- 令 a = i m + j a=im+j a=im+j, i ∈ { 0 , 1 , ⋯   , m − 1 } i\in\{0,1,\cdots,m-1\} i∈{0,1,⋯,m−1}, j ∈ { 0 , 1 , ⋯   , m − 1 } j\in\{0,1,\cdots,m-1\} j∈{0,1,⋯,m−1}。则 α = g i m + j ( m o d   p ) \alpha=g^{im+j}(mod\,p) α=gim+j(modp),即 g j = α g − i m ( m o d   p ) g^j={\alpha}g^{-im}(mod\,p) gj=αg−im(modp)。
- 建立一个条目为 j j j和 g j g^j gj的表,取 j j j为 0 , 1 , 2 , ⋯   , m − 1 0,1,2,\cdots,m-1 0,1,2,⋯,m−1,分别计算并记录 g j ( m o d   p ) g^j(mod\,p) gj(modp)值。(小步)
- 取 i i i为 0 , 1 , 2 , ⋯   , m − 1 0,1,2,\cdots,m-1 0,1,2,⋯,m−1,计算 α g − i m ( m o d   p ) {\alpha}g^{-im}(mod\,p) αg−im(modp)直到查找到表中有与该值相同的 g j ( m o d   p ) g^j(mod\,p) gj(modp)值,记录此时的 i i i和 j j j。(大步)
- 计算 a = i m + j a=im+j a=im+j。
该算法中约需 1.5 p 1.5\sqrt{p} 1.5p次乘法, p \sqrt{p} p的存储空间。假设存储要求是可行的,该方案相对于穷搜法有显著提升,但仍然是指数级的工作量。
指数积分算法
- 令 { p 0 , p 1 , ⋯   , p n − 1 } \{p_0,p_1,\cdots,p_{n-1}\} {p0,p1,⋯,pn−1}为因子基中素数的集合。
- 计算离散对数 l o g g p i log_gp_i loggpi, i = 0 , 1 , ⋯   , n − 1 i=0,1,\cdots,n-1 i=0,1,⋯,n−1。
- 随机选择 k ∈ { 0 , 1 , 2 , ⋯   , p − 2 } k\in\{0,1,2,\cdots,p-2\} k∈{0,1,2,⋯,p−2},计算 y = α g k ( m o d   p ) y={\alpha}g^k(mod\,p) y=αgk(modp),直到找到可以进行因子基分解的 y = α g k = p 0 d 0 p 1 d 1 p 2 d 2 ⋯ p n − 1 d n − 1 ( m o d   p ) y={\alpha}g^k=p_0^{d_0}p_1^{d_1}p_2^{d_2}{\cdots}p_{n-1}^{d_{n-1}}(mod\,p) y=αgk=p0d0p1d1p2d2⋯pn−1dn−1(modp)。
- 对上述等式取对数并化简后得 a = d 0 l o g g p 0 + d 1 l o g g p 1 + ⋯ + d n − 1 l o g g p n − 1 − k ( m o d   ( p − 1 ) ) a=d_0log_gp_0+d_1log_gp_1+\cdots+d_{n-1}log_gp_{n-1}-k(mod\,(p-1)) a=d0loggp0+d1loggp1+⋯+dn−1loggpn−1−k(mod(p−1))。
该算法为求解一般的离散对数问题提供了最有效的方法。它的计算量是亚指数级的。
参考文献
[1]. Diffie W, Hellman M. New directions in cryptography[J]. IEEE transactions on Information Theory, 1976, 22(6):644-654.
[2]. Stamp Mark, Low Richard (2007). Applied Cryptanalysis: Breaking Ciphers in the Real World. John Wiley & Sons. 289-301+353-356.