概述

DH算法是非对称加密算法的鼻祖,为非对称加密算法奠定了基础,主要用途是进行密钥交换确保共享的密钥能够安全穿越不安全的网络。该算法其背后有对应数学理论做支撑,简单来讲就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内无法快速有效的求解(computationally infeasible )。

这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个对称密钥进行加密和解密。但是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。之所以如此,主要还是由于对称加密和非对称加密算法的特性决定的。

1. 对称加密算法和非对称加密算法

非对称加密算法

两者区别

数学基础

question:找了很多资料对原本根和原根的区别,还是很含糊!有大神的话,希望能教教我,感谢啦!

算法流程及原理

假设Alice需要与Bob协商一个秘钥(秘钥本质上就是一个比特序列,从计算的角度看就是一个大数)。

  1. 首先Alice与Bob共享一个素数 \(p\) 以及该素数 \(p\) 的本原根 \(g\) (generator),且 \(2\le g\le p-1\)。这两个数可以不经过加密的由一方发送到另一方,至于谁发送给谁并不重要,只要保证双方都能知道 \(p\)\(g\) 即可。
Diffie-Hellman密钥协商算法-LMLPHP
  1. 而后Alice产生一个私有的随机数 \(A\),满足 \(1\le A\le p-1\),然后计算 \(g^Amod\ p=Y_a\),将结果 \(Y_a\) 通过公网发送给Bob; 与此同时,Bob也产生一个私有的随机数 \(B\),满足 \(1\le B\le p-1\),计算 \(g^Bmod\ p=Y_b\),再将结果 \(Y_b\) 通过公网发送给Alice。
Diffie-Hellman密钥协商算法-LMLPHP
  1. 此时Alice知道的信息有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中数字 \(A\) 是Alice私有的,只有她自己知道,其他的信息都是别人可能知道的;同样Bob知道的信息有\(p\),\(g\),\(A\),\(Y_a\),\(Y_b\),其中数字 \(B\) 是Bob私有的,只有自己知道。

    到目前为止,Alice和Bob之间的密钥协商结束。

    Alice通过计算 \(K_a=\left( Y_b \right) ^A\ mod\ p\) 得到密钥 \(K_a\),同样的,Bob通过计算 \(K_b=\left( Y_a \right) ^B\ mod\ p\) 得到密钥 \(K_b\),可以证明,必然满足 \(K_a=K_b\)。由此,Alice和Bob得到了相同的密钥,达成了密钥协商的目的。

  2. 如果存在一个窃听者Eve,他能否破解密钥呢?很显然Eve能够窃听到 \(p\),\(g\),\(Y_a\),\(Y_b\),所以问题转变了,Eve能否根据这些信息计算出 \(K_a\)\(K_b\) ?要计算 \(K_a\)\(K_b\) 需要知道A和B。

安全性问题

那DH密钥协商算法是否就一定安全呢?我们所熟知的,存在一种伪装者攻击(中间人攻击)能够对这种密钥协商算法造成威胁。

假设密钥协商过程中,在Alice和Bob有一个称为Alan的主动攻击者,他能够截获Alice和Bob的消息并伪造假消息,考虑以下情况。

  1. Alice和Bob已经共享一个素数 \(p\) 以及其该素数 \(p\) 的本原根 \(g\),当然Alan也监听到报文得知了这个两个消息。
  2. 此时Alice计算 \(g^Amod\ p=Y_a\) ,然而将 \(Y_a\) 发送给Bob的过程中被Alan拦截了,Alan自己选定了一个随机数 \(C\), 计算 \(Y_c=g^C\ mod\ p\), 然后将 \(Y_c\) 发送给Bob。
Diffie-Hellman密钥协商算法-LMLPHP
  1. 同时Bob计算 \(g^Bmod\ p=Y_b\),同样在将 \(Y_b\) 发送给Alice的过程中被Alan拦截下来,Alan自己选定了一个随机数D ,计算 \(g^Dmod\ p=Y_d\) 发送给了Alice
Diffie-Hellman密钥协商算法-LMLPHP
  1. 由于Alice和Bob通讯的消息被替换,Alice计算出来的密钥实际上为Alice和Alan之间协商的密钥:\(K_{ad}=g^{D\times A}\ mod\ p\);Bob计算出来的密钥实际上是Blob和Alan之间协商的密钥:\(K_{bc}=g^{C\times B}\ mod\ p\) 。如果之后Alice和Bob用他们各自计算出来的密钥加密任何信息,Alan截获之后都能够解密得到明文,而Alan也能够伪装成Alice或者Bob给双方发消息,而不至于被发现。

代码为java实现。

参考

https://www.cnblogs.com/qcblog/p/9016704.html

https://www.cnblogs.com/wushaopei/p/11979200.html

https://blog.csdn.net/l18339702017/article/details/81625257

https://www.jiamisoft.com/blog/24603-dcfdcjm.html

06-04 07:36