迪菲-赫尔曼密钥交换

迪菲-赫尔曼密钥交换（Diffie–Hellman key exchange，缩写为D-H） 是一种安全协议。它可以让双方在完全没有对方任何预先信息的条件下通过不安全信道建立起一个密钥。这个密钥可以在后续的通讯中作为对称密钥来加密通讯内容。公钥交换的概念最早由瑞夫·墨克（Ralph C. Merkle）提出，而这个密钥交换方法，由惠特菲尔德·迪菲（Bailey Whitfield Diffie）和马丁·赫尔曼（Martin Edward Hellman）在1976年首次发表。马丁·赫尔曼曾主张这个密钥交换方法，应被称为迪菲-赫尔曼-墨克密钥交换（Diffie–Hellman–Merkle key exchange）。
迪菲－赫尔曼密钥交换的同义词包括:
虽然迪菲－赫尔曼密钥交换本身是一个匿名（无认证）的密钥交换协议，它却是很多认证协议的基础。
该协议的历史.
迪菲－赫尔曼密钥交换是在美国密码学家惠特菲尔德·迪菲和马丁·赫尔曼的合作下发明的，发表于1976年。它是第一个实用的在非保护信道中建立共享密钥方法。它受到了瑞夫·墨克的关于公钥分配工作的影响。（John Gill）提出了离散对数问题的应用。该方案首先被英国GCHQ的（Malcolm J. Williamson）在稍早的几年前发明，但是GCHQ直到1997年才决定将其公开，这时在学术界已经没有了研究这个算法的热潮了。
这个方法被发明后不久出现了RSA，另一个进行公钥交换的算法。它使用了非对称加密算法。
2002年，马丁·赫尔曼写到：
这个系统...从此被称为「迪菲－赫尔曼密钥交换」。 虽然这个系统首先是在我和迪菲的一篇论文中描述的，但是这却是一个公钥交换系统，是墨克提出的概念，因此如果加上他的名字，这个系统实际上应该称为「Diffie–Hellman–Merkle密钥交换」。我希望这个小小的讲坛可以帮助我们认识到墨克对公钥密码学的同等重要的贡献。
The system...has since become known as Diffie–Hellman key exchange. While that system was first described in a paper by Diffie and me, it is a public key distribution system, a concept developed by Merkle, and hence should be called 'Diffie–Hellman–Merkle key exchange' if names are to be associated with it. I hope this small pulpit might help in that endeavor to recognize Merkle's equal contribution to the invention of public key cryptography. [https://web.archive.org/web/20050118031258/http://www.comsoc.org/livepubs/ci1/public/anniv/pdfs/hellman.pdf]
描述了这个算法的，已经于1997年4月29日后过期，专利文件表明了Hellman、Diffie和Merkle是算法的发明者。
描述.
迪菲－赫尔曼通过公共信道交换一个信息，就可以建立一个可以用于在公共信道上安全通信的共享秘密。
以下解释它的过程（包括算法的数学部分）：
最简单，最早提出的这个协议使用一个质数"p"的整数模n乘法群以及其原根"g"。下面展示这个算法，绿色表示非秘密信息，红色粗体表示秘密信息：
爱丽丝和鲍伯最终都得到了同样的值，因为在模"p"下formula_1和formula_2 相等。 注意"a", "b" 和 "gab = gba" mod "p" 是秘密的。 其他所有的值 – "p", "g", "ga mod p", 以及 "gb mod p" – 都可以在公共信道上传递。 一旦爱丽丝和鲍伯得出了公共秘密，他们就可以把它用作对称密钥，以进行双方的加密通讯，因为这个密钥只有他们才能得到。当然，为了使这个例子变得安全，必须使用非常大的"a", "b" 以及 "p"， 否则可以实验所有formula_3的可能取值（总共有最多22个这样的值，就算"a"和"b"很大也无济于事）。 如果 "p" 是一个至少 300 位的质数，并且"a"和"b"至少有100位长，那么即使使用全人类所有的计算资源和当今最好的算法也不可能从"g", "p"和"ga" mod "p" 中计算出 "a"。这个问题就是著名的离散对数问题。注意"g"则不需要很大，并且在一般的实践中通常是2或者5。IETF RFC3526 文档中有几个常用的大质数可供使用。
以下是一个更为一般的描述:
爱丽丝和鲍伯就同时协商出群元素formula_1，它可以被用作共享秘密。formula_9和formula_10因为群是乘法交换的。 (见幂.)
图示.
下面的图示可以方便你理解每个信息都只有谁知道。（伊芙是一个窃听者——她可以看到爱丽丝和鲍伯的通讯内容，但是无法改变它们）
注意：对爱丽丝来说解开鲍伯的私钥或鲍伯要解开爱丽丝的私钥应该都很困难。如果对爱丽丝来说解开鲍伯的私钥不难的话（反之亦然），伊芙可以轻易地替换掉她自己的私钥/公钥对，把鲍伯的公钥插到她自己的私钥，产生出一个假的共享密钥，并解开鲍伯的私钥（然后用这个解开共享私钥。伊芙可以试著选择一个能让她轻松解开鲍伯的私钥的公钥/私钥对）。
安全性.
在选择了合适的"G"和"g"时，这个协议被认为是窃听安全的。偷听者伊芙可能必须通过求解迪菲－赫尔曼问题来得到"g""ab"。在当前，这被认为是一个困难问题。如果出现了一个高效的解决离散对数问题的算法，那么可以用它来简化"a"或者"b"的计算，那么也就可以用来解决迪菲－赫尔曼问题，使得包括本系统在内的很多公钥密码学系统变得不安全。
"G"的阶应当是一个素数，或者它有一个足够大的素因子以防止使用Pohlig–Hellman算法来得到"a"或者"b"。由于这个原因，一个索菲热尔曼素数 "q"可以用来计算素数"p=2q+1"，这样的"p"称为安全素数，因为使用它之后"G"的阶只能被2和"q"整除。"g"有时被选择成"G"的"q"阶子群的生成元，而不是"G"本身的生成元，这样"ga"的勒让德符号将不会显示出"a"的低位。
如果Alice和Bob使用的随机数生成器不能做到完全随机并且从某种程度上讲是可预测的，那么Eve的工作将简单的多。
临时DH（D-H Ephemeral，DHE）能够提供前向安全性。
身份验证.
在最初的描述中，迪菲－赫尔曼密钥交换本身并没有提供通讯双方的身份验证服务，因此它很容易受到中间人攻击。 一个中间人在信道的中央进行两次迪菲－赫尔曼密钥交换，一次和Alice另一次和Bob，就能够成功的向Alice假装自己是Bob，反之亦然。而攻击者可以解密（读取和存储）任何一个人的信息并重新加密信息，然后传递给另一个人。因此通常都需要一个能够验证通讯双方身份的机制来防止这类攻击。
有很多种安全身份验证解决方案使用到了迪菲－赫尔曼密钥交换。当Alice和Bob共有一个公钥基础设施时，他们可以将他们的返回密钥进行签名，也可以像MQV那样签名"g""a"和"g""b"；STS以及IPsec协议的IKE组件已经成为了Internet协议的一部分；当Alice和Bob共享一个口令时，他们还可以从迪菲－赫尔曼算法使用口令认证密钥协商，类似于ITU-T的建议X.1035。这已经被用作了G.hn的家庭网络标准。