為什麼是混合式後量子,而非純 ML-KEM

第一次開啟後量子金鑰交換時,這是個合理的疑問:如果 ML-KEM 才是具量子抵抗力的演算法,為什麼大家部署的是 X25519MLKEM768—還拖著那個老舊、會被量子破解的 X25519—而不是純 ML-KEM?答案是一個精確的風險權衡,而你可以從兩個密鑰如何在封包上結合,清楚看出每一半各買到了什麼。

混合式在封包上是什麼

X25519MLKEM768 在同一次交握裡跑兩種金鑰交換。客戶端送出單一個 key_share,是兩把公鑰串接而成;伺服器回以兩把;雙方各自算出兩個共享密鑰,再串接成一個。

# X25519MLKEM768 客戶端 key_share(代碼點 0x11ec)— 兩把金鑰,串接
  ML-KEM-768 封裝金鑰   1184 bytes
  X25519 公鑰              32 bytes
                        ----------
  合計                  1216 bytes   # 這就是 ClientHello 的那 ~1.2 KB

# 餵進 TLS 1.3 金鑰排程的密鑰 = 兩者,串接:
  shared_secret = ML-KEM-768 密鑰 (32)  ||  X25519 密鑰 (32)

(一個值得知道的位元組層級小細節:對 X25519 變體而言,ML-KEM 部分在 share 與密鑰中都排在前面;而 NIST P 曲線變體則把 ECDHE 部分排在前面。順序弄錯,金鑰排程就會悄悄地對不上。)串接後的密鑰直接作為 (EC)DHE 輸入餵進 HKDF—見完整的逐位元組解析

為什麼要結合,而不是二選一

那種「先串接、後 KDF」的構造,只要 KDF 是強健的 PRF,且兩個輸入密鑰中至少有一個未被攻破,就是安全的。要還原工作階段金鑰,攻擊者必須兩者都攻破—X25519 與 ML-KEM。這買到了兩個獨立的失效領域:

• 如果 ML-KEM 有尚未被發現的弱點—數學上的(格密碼分析遠比 ECC 所歷經的數十年攻擊年輕),或更可能在近期出現的、全新程式碼中的實作錯誤—X25519 仍能保護你不受今日的傳統攻擊者侵害。

• 如果一台具密碼學意義的量子電腦問世並破解了 X25519,ML-KEM 仍能保護你。

唯有兩者同時垮掉,你才會輸。

把每一半究竟買到什麼講精確

這裡是容易講錯的部分:X25519 提供的後量子保護是。面對「先擷取、後解密」,一個今天錄下交握、又擁有未來量子電腦的攻擊者,會用 Shor 演算法破解 X25519 那一半。所以這條連線的量子抵抗力,完全仰賴 ML-KEM。

X25519 的工作是另一種保險:採用一個年輕的演算法,不會讓你比今天更糟。萬一 ML-KEM 在量子威脅成真之前被發現有瑕疵,你並沒有退步—你仍握有 X25519 的傳統安全。所以混合式不是「把量子安全加倍」。它是「由 ML-KEM 提供完整的量子抵抗力,再加上一道保證:提早押注沒有降低你的傳統安全」。這個不對稱,正是全部的重點。

那為什麼還不用純 ML-KEM

主要是成熟度。ML-KEM 於 2024 年標準化(FIPS 203);上線的實作都還很新。在第一波部署期間,保守的做法是不要把一條連線的整體機密性,押在尚未經歷 ECC 那般數十年檢視的數學與程式碼上。而這道避險的代價很小:在約 1.2 KB 的 ML-KEM share 之上,多加一次 32 bytes 的 X25519 交換—相對於你已經為 KEM 付出的,這份保險幾乎是免費的。

這就是為什麼已部署的代碼點—在當前的瀏覽器、主要 CDN,以及 OpenSSL 3.5+—用的是混合式,而非純式。純 ML-KEM 確實存在,等演算法夠成熟後也很可能成為預設。今天的例外,是嚴格的 CNSA 2.0/純 PQC 態勢明文要求它—那是一項特定的合規要求,而不是比混合式更安全的改進。

選對群組、並證明每一條連線真的協商出了它,正是那種決定一次遷移是真實、還是只是設定好的封包層細節。它是更廣遷移路徑中的一步,也是我們著力之處

← 所有文章