本章談的是一類不只保護訊息機密性、還保護其真確性的演算法。

回想第 7 章:訊息鑑別碼(MAC)藉由產生一個標籤(某種簽名)來保護訊息的真確性。與 MAC 一樣,本章討論的鑑別式加密(AE,authenticated encryption)演算法也產生鑑別標籤,但它們同時還加密訊息

換句話說:單一個 AE 演算法同時提供了一般密碼與 MAC 的功能。

本章脈絡#

  1. 用 MAC 做鑑別式加密——encrypt-and-MAC、MAC-then-encrypt、encrypt-then-MAC 三種組合。
  2. 鑑別式密碼——AEAD、nonce 的角色,以及評估準則。
  3. AES-GCM——標準的鑑別式密碼,及其 nonce 重用的致命弱點。
  4. OCB——比 GCM 更快、更簡單的單層設計。
  5. SIV——最安全但不可串流。
  6. 基於置換的 AEAD——完全不同的取徑。

常見錯誤#

鑑別式密碼的攻擊面比雜湊函式或區塊密碼更大,因為它們同時追求機密性與真確性。它們接收數個不同的輸入值,且必須在任何輸入下都保持安全——無論輸入只含關聯資料而無加密資料、含極大的明文、或不同的金鑰大小。

它們還必須對所有 nonce 值都安全,能抵抗蒐集大量「訊息/標籤」對的攻擊者,並在某種程度上抵抗 nonce 的意外重複。

這要求很高——如你所見,連 AES-GCM 都有數個不完美之處。

AES-GCM 與弱雜湊金鑰#

AES-GCM 的一個弱點藏在它的鑑別演算法 GHASH 中:某些雜湊金鑰 H 的值會大幅簡化針對 GCM 鑑別機制的攻擊。

具體來說,若 H 屬於全體 128 位元字串中某些數學上定義的特定子群,攻擊者可能只要把前一則訊息的區塊重新洗牌,就能猜出某則訊息的有效鑑別標籤

GHASH 內部:從 H = AES(K, 0)X₀ = 0 出發,反覆計算:

Xᵢ = (X(i−1) ⊕ Cᵢ) ⊗ H

處理密文區塊 C₁, C₂, ...,最後的 Xᵢ 被 GHASH 回傳用來計算最終標籤。

延伸:推導 GHASH 的展開式

為了簡化,先假設所有 Cᵢ 都等於 1,於是對任意 iCᵢ ⊗ H = 1 ⊗ H = H

從 GHASH 的遞迴式出發,代入 X₀ = 0C₁ = 1

X₁ = (X₀ ⊕ C₁) ⊗ H = (0 ⊕ 1) ⊗ H = H

利用 的分配律,代入 X₁ = HC₂ = 1

X₂ = (X₁ ⊕ C₂) ⊗ H = (H ⊕ 1) ⊗ H = H² ⊕ H

再代入 X₂

X₃ = (X₂ ⊕ C₃) ⊗ H = (H² ⊕ H ⊕ 1) ⊗ H = H³ ⊕ H² ⊕ H

接著 X₄ = H⁴ ⊕ H³ ⊕ H² ⊕ H,依此類推,最後得到:

Xn = Hⁿ ⊕ Hⁿ⁻¹ ⊕ Hⁿ⁻² ⊕ ... ⊕ H² ⊕ H

若那些 Cᵢ 不是 1 而是任意值,我們會得到:

Xn = C₁Hⁿ ⊕ C₂Hⁿ⁻¹ ⊕ C₃Hⁿ⁻² ⊕ ... ⊕ C(n−1)H² ⊕ CnH

GHASH 接著把訊息長度 XOR 進最後這個 Xn,把結果乘上 H,再與 AES(K, N ‖ 0) XOR,產生最終的鑑別標籤 T

哪裡會出問題:先看兩個最簡單的情況:

  • H = 0:無論 Cᵢ 的值為何、也就是無論訊息為何,Xn = 0所有訊息都會有相同的鑑別標籤。
  • H = 1:標籤就只是密文區塊的 XOR,把密文區塊重新排序會得到相同的鑑別標籤。

01 只是 H2^128 個可能值中的兩個,出現機率只有 2/2^128 = 1/2^127但還有其他弱值——所有「取 i 次方時屬於短循環」的 H 值。

例如 H = 10d04d25f93556e69f58ce2f8d035a4 屬於一個長度為 5 的循環,因為它滿足 H⁵ = H,因此對任何 5 的倍數 e 都有 Hᵉ = H

於是在 Xn 的展開式中,交換區塊 Cn(乘上 H)與區塊 C(n−4)(乘上 H⁵)會讓鑑別標籤保持不變——這等同於一次偽造。

攻擊者可以利用這個性質,在不知道金鑰的情況下構造出一則新訊息與其有效標籤——而這對安全的鑑別式密碼本該是不可能的。

上例基於長度為 5 的循環,但還有許多更長的循環,因此有許多 H 值比它們應有的更弱。

結論:在 H 恰好屬於短循環的不太可能情況下,攻擊者能偽造任意數量的鑑別標籤——但除非他們知道 HK,否則無法判定 H 的循環長度。所以雖然這個漏洞無法被利用,它本來只要更審慎地選擇模歸約所用的多項式就能避免。

細節見 Markku-Juhani O. Saarinen 的〈Cycling Attacks on GCM, GHASH and Other Polynomial MACs and Hashes〉:https://eprint.iacr.org/2011/202/

AES-GCM 與短標籤#

實務上 AES-GCM 通常回傳 128 位元標籤,但它能產生任意長度的標籤。

使用 128 位元標籤時,嘗試偽造的攻擊者成功機率應該是 1/2^128(一般而言,n 位元標籤的成功機率應為 1/2^n)。但使用較短的標籤時,由於 GCM 結構上的弱點,偽造機率遠高於 1/2^n

實際公式是 2^m / 2^n,其中 2^m 是「成功攻擊者曾觀察到其標籤的最長訊息」的區塊數:

標籤長度訊息大小偽造機率
32 位元2 MB1/2^16(而非 1/2^32
48 位元4 GB(2^28 個 16 位元組區塊)2^28 / 2^48 = 1/2^20,約百萬分之一

以密碼學的標準而言,百萬分之一是相當高的機率。

更多資訊見 Niels Ferguson 2005 年的論文〈Authentication Weaknesses in GCM〉。

延伸閱讀#

  • CAESAR 競賽:Competition for Authenticated Encryption: Security, Applicability, and Robustness(http://competitions.cr.yp.to/caesar.html )。始於 2012 年,是仿效 AES 與 SHA-3 競賽風格的密碼學競賽,但並非由 NIST 主辦
  • CAESAR 吸引了數量可觀的創新設計:從類 OCB 模式到基於置換的模式,以及新的核心演算法。例如前面提到的 NORXKeyak;建立在不可串流雙層模式上、因而具抗誤用性的 AEZ(讀作 AEasy);以及巧妙運用 AES 輪函式、簡潔優美的 AEGIS
  • 其他實際使用的模式CCM(counter with CBC-MAC)與 EAX 曾在 2000 年代初與 GCM 競逐標準化。雖然 GCM 勝出,這兩個競爭者仍被用在少數應用中——例如 CCM 用於 WPA2 Wi-Fi 加密協定。你或許會想讀讀這些密碼的規格,比較它們在安全性與效能上的相對優劣。

到此對稱金鑰密碼學的討論就告一段落了

你已看過區塊密碼、串流密碼、(帶金鑰的)雜湊函式,以及鑑別式密碼——也就是所有使用對稱金鑰、或完全不用金鑰的主要密碼學元件。

在進入非對稱密碼學之前,第 9 章會更著重於電腦科學與數學,為 RSA(第 10 章)與 Diffie–Hellman(第 11 章)這類非對稱方案鋪好背景。