DH密钥交换算法

算法描述

DH 是 Diffie-Hellman的首字母缩写,是Whitefield与Martin Hellman在1976年提出了一个的密钥交换协议。该算法的唯一目的是使得两个用户能够安全地交换密钥,得到一个共享的安全密钥,算法本身不能用于加解密。

算法的安全性基于求离散对数的困难性。

图表示DH密钥交换过程,其中p是大素数,a是p的本原根,p和a作为公开的全程元素。用户A选择一个保密的随机整数XA,并将YA=a^XA mod p 发送给用户B,类似地,用户B选择一个保密的随机整数XB,并将YB=a^XB mod p 发送给用户A,然后A和B分别由K=YB^XA mod p和K=YA^XB mod p 计算出的就是共享密钥,这是因为

 (YB)^ XA mod = (a^XB modp)^ XA mod p = (a^XB)^ XA mod p = (a^XA) ^XB mod p    =(a^XA modp)^ XB mod p= (YA) ^XB mod p

 

由于XA和XB是保密的,而第三方只有pa、YB、YA可以利用,想要得到K,则必须得到XA,XB中的一个,只有通过取离散对数来确定密钥,但对于大的素数p,计算离散对数是十分困难的。

例子:

假如用户Alice和用户Bob希望交换一个密钥。

取一个素数p =97和97的一个原根a=5。

Alice和Bob分别选择秘密密钥XA=36和XB=58,并计算各自的公开密钥:

YA=a^XA mod p=5^36 mod 97=50

YB=a^XB mod p=5^58 mod 97=44

Alice和Bob交换了公开密钥之后,计算共享密钥如下:

Alice:K=(YB) ^XA mod p=44^36 mod 97=75

Bob:K=(YA) ^XB mod p=50^58 mod 97=75 

安全性

当然,为了使这个例子变得安全,必须使用非常大的XA, XB 以及p, 否则可以实验所有的可能取值。(总共有最多97个这样的值, 就算XA和XB很大也无济于事)。
如果 p 是一个至少 300 位的质数,并且XA和XB至少有100位长, 那么即使使用全人类所有的计算资源和当今最好的算法也不可能从a, p和a^(XA*XB) mod p 中计算出 XA*XB。
这个问题就是著名的离散对数问题。注意g则不需要很大, 并且在一般的实践中通常是2或者5。
在最初的描述中,迪菲-赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务,因此它很容易受到中间人攻击
一个中间人在信道的中央进行两次迪菲-赫尔曼密钥交换,一次和Alice另一次和Bob,就能够成功的向Alice假装自己是Bob,反之亦然。
而攻击者可以解密(读取和存储)任何一个人的信息并重新加密信息,然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。
有很多种安全身份验证解决方案使用到了迪菲-赫尔曼密钥交换。例如当Alice和Bob共有一个公钥基础设施时,他们可以将他们的返回密钥进行签名。

posted @ 2021-11-07 17:33  xleeje  阅读(1104)  评论(0编辑  收藏  举报