1976 年 11 月,史丹佛研究者 Whitfield Diffie 與 Martin Hellman 發表了一篇名為〈New Directions in Cryptography〉的論文,永遠改變了密碼學。
他們在論文中引入了公鑰加密與簽章的概念——儘管他們實際上並沒有這些方案,只有他們所稱的公鑰分發方案:一個讓兩方藉由交換「竊聽者看得見的資訊」來建立共享秘密的協定。這個協定如今稱為 Diffie–Hellman(DH)協定。
在 Diffie–Hellman 之前,要建立共享秘密得執行手動交換密封信封這類繁瑣程序。
一旦通訊雙方以 DH 協定建立了共享秘密值,該秘密就能被轉換成一把或多把對稱金鑰,用來加密與鑑別後續的通訊,藉此建立安全通道。
DH 協定及其變體因此被稱為金鑰協商協定。
Diffie 與 Hellman 因發明公鑰密碼學與數位簽章,於 2015 年獲頒享譽盛名的圖靈獎——但其他人也值得肯定:
- 1974 年(在那篇開創性的 Diffie–Hellman 論文之前兩年),電腦科學家 Ralph Merkle 就以現稱 Merkle’s puzzles 的東西引入了公鑰密碼學的想法。
- 大約同一年,英國版 NSA——GCHQ(政府通訊總部)的研究者也已發現 RSA 與 Diffie–Hellman 金鑰協商背後的原理,只是這個事實數十年後才解密。
本章脈絡#
- Diffie-Hellman 函式——
g^ab的魔法,以及安全質數為何重要。 - Diffie-Hellman 問題——CDH、DDH 及其他變體。
- 金鑰協商協定——攻擊模型與安全目標(含前向保密)。
- Diffie-Hellman 協定——匿名 DH、鑑別式 DH 與 MQV。
常見錯誤#
Diffie–Hellman 協定能以各種方式壯烈失敗。
沒有雜湊共享秘密#
DH 工作階段交換所產生的共享秘密(例中的 g^ab)是用來導出工作階段金鑰的輸入,它本身不是金鑰——而且它也不該是。
對稱金鑰應該看起來隨機,每個位元是 0 或 1 的機率應該相同。
但
g^ab不是隨機字串,它是某個數學群中的隨機元素,其位元可能偏向 0 或 1。隨機的群元素與隨機的位元字串是不同的東西。
具體例子:假設我們在乘法群 Z13* = {1, 2, ..., 12} 中工作,以 g = 2 為生成元。若 g 的指數是隨機的,你會得到 Z13* 的一個隨機元素——但把 Z13* 的元素編碼成 4 位元字串並不會均勻隨機:
- 有七個值的最高位元是 0(群中的 1 到 7)
- 只有五個值的最高位元是 1(8 到 12)
也就是說,該位元為 0 的機率是 7/12 ≈ 0.58,而理想上隨機位元為 0 的機率應該是 0.5。
更糟的是,4 位元序列
1101、1110、1111永遠不會出現。
要避免從 DH 共享秘密導出的工作階段金鑰出現這種偏差,你應該使用 BLAKE2 或 SHA-3 這類密碼學雜湊函式——或者更好,使用金鑰衍生函式(KDF)。
KDF 建構的一個例子是 HKDF(基於 HMAC 的 KDF,規範於 RFC 5869),不過今天 BLAKE2 與 SHA-3 都內建了專門的 KDF 模式。
TLS 中的舊版 Diffie–Hellman#
TLS 協定是 HTTPS 安全網站以及 SMTP 背後的安全機制。TLS 接收數個參數,包括它將使用的 Diffie–Hellman 協定類型。
儘管匿名 DH 並不安全,多數 TLS 實作仍為了相容舊系統而支援它。
不安全的群參數#
2016 年 1 月,OpenSSL 工具包的維護者修補了一個高嚴重性漏洞(CVE-2016-0701),該漏洞允許攻擊者利用不安全的 Diffie–Hellman 參數。
根本原因是:OpenSSL 允許使用者使用不安全的 DH 群參數(也就是不安全的質數
p),而不是在執行任何算術運算之前就拋出錯誤並中止協定。本質上,OpenSSL 接受了一個其乘法群
Zp*(所有 DH 運算發生之處)含有小子群的質數p。
為什麼這很糟:
- 大群中存在小子群,會把共享秘密侷限在遠小於整個
Zp*的可能值集合中。 - 更糟的是,攻擊者能精心構造一個 DH 指數
x,當它與受害者的公鑰g^y結合時,會洩漏關於私鑰y的資訊,最終洩漏其全部。
儘管實際漏洞出現在 2016 年,該攻擊所用的原理可追溯到 Lim 與 Lee 1997 年的論文〈A Key Recovery Attack on Discrete Log-based Schemes Using a Prime Order Subgroup〉。
延伸閱讀#
- 標準與官方出版品:ANSI X9.42、RFC 2631 與 RFC 5114、IEEE 1363、NIST SP 800-56A。它們既是確保互通性的參考,也提供群參數的建議。
- 進階 DH 協定(如 MQV 及其表親 HMQV、OAKE)與其安全概念(如 unknown-key share 攻擊與群表示攻擊):
- Hugo Krawczyk 2005 年的〈HMQV: A High-Performance Secure Diffie–Hellman Protocol〉(https://eprint.iacr.org/2005/176/ ↗)
- Andrew C. Yao 與 Yunlei Zhao 2011 年的〈A New Family of Implicitly Authenticated Diffie–Hellman Protocols〉(https://eprint.iacr.org/2011/035/ ↗)
你會注意到這些文章中 Diffie–Hellman 運算的表示法與本章不同:例如共享秘密不寫成
g^x而是xP。一般而言,乘法被加法取代、指數運算被乘法取代。原因是那些協定通常不是定義在整數群上,而是定義在橢圓曲線上——見第 12 章。