Diffie-Hellman密钥交换协议

1976年,Diffie和Hellman在其题为《密码学的新方向》的论文中首次给出了公钥密码学的定义,并提出了Diffie-Hellman密钥交换算法。该算法解决了对称密码体制中的密钥分发问题,使得通信双方可以通过公开信道安全地交换共享密钥。其安全性建立在离散对数问题的困难性之上。

Diffie-Hellman密钥交换

Diffie-Hellman密钥交换协议_第1张图片

Alice与Bob使用Diffie-Hellman密钥交换的步骤如下:

  • 选取公开的大素数 p p p和它的一个生成元 g g g 2 ≤ g ≤ p − 2 2{\leq}g{\leq}p-2 2gp2
  • Alice选择随机数 a a a 1 ≤ a ≤ p − 2 1{\leq}a{\leq}p-2 1ap2,并计算 α = 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 1bp2,并计算 β = 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密钥交换将可能受到中间人攻击。
Diffie-Hellman密钥交换协议_第2张图片

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),,gp2(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=p1
  • 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,,m1} j ∈ { 0 , 1 , ⋯   , m − 1 } j\in\{0,1,\cdots,m-1\} j{0,1,,m1}。则 α = 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=αgim(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,,m1,分别计算并记录 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,,m1,计算 α g − i m ( m o d   p ) {\alpha}g^{-im}(mod\,p) αgim(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,,pn1}为因子基中素数的集合。
  • 计算离散对数 l o g g p i log_gp_i loggpi i = 0 , 1 , ⋯   , n − 1 i=0,1,\cdots,n-1 i=0,1,,n1
  • 随机选择 k ∈ { 0 , 1 , 2 , ⋯   , p − 2 } k\in\{0,1,2,\cdots,p-2\} k{0,1,2,,p2},计算 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=p0d0p1d1p2d2pn1dn1(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++dn1loggpn1k(mod(p1))

该算法为求解一般的离散对数问题提供了最有效的方法。它的计算量是亚指数级的。

参考文献

[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.

你可能感兴趣的:(密码算法学习)