5.Diffie-Hellman密钥交换
Diffie-Hellman密钥交换
DH密钥交换由Ralph C. Merkle、Bailey Whitfield Diffie 和 Martin Edward Hellman 在1976年提出,早于1977年RSA加密算法出现(真的吗?)。也许有人很好奇我为什么先讲“后”出现的RSA,然后再讲DH。
公钥加密的起源
在讲经典的DH密钥交换之前,我想让更多人知道公钥加密算法创建之初时鲜为人知的故事。
首先是一个在1997年被GCHQ公开的曾经写于1973年的内部机密文件:
可以看出这其实就是RSA加密算法,中间虽然一直是关于两个素数的同余式,用中国剩余定理转换成一个式子就是我们现在更常见的RSA表示形式。(见WikiPedia关于RSA的描述)
还有一个现已公开但是来自1974年GCHQ的文件:
这个文件中提到的算法就是稍后要讲的DH密钥交换,只不过当时D.和H.都还没有发现。
也就是说,现在大家知道的DH密钥交换和RSA算法在没有被这些密码学家发现前就已经诞生了。只不过一直被GCHQ保密。
算法简介
其实对于RSA来说,最大的缺点就是数据规模过于庞大,运算起来远远不如对称加密,一种比较好的构想是通过非对称算法来加密对称算法的密钥,此后双方通过秘密传输过的密钥进行对称加密,此即密钥交换。今天介绍的DH算法就是专门进行密钥交换的。
交换过程
以Alice和Bob二人的秘密通讯为例。
- 二人选定一个素数
,和模 乘法群的生成元 ,这两个参数可以被所有人知道 - Alice选取一个随机数
,计算 发给Bob - Bob选取一个随机数
,计算 发送给Alice - Alice计算
,Bob计算 ,这两个数应该相等,即为他们的公共密钥
证明比较简单,交换的密钥
对于攻击者而言,必须知道
抽象推广
上面介绍的算法是“整数模p乘法群”中进行的,我们也可以把这里的思想推广到其他的群中。
- 二人选定一个有限循环群
和一个生成元 ,阶记为 ,这些参数可以被所有人知道 - Alice选取一个随机数
,计算 (乘法群),或者 (加法群) - Bob选取一个随机数
,计算 (乘法群),或者 (加法群) - Alice计算
(或 ),Bob计算 (或 ),这两个数应该相等,即为他们的公共密钥
只要在群里计算离散对数很难,那么这样的密钥交换就很有安全性。
离散对数
接下来我们来谈谈离散对数,常见计算离散对数的算法有BSGS(北上广深大步小步)算法和Pollard
比较可惜的是,并非所有的离散对数问题都是难解的。比如当阶
比如:
这里
因为
这几个模数互素,用中国剩余定理就可以解出
这个例子是Pohlig-Hellman算法的一种情况,将一个大规模离散对数问题分解成若干个小离散对数问题。
再比如……选择的群不大恰当,比如
在圆锥曲线

将这个群的定义改成在一个有限域
真的是这样吗?
一个坏消息是,这样定义的群
点
将DH密钥交换放到双曲线群里,就是
小结
DH密钥交换算法基于离散对数问题,这么一种非对称的思想为公钥加密的应用奠基,向三位学者在数学领域为和平的贡献致谢。