密码学:设计一个安全的(没有中间人攻击)的Diffie-Hellman密钥交换协议

设计一个安全的(没有中间人攻击)的Diffie-Hellman密钥交换协议

DH算法描述

DH密钥交换算法是为了使两个用户能够安全地交换密钥的密钥交换协议。

假定Alice和Bob期望在一个不安全的网络中协商一个共同的密钥,那么进行如下步骤:

  • 双方约定大素数$q$和它的一个本原根$g$, 其中$g<q$。
  • Alice随机产生一个数(私钥) $a$,$a < q$,并计算公钥$Y_A = g^a \bmod q$, 发送给Bob。
  • Bob随机产生一个数(私钥) $b$,$b<q$, 并计算公钥$Y_B= g^b \bmod q$,发送给Alice。
  • 此时, Alice手握Bob发过来的公钥$Y_B$,结合自己产生私钥a计算会话密钥:$$K = Y_B^a \bmod q = (g^b \bmod q)^a \bmod q = g^{ab} \bmod q$$
  • Bob也拿到了Alice发来的公钥$Y_A$,同时结合自己的私钥b,计算会话密钥:$$K = Y_A^b \bmod q = (g^a \bmod q)^b \bmod q = g^{ab} \bmod q$$

这样Alice和Bob都得到了相同的会话密钥K,即通过DH算法完成了密钥交换。

DH协议的安全性依赖于离散对数的安全性,其假定它假定当q足够大时,通过公共值$g^a \bmod q$和$g^b \bmod q$无法计算出共享的secret key,即$K = g^{ab} \bmod q$。

DH算法的中间人攻击漏洞描述

D-H的密钥交换容易被中间人攻击。其攻击思路如下:

  • Alice 发送公钥$Y_A$给Bob, 中间人EVE截取该值,并选择了一个自己的私钥$c$,计算出自己的公钥$Y_C = g ^ c \bmod q$然后发送自己的公钥给Bob
  • Bob向Alice传递自己的公钥$Y_B$时,也被中间人EVE截获该值,EVE代替Bob发送它自己的公共值$Y_C$给Alice
  • 此时,Alice收到中间人EVE的公钥,Alice和EVE计算出会话密钥$K_1 = g^{ac} \bmod q$, Bob也收到中间人发送的公钥,Bob和EVE计算出会话密钥$K_2 = g^{bc} \bmod q$
  • Alice和Bob都以为是和对方协商好了会话密钥,于是双方互相发送数据,Alice用$K_1$加密数据之后发送给Bob,EVE截获该数据,用$K_1$解密,即可查看Alice发送给Bob的数据,Eve还可对其进行修改,然后用$K_2$加密发送给Bob,这时Bob收到的消息已经被中间人Eve窥探甚至篡改,但Bob对此毫不知情。

这就是中间人攻击的原理。

DH算法的防止中间人攻击的方法—–签名认证

DH算法易被攻击的原因

D-H之所以容易被中间人攻击,是因为key在交换时并不对其参与者进行认证。可能的解决办法是使用数字签名,以及使用其它的协议变种。

DH + 签名认证方案的具体描述

A与B都提供自己的公钥/密钥对和公钥的证书,A根据一些消息来计算一个签名,其中包括公共值$g^a mod q$,B也做类似的运算。即使C仍然能够截取A与B之间的信息,但他并不能在没有A和B的密钥的情况下伪造签名,因此,这个增强的协议抵挡了中间人攻击。

具体实现为以下步骤:

会话开始前准备工作:

  1. 首先通信双方在交换协议前每一方都有一个用于签名的非对称密钥对,这个用来做签名认证,密钥对的公钥需要在会话开始前共享,即会话前,Alice的签名非对称密钥对$(P_A, S_A)$, 其中公钥$P_A$全局公开,Bob的签名非对称密钥对$(P_B, S_B)$,其中公钥$P_B$全局公开
  2. 双方约定大素数$q$和它的一个本原根$\alpha$, 其中$\alpha<q$,这些步骤在会话开始前共享能够降低会话完成的复杂性。

会话过程(注意:如果其中某一个步骤未完成,则整个协议交换过程停止):

  1. Alice随机产生一个数(私钥) $x$,$x < q$,并计算公钥$Y_A = \alpha^x \bmod q$, 发送给Bob。
  2. Bob随机产生一个数(私钥) $y$,$y<q$, 并计算公钥$Y_B= \alpha^y \bmod q$
  3. Bob 会话密钥:$$K = Y_A^y \bmod q = (\alpha^x \bmod q)^y \bmod q = \alpha^{xy} \bmod q$$
  4. Bob计算$(\alpha^y, \alpha^x)$的hash, 然后使用非对称私钥$S_B$对该hash进行签名,然后使用会话密钥K对该签名进行加密,Bob将加密后的签名$E_K(S_B(\alpha_y, \alpha^x))$及公钥$\alpha^y$发送给Alice
  5. 此时, Alice手握Bob发过来的公钥$Y_B$,结合自己的私钥x计算会话密钥:$$K = Y_B^x \bmod q = (\alpha^y \bmod q)^x \bmod q = \alpha^{xy} \bmod q$$
  6. Alice使用会话密钥K解密签名消息,再用Bob的签名公钥$P_B$验证Bob的签名。
  7. Alice计算$(\alpha^x, \alpha^y)$的hash, 然后使用非对称私钥$S_A$对该hash进行签名,然后使用会话密钥K对该签名进行加密,Alice将加密后的签名$E_K(S_A(\alpha_x, \alpha^y))$发送给Bob。
  8. Bob利用会话密钥和Alice的公钥$P_A$解密并验证Alice的签名

以上所有步骤顺利完成之后Alice与Bob相互认证,并且拥有了共享密钥,K,密钥K可由于加密进一步的通信,该算法的过程如下图所示

签名认证的DH算法

DH + 签名认证防中间人攻击的原理描述

没有中间人攻击时的密钥交换过程

1
2
3
Alice -> ax                 -> Bob
Alice <- ay, EK(SB(ay, ax)) <- Bob
Alice -> EK(SA(ax, ay)) -> Bob

假设有一个中间人Eve从中截获消息并篡改消息

1
2
Alice -> ax                  -> Eve -> ab                  -> Bob
Alice <- aa, EK1(SB(ay, ab)) <- Eve <- ay, EK2(SB(ay, ab)) <- Bob

由上述描述可以发现,若中间人Eve想完成攻击,会在算法第4步,Bob将公钥$\alpha^y$和加密后的签名发给Alice时,中间人Eve截获,虽然Eve可以解密并得到hash串,但是由于Eve没有Bob的用于签名的私钥$A_B$,因此,Eve无法伪造出一条Bob的签名,那么第5步Alice收到消息后会发现签名验证失败,继而发现协议交换过程不安全,然后停止密钥交换过程,那么Eve的攻击就此失败,由此可见,签名认证的确可以有效防止中间人攻击。

参考文献

  1. 李必涛,徐赐文,王晓菲,贾杰,郭远,郑辉. 一种能够抵抗主动攻击的改进Diffie-Hellman密钥协商方案[J]. 中央民族大学学报(自然科学版),2008,(04):54-57.
  2. 徐恒,陈恭亮,杨福祥. 密钥交换中中间人攻击的防范[J]. 信息安全与通信保密,2009,(02):90-92.
  3. Diffie–Hellman key exchange. (2017, March 22). In Wikipedia, The Free Encyclopedia. Retrieved June 2, 2017, from https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange
  4. Station-to-Station protocol. (2017, March 28). In Wikipedia, The Free Encyclopedia. Retrieved
    15:50, June 6, 2017
    , from https://en.wikipedia.org/wiki/Station-to-Station_protocol
  5. Blakewilson, S., & Menezes, A. (1999). Unknown Key-Share Attacks on the Station-to-Station (STS) Protocol. International Workshop on Practice and Theory in Public Key Cryptography (Vol.1560, pp.154-170). Springer-Verlag.
  6. Diffie, W., Oorschot, P. C. V., & Wiener, M. J. (1992). Authentication and authenticated key exchanges. Designs, Codes and Cryptography, 2(2), 107-125.
打赏