Diffie-Hellman密钥交换算法
<p>这个密钥交换技术的目的是在于使双方安全的交换共享密钥以便后面的报文加密。
<code>DH</code>算法依赖计算离散对数的难度。
首先定义一个素数p的原根,为其各次幂产生从1到p-1的所有整数根,也就是说若g是p的原根,那么
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/a9f6ccacdf43a1fe77efc17b3042f17d?showdoc=.jpg" alt="" />
是各不相同的整数,对于一个整数b和素数p的一个原根,可以找打唯一的指数i使得
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/6b2f4f59c01653ffcb9ab9625f4c467c?showdoc=.jpg" alt="" />
指数i称为b的已g为基数的模p的离散对数或指数。</p>
<h3>DH算法的原理</h3>
<p>有两个公开参数素数p和整数g,g是p的原根。
服务端的私钥和公钥分别为a和A,客户端的私钥和公钥是b和B;
服务端根据a,p,g计算出公钥A并将g,p,A传给客户端,客户端计算自己的公钥B以及共享密钥K,客户端将B明文发给服务端,服务端可以计算出共享密钥。
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/3cf1800ff36b65614b70c24cf6cee879?showdoc=.jpg" alt="" />
根据上述流程,客户端于服务端之间明文传输的是g、p、A、B,然后双方就可以得到一个同样的共享密钥K,并以K对后续要传输的数据进行对称加密、解密即可。</p>
<p>由于计算K需要一方的私钥和另一方的公钥,所以理论上,只要双方的私钥a、b不被第三方知道,这个共享密钥K就是安全可用的。</p>
<p><strong><code>DH</code>算法具有两个吸引力的特征</strong>:</p>
<ul>
<li>仅当需要时才生成密钥,减小了将密钥存储很长一段时间而致使遭受攻击的机会;</li>
<li>除对全局参数的约定外,密钥交换不需要事先存在的基础结构;</li>
</ul>
<p><strong>然而,该技术也存在许多不足</strong>:</p>
<ul>
<li>没有提供双方身份的任何信息;</li>
<li>计算密集性,因此容易遭受阻塞性攻击,即对手请求大量的密钥。受攻击者花费了相对多的计算资源来求解无用的幂系数而不是在做真正的工作;</li>
<li>没办法防止重演攻击;</li>
<li>容易遭受中间人的攻击。第三方C在和A通信时扮演B;和B通信时扮演A。A和B都与C协商了一个密钥,然后C就可以监听和传递通信量。中间人的攻击按如下进行:
<ul>
<li>B在给A的报文中发送他的公开密钥YB。</li>
<li>C截获并解析该报文。C将B的公钥保存下来并给A发送报文,该报文具有B的用户ID但使用C的公钥YC,但仍按照好像是来自B的样子被发送出去。A收到C的报文后,将YC和B的用户ID存储在一块。类似地,C使用YC向B发送好像来自A的报文。</li>
<li>B基于私钥XB和YC计算共享密钥K1,A基于私钥XA和YC计算共享密钥K2,C使用私钥XC和YB计算K1,并使用XC和YA计算K2。</li>
<li>从现在开始,C就可以转发A发给B的报文或转发B发给A的报文,在途中根据需要修改它们的密文。使- 得A和B都不知道他们在和C共享通信。</li>
</ul></li>
</ul>
<h3>Oakley算法</h3>
<p>它是对Diffie-Hellman密钥交换算法的优化,它保留了后者的优点,同时克服了其弱点。</p>
<p>Oakley算法具有五个重要特征:</p>
<ul>
<li>
<p>它采用称为cookie程序的机制来对抗阻塞攻击。</p>
</li>
<li>
<p>它使得双方能够协商一个全局参数集合。</p>
</li>
<li>
<p>它使用了现时来保证抵抗重演攻击。</p>
</li>
<li>
<p>它能够交换Diffie-Hellman公开密钥。</p>
</li>
<li>它对Diffie-Hellman交换进行鉴别以对抗中间人的攻击。</li>
</ul>
<p>Oakley可以使用三个不同的鉴别方法:</p>
<ul>
<li>
<p>数字签名:通过签署一个相互可以获得的散列代码来对交换进行鉴别;每一方都使用自己的私钥对散列代码加密。散列代码是在一些重要参数上生成的,如用户ID和现时。</p>
</li>
<li>
<p>公开密钥加密:通过使用发送者的私钥对诸如ID和现时等参数进行加密来鉴别交换。</p>
</li>
<li>对称密钥加密:通过使用某种共享密钥对交换参数进行对称加密,实现交换的鉴别。</li>
</ul>
<h3>ECDH算法</h3>
<p><img src="https://www.showdoc.com.cn/server/api/attachment/visitfile/sign/a5128dcd6bbda3d4f64f24b29891ceab?showdoc=.jpg" alt="" />
Curve25519的构建使得它避免了许多潜在的实施陷阱。[5]通过设计,它免受定时攻击,它接受任何32字节的字符串作为有效的公钥,不需要验证。</p>