Diffie-Hellman密钥协商算法

1、概述

Diffie-Hellman密钥协商算法主要解决秘钥配送问题,自己并不是用来加密用的;该算法其背后有对应数学理论作支撑,简单来说就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内没法快速有效的求解(computationally infeasible )。html

理解Diffie-Hellman密钥协商的原理并不困难,只须要一点数论方面的知识既能够理解,主要会用到简单的模算术运算、本原根、费马小定理、离散对数等基础数论的知识。在现代密码学中的基础数论知识梳理中已经对这些知识作了必要的总结。git

 2、从何而来

DH密钥协商算法在1976年在Whitfield Diffie和Martin Hellman两人合著的论文New Directions in Cryptography(Section Ⅲ PUBLIC KEY CRYPTOGRAPHY)中被做为一种公开秘钥分发系统(public key distribution system)被提出来。原文的叙述过程比较简单,但基本阐述了算法的原理以及其可行性。算法

在该论文中实际上提出了一些在当时颇有创新性的思想。原论文重点讨论两个话题:安全

(1)在公网通道上如何进行安全的秘钥分派。网络

(2)认证(能够细分为消息认证和用户认证)。函数

为了解决第一个问题,原文提出两种方法:公钥加密系统(public key cryptosystem)和秘钥分发系统(public key distribution system)。对于公钥加密系统,原文只是勾画了一种比较抽象的公钥加密系统的概念模型,重点是加解密采用不一样的秘钥,并总结了该系统应该知足的一些特性,至关因而一种思想实验,并无给出具体的算法实现途径,但这在当时应该来讲已经足够吸引人。后来RSA三人组(Ron Rivest、Adi Shamir 和 Leonard Adleman)受此启发,通过许多轮失败的尝试后,于第二年在论文A Method for Obtaining Digital Signatures and Public-Key Cryptosystems中提出了切实可行且很具体的公钥加密算法--RSA公钥加密算法。而对于秘钥分发系统,就是本文的DH秘钥协商算法。
工具

为了解决第二个问题,原文经过单向函数(one-way function)来解决,这就是单向认证的问题。另外做者还讨论了这些密码学问题之间的关联性以及如何相互转化。好比一个安全的密码系统(能够防护明文攻击)能够用来生成一个的单向函数、公钥加密系统能够用来做为单向认证、陷门密码系统能够用来生成一个公钥加密系统。数学难题的计算复杂度被当成一种保障密码学安全问题的有效工具被利用起来,这一重要思想贯穿现代密码学的许多加密算法。ui

3、算法流程及原理

按照惯例,以Alice和Bob这两个密码学中的网红为角色,述阐DH算法的流程。编码

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

1)首先Alice与Bob共享一个素数$p$以及该素数$p$的本原根$g$(geneator),固然这里有$2\leqslant g\leqslant p-1$。这两个数是能够不通过加密地由一方发送到另外一方,至于谁发送给并不重要,其结果只要保证双方都得知$p$和$g$便可。

2)而后Alice产生一个私有的随机数$A$,知足$1 \leqslant A\leqslant p-1$,而后计算$g^{A}\;mod\;p=Y_{a}$,将结果$Y_{a}$经过公网发送给Bob;与此同时,Bob也产生一个私有的随机数$B$,知足$1 \leqslant B\leqslant p-1$,计算$g^{B}\;mod\;p=Y_{b}$,将结果$Y_{b}$经过公网发送给Alice。

3)此时Alice知道的信息有$p,g,A,Y_{a}$,其中数字$A$是Alice私有的,只有她本身知道,别人不可能知道,其余三个信息都是别人有可能知道的;Bob知道的信息有$p,g,B,Y_{b}$,其中数字$B$是Bob私有的,只有他本身知道,别人不可能知道,其余都是别人有可能知道的。

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

Alice经过计算$K_{a}=(Y_{b})^A\;mod\;p$获得秘钥$K_{a}$,同理,Bob经过计算$K_{b}=(Y_{a})^B\;mod\;p$获得秘钥$K_{b}$,此时能够证实,必然知足$K_{a}=K_{b}$。所以双方通过协商后获得了相同的秘钥,达成秘钥协商的目的。

 证实:

对于Alice有:

$K_{a}=(Y_{b})^A\;mod\;p=(g^B\;mod\;p)^{A}\;mod\;p=g^{B\times A}\;mod\;p$

对于Bob有:

$K_{b}=(Y_{a})^B\;mod\;p=(g^{A}\;mod\;p)^{B}\;mod\;p=g^{A\times B}\;mod\;p$

可见,Alice和Bob生成秘钥时实际上是进行相同的运算过程,所以必然有$K_{a}=K_{b}$。"相同的运算过程"是双方可以进行秘钥协商的本质缘由,相似的利用椭圆曲线进行秘钥协商也是与之相同的原理。

更严密地考虑,$A$和$B$不该该选择$p-1$,也就是说只能在集合$\left \{ 1,2,3,...,p-2 \right \}$中选择。这是由于若是选择$p-1$,那么由费马小定理可知,状况就退化成了$g^{p-1}\equiv1\;(mod\;p)$的状况,对秘钥协商的机密性构成威胁。

因此总结起来,整个流程串起来大概就是这样:

那么窃听者Eve可否破解秘钥呢?首先要知道Eve可以得知哪些信息,显然Eve可以窃听到的信息只能有$p,g,Y_{a},Y_{b}$,如今的问题是Eve可以经过以上信息计算出$K_{a}$或者$K_{b}$吗?要计算$K_{a}$或者$K_{b}$须要知道$A$或者$B$。

以计算$A$为例,Eve能根据条件$g^{A}\;mod\;p=Y_{a}$计算出$A$吗?实际上当$p$是大质数的时候,这是至关困难的,这就是离散对数问题。实际上在论文发表的当时,计算该问题的最有效的算法的时间复杂度大约是$O(\sqrt{p})$。也正是求解该问题在计算上的困难程度保证了DH算法的安全性。若是可以找到对数时间复杂度的算法,那么该算法即容易被攻破。

4、一个实例

1)假设Alice和Bob共享的$p$和$g$分别是$p=17,g=3$,显然这里$g=3$是$p=17$的一个本原根,实际上$3,5,6,7,10,11,12,14$都是17的本原根。

2)而后Alice选定一个私有数字,假设$A=15$,计算$Y_{a}=3^{15}\;mod\;17=14348907\;mod\;17=6$,将6发送给Bob;同时Bob也选定一个私有的数字,假设$B=13$,计算$Y_{a}=3^{13}\;mod\;17=1594323\;mod\;17=12$,将12发送给Alice。

3)Alice计算秘钥$K_{a}=12^{15}\;mod\;17=2147483647\;mod\;17=8$,Bob计算秘钥$K_{b}=6^{13}\;mod\;17=2147483647\;mod\;17=8$。双方通过协商后,8最终成为双方的协商的秘钥。

实际上,当指数和模数的位数都比较大的时候,存在一种快速计算幂取模的算法叫作“反复平方算法”,实现取来也比较简单,在算法导论中第三十一章有相应的解释。

5、存在的问题

 是否DH秘钥协商算法就必定安全呢?应该说也不是,由于存在一种假装者攻击(或者称为中间人攻击)可以对这种秘钥协商算法构成威胁。

假设秘钥协商过程当中,在Alice和Bob中间有一个称为Mallory的主动攻击者,他可以截获Alice和Bob的消息并伪造假消息,考虑以下状况。

1)Alice和Bob已经共享一个素数$p$及其该素数$p$的本原根$g$,固然Mallory监听到报文也得知了这两个消息。

2)此时Alice计算$Y_{a}=g^{A}\;mod\;p$,然而在将$Y_{a}$发送给Bob的过程当中被Mallory拦截,Mallory本身选定一个随机数$S$,计算$Y_{sb}=g^{S}\;mod\;p$,而后将$Y_{sb}$发送给了Bob。

3)同时Bob计算$Y_{b}=g^{B}\;mod\;p$,然而在将$Y_{b}$发送给Alice的过程当中被Mallory拦截,Mallory本身选定一个随机数$T$,计算$Y_{ta}=g^{T}\;mod\;p$,而后将$Y_{ta}$发送给了Alice。

因为通信消息被替换,Alice计算出的秘钥其实是Alice和Mallory之间协商秘钥:$K_{am}=g^{A \times T}\;mod\;p$;Bob计算出的秘钥其实是Bob与Mallory之间协商的秘钥:$K_{bm}=g^{B \times S}\;mod\;p$。若是以后Alice和Bob用他们计算出的秘钥加密任何信息,Mallory截获以后都可以解密获得明文,并且Mallory彻底能够假装成Alice或者Bob给对方发消息。

6、References

一、New Directions in Cryptography

二、密码编码学与网络安全原理与实践

三、图解密码技术

转载请注明原文出处:http://www.cnblogs.com/qcblog/p/9016704.html

相关文章
相关标签/搜索