Diffie-Hellman密钥协商算法

2020年11月22日 阅读数:6
这篇文章主要向大家介绍Diffie-Hellman密钥协商算法,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

概述

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

这个机制的巧妙在于须要安全通讯的双方能够用这个方法肯定对称密钥。而后能够用这个对称密钥进行加密和解密。可是注意,这个密钥交换协议/算法只能用于密钥的交换,而不能进行消息的加密和解密。之因此如此,主要仍是因为对称加密和非对称加密算法的特性决定的。java

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

对称加密算法git

双方使用的同一个密钥,既能够加密又能够解密,这种加密方法称为对称加密,也称为单密钥加密。github

优势:速度快,对称性加密一般在消息发送方须要加密大量数据时使用,算法公开、计算量小、加密速度快、加密效率高。算法

缺点:在数据传送前,发送方和接收方必须商定好秘钥,而后 使双方都能保存好秘钥。其次若是一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都须要使用其余人不知道的惟一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。安全

在对称加密算法中经常使用的算法有:DES、AES等。网络

AES:密钥的长度能够为12八、192和256位,也就是16个字节、24个字节和32个字节。函数

DES:密钥的长度64位,8个字节。ui

非对称加密算法加密

一对密钥由公钥和私钥组成(可使用不少对密钥)。私钥解密公钥加密数据,公钥解密私钥加密数据(私钥公钥能够互相加密解密)。私钥只能由一方保管,不能外泄。公钥能够交给任何请求方。

优势:安全。

缺点:速度较慢。

在非对称加密算法中经常使用的算法有: DH,RSA等。

二者区别

  • 算法复杂度:对称密钥<非对称密钥
  • 加解密速度:对称密钥>非对称密钥
  • 安全性:对称密钥<非对称密钥

对称加密算法相比非对称加密算法来讲,加解密的效率要高得多。可是缺陷在于对于秘钥的管理上,以及在非安全信道中通信时,密钥交换的安全性不能保障。因此在实际的网络环境中,会将二者混合使用。所以 ,在https中(TLS\SSL)握手阶段使用非对称加密进行对称密钥的协商,然后在后续正常的数据传输时,都会使用对称加密算法进行加密传输。

数学基础

本原根:若是使得 \(a^{m}\equiv 1\ \left( mod\ n \right)\) 成立的最小正幂 \(m\) 知足 $m=\varphi \left( n \right) $ ,则称 \(a\)\(n\) 的本原根。 其中 \(\varphi \left( n \right)\)欧拉函数

性质:若 \(a\) 为模 \(n\) 的本原根,则 \(a\)\(a\) 的平方,\(a\) 的3次方,……,\(a\)\(\varphi \left( n \right)\) 次m方 模 \(n\) 的余数互不相同,并且构成一个模n的简化剩余系

栗子(原根):设 \(n=7\),则 \(\varphi \left( 7 \right) =7\times \left( 1-\frac{1}{7} \right) =6\)

  • \(n=2\) 时,咱们须要找到一个 \(m\), 使得 \(2^m\%7=1\),且恰好 \(m==\varphi \left( 7 \right)\),首先咱们能找到当 \(m=3\) 时,\(2^3\%7=1\),可是却不等于 \(\varphi \left( 7 \right)\),所以不知足。
  • \(n=3\)时,类比上面一点,能够发现 \(m=6\) 时,两点都能知足。所以 \(3\)\(7\) 的一个原根。

question:找了不少资料对本来根和原根的区别,仍是很含糊!有大神的话,但愿能教教我,感谢啦!

算法流程及原理

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

  1. 首先Alice与Bob共享一个素数 \(p\) 以及该素数 \(p\) 的本原根 \(g\) (generator),且 \(2\le g\le p-1\)。这两个数能够不通过加密的由一方发送到另外一方,至于谁发送给谁并不重要,只要保证双方都能知道 \(p\)\(g\) 便可。
image-20200602134459964
  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。
image-20200602172919933
  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获得了相同的密钥,达成了密钥协商的目的。

    证实:\(K_a=K_b\)

    对于Alice有:

    \(K_a=\left( Y_b \right) ^Amod\ p=\left( g^Bmod\ p \right) ^A\ mod\ p=g^{B\times A}\ mod\ p\)

    对于Bob有:

    \(K_b=\left( Y_a \right) ^Bmod\ p=\left( g^Amod\ p \right) ^B\ mod\ p=g^{A\times B}\ mod\ p\)

    上面的运算过程,可根据取模运算的性质可得【a ^ b % p = ((a % p)^b) % p】,由上可得,Alice和Bob生成的密钥实际上是进行相同的运算过程,所以必然有 \(K_a=K_b\)

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

    以计算A为例,Eve能根据 \(p\),\(g\),\(Y_a\) 经过 \(g^Amod\ p=Y_a\) 计算出 \(A\) 吗? 目前所知的最佳算法Pollard's rho algorithm for logarithms 时间复杂度是 \(O\left( \sqrt{p} \right)\), 可是实际应用中的 \(p\) 为二进制,假设这个 \(p\) 的长度为 \(n\), 这个复杂度其实是 $O\left( 2^{\frac{n}{2}} \right) $,这个一个指数级的复杂度,是很是高的。所以求解该问题在计算上的困难程度保证了DH算法的安全性。

安全性问题

那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。
image-20200602211537321
  1. 同时Bob计算 \(g^Bmod\ p=Y_b\),一样在将 \(Y_b\) 发送给Alice的过程当中被Alan拦截下来,Alan本身选定了一个随机数D ,计算 \(g^Dmod\ p=Y_d\) 发送给了Alice
image-20200602212249824
  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