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 金鑰協商背後的原理,只是這個事實數十年後才解密。

本章脈絡#

  1. Diffie-Hellman 函式——g^ab 的魔法,以及安全質數為何重要。
  2. Diffie-Hellman 問題——CDH、DDH 及其他變體。
  3. 金鑰協商協定——攻擊模型與安全目標(含前向保密)。
  4. 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 位元序列 110111101111 永遠不會出現

要避免從 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 攻擊與群表示攻擊):

你會注意到這些文章中 Diffie–Hellman 運算的表示法與本章不同:例如共享秘密不寫成 g^x 而是 xP。一般而言,乘法被加法取代、指數運算被乘法取代

原因是那些協定通常不是定義在整數群上,而是定義在橢圓曲線上——見第 12 章。