迪菲 - 赫爾曼金鑰交換

迪菲 - 赫爾曼金鑰交換（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.

描述了這個演算法的，已經於 1997 年 4 月 29 日後過期，專利檔案表明了 Hellman、Diffie 和 Merkle 是演算法的發明者。

描述

迪菲－赫爾曼透過公共通道交換一個資訊，就可以建立一個可以用於在公共通道上安全通訊的共享秘密。

以下解釋它的過程（包括演算法的數學部分）：

Diffie–Hellman 金鑰交換

最簡單，最早提出的這個協議使用一個質數 p 的整數模 n 乘法群以及其原根 g。下面展示這個演算法，綠色表示非秘密資訊，紅色粗體表示秘密資訊：

愛麗絲與鮑伯協定使用 p=23 以及 base g=5.

愛麗絲選擇一個秘密整數 a=6，計算 A = ga mod p 併發送給鮑伯。
* A = 56 mod 23 = 8.

鮑伯選擇一個秘密整數 b=15，計算 B = gb mod p 併發送給愛麗絲。
* B = 515 mod 23 = 19.

愛麗絲計算 s = B a mod p
*196 mod 23 = 2.

鮑伯計算 s = A b mod p
*815 mod 23 = 2.

愛麗絲和鮑伯最終都得到了同樣的值，因為在模 p 下和 相等。 注意 a, b 和 gab = gba mod p 是秘密的。 其他所有的值 – p, g, ga mod p, 以及 gb mod p – 都可以在公共通道上傳遞。 一旦愛麗絲和鮑伯得出了公共秘密，他們就可以把它用作對稱金鑰，以進行雙方的加密通訊，因為這個金鑰只有他們才能得到。當然，為了使這個例子變得安全，必須使用非常大的 a, b 以及 p， 否則可以實驗所有的可能取值（總共有最多 22 個這樣的值，就算 a 和 b 很大也無濟於事）。 如果 p 是一個至少 300 位的質數，並且 a 和 b 至少有 100 位長，那麼即使使用全人類所有的計算資源和當今最好的演算法也不可能從 g, p 和 ga mod p 中計算出 a。這個問題就是著名的離散對數問題。注意 g 則不需要很大，並且在一般的實踐中通常是 2 或者 5。IETF RFC3526 文件中有幾個常用的大質數可供使用。

以下是一個更為一般的描述:

愛麗絲和鮑伯協商一個有限迴圈群 G 和它的一個生成元 g。 （這通常在協議開始很久以前就已經規定好； g 是公開的，並可以被所有的攻擊者看到。）
愛麗絲選擇一個隨機自然數 a 並且將傳送給鮑伯。
鮑伯選擇一個隨機自然數 b 並且將傳送給愛麗絲。
愛麗絲 計算。
鮑伯 計算。

愛麗絲和鮑伯就同時協商出群元素，它可以被用作共享秘密。和因為群是乘法交換的。 (見冪.)

2.1 圖示

下面的圖示可以方便你理解每個資訊都只有誰知道。（伊芙是一個竊聽者 —— 她可以看到愛麗絲和鮑伯的通訊內容，但是無法改變它們）

Let s = 共享金鑰。 s = 2
Let a = 愛麗絲的私鑰。如 a = 6
Let A = 愛麗絲的公鑰。如 A = ga mod p = 8
Let b = 鮑伯的私鑰。如 b = 15
Let B = 鮑伯的公鑰。如 B = gb mod p = 19
Let g = 公共原根。如 g=5
Let p = 公共質數。如 p = 23

注意：對愛麗絲來說解開鮑伯的私鑰或鮑伯要解開愛麗絲的私鑰應該都很困難。如果對愛麗絲來說解開鮑伯的私鑰不難的話（反之亦然），伊芙可以輕易地替換掉她自己的私鑰 / 公鑰對，把鮑伯的公鑰插到她自己的私鑰，產生出一個假的共享金鑰，並解開鮑伯的私鑰（然後用這個解開共享私鑰。伊芙可以試著選擇一個能讓她輕鬆解開鮑伯的私鑰的公鑰 / 私鑰對）。

安全性

在選擇了合適的 G 和 g 時，這個協議被認為是竊聽安全的。偷聽者伊芙可能必須透過求解迪菲－赫爾曼問題來得到 gab。在當前，這被認為是一個困難問題。如果出現了一個高效的解決離散對數問題的演算法，那麼可以用它來簡化 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）能夠提供前向安全性。

3.1 身份驗證

在最初的描述中，迪菲－赫爾曼金鑰交換本身並沒有提供通訊雙方的身份驗證服務，因此它很容易受到中間人攻擊。 一箇中間人在通道的中央進行兩次迪菲－赫爾曼金鑰交換，一次和 Alice 另一次和 Bob，就能夠成功的向 Alice 假裝自己是 Bob，反之亦然。而攻擊者可以解密（讀取和儲存）任何一個人的資訊並重新加密資訊，然後傳遞給另一個人。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊。

有很多種安全身份驗證解決方案使用到了迪菲－赫爾曼金鑰交換。當 Alice 和 Bob 共有一個公鑰基礎設施時，他們可以將他們的返回金鑰進行簽名，也可以像 MQV 那樣簽名 ga 和 gb；STS 以及 IPsec 協議的 IKE 元件已經成為了 Internet 協議的一部分；當 Alice 和 Bob 共享一個口令時，他們還可以從迪菲－赫爾曼演算法使用口令認證金鑰協商，類似於 ITU-T 的建議 X.1035。這已經被用作了 G.hn 的家庭網路標準。