一、概述
Diffie-Hellman密钥协商算法主要解决秘钥配送问题,本身并非用来加密用的;该算法其背后有对应数学理论做支撑,简单来讲就是构造一个复杂的计算难题,使得对该问题的求解在现实的时间内无法快速有效的求解(computationally infeasible )。
理解Diffie-Hellman密钥协商的原理并不困难,只需要一点数论方面的知识既可以理解,主要会用到简单的模算术运算、本原根、费马小定理、离散对数等基础数论的知识。在现代密码学中的基础数论知识梳理中已经对这些知识做了必要的总结。
二、从何而来
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)来解决,这就是单向认证的问题。另外作者还讨论了这些密码学问题之间的关联性以及如何相互转化。比如一个安全的密码系统(可以防御明文攻击)可以用来生成一个的单向函数、公钥加密系统可以用来作为单向认证、陷门密码系统可以用来生成一个公钥加密系统。数学难题的计算复杂度被当成一种保障密码学安全问题的有效工具被利用起来,这一重要思想贯穿现代密码学的许多加密算法。
三、算法流程及原理
按照惯例,以Alice和Bob这两个密码学中的网红为角色,述阐DH算法的流程。
假设Alice需要与Bob协商一个秘钥(秘钥本质上就是一个比特序列,从计算的角度看就是一个大数)。
1)首先Alice与Bob共享一个素数p以及该素数p的本原根g(geneator),当然这里有2⩽g⩽p−1。这两个数是可以不经过加密地由一方发送到另一方,至于谁发送给并不重要,其结果只要保证双方都得知p和g即可。
2)然后Alice产生一个私有的随机数A,满足1⩽A⩽p−1,然后计算gAmodp=Ya,将结果Ya通过公网发送给Bob;与此同时,Bob也产生一个私有的随机数B,满足1⩽B⩽p−1,计算gBmodp=Yb,将结果Yb通过公网发送给Alice。
3)此时Alice知道的信息有p,g,A,Ya,其中数字A是Alice私有的,只有她自己知道,别人不可能知道,其他三个信息都是别人有可能知道的;Bob知道的信息有p,g,B,Yb,其中数字B是Bob私有的,只有他自己知道,别人不可能知道,其他都是别人有可能知道的。
到目前为止,Alice和Bob之间的秘钥协商结束。
Alice通过计算Ka=(Yb)Amodp得到秘钥Ka,同理,Bob通过计算Kb=(Ya)Bmodp得到秘钥Kb,此时可以证明,必然满足Ka=Kb。因此双方经过协商后得到了相同的秘钥,达成秘钥协商的目的。
证明:
对于Alice有:
Ka=(Yb)Amodp=(gBmodp)Amodp=gB×Amodp
对于Bob有:
Kb=(Ya)Bmodp=(gAmodp)Bmodp=gA×Bmodp
可见,Alice和Bob生成秘钥时其实是进行相同的运算过程,因此必然有Ka=Kb。"相同的运算过程"是双方能够进行秘钥协商的本质原因,类似的利用椭圆曲线进行秘钥协商也是与之相同的原理。
更严密地考虑,A和B不应该选择p−1,也就是说只能在集合{1,2,3,...,p−2}中选择。这是因为如果选择p−1,那么由费马小定理可知,情况就退化成了gp−1≡1(modp)的情况,对秘钥协商的机密性构成威胁。
所以总结起来,整个流程串起来大概就是这样:
那么窃听者Eve能否破解秘钥呢?首先要知道Eve能够得知哪些信息,显然Eve能够窃听到的信息只能有p,g,Ya,Yb,现在的问题是Eve能够通过以上信息计算出Ka或者Kb吗?要计算Ka或者Kb需要知道A或者B。
以计算A为例,Eve能根据条件gAmodp=Ya计算出A吗?实际上当p是大质数的时候,这是相当困难的,这就是离散对数问题。实际上在论文发表的当时,计算该问题的最有效的算法的时间复杂度大约是O(p–√)。也正是求解该问题在计算上的困难程度保证了DH算法的安全性。如果能够找到对数时间复杂度的算法,那么该算法即容易被攻破。
四、一个实例
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,计算Ya=315mod17=14348907mod17=6,将6发送给Bob;同时Bob也选定一个私有的数字,假设B=13,计算Ya=313mod17=1594323mod17=12,将12发送给Alice。
3)Alice计算秘钥Ka=1215mod17=2147483647mod17=8,Bob计算秘钥Kb=613mod17=2147483647mod17=8。双方经过协商后,8最终成为双方的协商的秘钥。
实际上,当指数和模数的位数都比较大的时候,存在一种快速计算幂取模的算法叫做“反复平方算法”,实现取来也比较简单,在算法导论中第三十一章有相应的解释。
五、存在的问题
是否DH秘钥协商算法就一定安全呢?应该说也不是,因为存在一种伪装者攻击(或者称为中间人攻击)能够对这种秘钥协商算法构成威胁。
假设秘钥协商过程中,在Alice和Bob中间有一个称为Mallory的主动攻击者,他能够截获Alice和Bob的消息并伪造假消息,考虑如下情况。
1)Alice和Bob已经共享一个素数p及其该素数p的本原根g,当然Mallory监听到报文也得知了这两个消息。
2)此时Alice计算Ya=gAmodp,然而在将Ya发送给Bob的过程中被Mallory拦截,Mallory自己选定一个随机数S,计算Ysb=gSmodp,然后将Ysb发送给了Bob。
3)同时Bob计算Yb=gBmodp,然而在将Yb发送给Alice的过程中被Mallory拦截,Mallory自己选定一个随机数T,计算Yta=gTmodp,然后将Yta发送给了Alice。
由于通讯消息被替换,Alice计算出的秘钥实际上是Alice和Mallory之间协商秘钥:Kam=gA×Tmodp;Bob计算出的秘钥实际上是Bob与Mallory之间协商的秘钥:Kbm=gB×Smodp。如果之后Alice和Bob用他们计算出的秘钥加密任何信息,Mallory截获之后都能够解密得到明文,而且Mallory完全可以伪装成Alice或者Bob给对方发消息。
https://www.cnblogs.com/qcblog/p/9016704.html