本章談的是一類不只保護訊息機密性、還保護其真確性的演算法。
回想第 7 章:訊息鑑別碼(MAC)藉由產生一個標籤(某種簽名)來保護訊息的真確性。與 MAC 一樣,本章討論的鑑別式加密(AE,authenticated encryption)演算法也產生鑑別標籤,但它們同時還加密訊息。
換句話說:單一個 AE 演算法同時提供了一般密碼與 MAC 的功能。
本章脈絡#
- 用 MAC 做鑑別式加密——encrypt-and-MAC、MAC-then-encrypt、encrypt-then-MAC 三種組合。
- 鑑別式密碼——AEAD、nonce 的角色,以及評估準則。
- AES-GCM——標準的鑑別式密碼,及其 nonce 重用的致命弱點。
- OCB——比 GCM 更快、更簡單的單層設計。
- SIV——最安全但不可串流。
- 基於置換的 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,於是對任意 i 有 Cᵢ ⊗ H = 1 ⊗ H = H。
從 GHASH 的遞迴式出發,代入 X₀ = 0、C₁ = 1:
X₁ = (X₀ ⊕ C₁) ⊗ H = (0 ⊕ 1) ⊗ H = H利用 ⊗ 對 ⊕ 的分配律,代入 X₁ = H、C₂ = 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² ⊕ CnHGHASH 接著把訊息長度 XOR 進最後這個 Xn,把結果乘上 H,再與 AES(K, N ‖ 0) XOR,產生最終的鑑別標籤 T。
哪裡會出問題:先看兩個最簡單的情況:
- 若
H = 0:無論Cᵢ的值為何、也就是無論訊息為何,Xn = 0。所有訊息都會有相同的鑑別標籤。 - 若
H = 1:標籤就只是密文區塊的 XOR,把密文區塊重新排序會得到相同的鑑別標籤。
0 與 1 只是 H 的 2^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恰好屬於短循環的不太可能情況下,攻擊者能偽造任意數量的鑑別標籤——但除非他們知道H或K,否則無法判定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 MB | 1/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 模式到基於置換的模式,以及新的核心演算法。例如前面提到的 NORX 與 Keyak;建立在不可串流雙層模式上、因而具抗誤用性的 AEZ(讀作 AEasy);以及巧妙運用 AES 輪函式、簡潔優美的 AEGIS。
- 其他實際使用的模式:CCM(counter with CBC-MAC)與 EAX 曾在 2000 年代初與 GCM 競逐標準化。雖然 GCM 勝出,這兩個競爭者仍被用在少數應用中——例如 CCM 用於 WPA2 Wi-Fi 加密協定。你或許會想讀讀這些密碼的規格,比較它們在安全性與效能上的相對優劣。
到此對稱金鑰密碼學的討論就告一段落了!
你已看過區塊密碼、串流密碼、(帶金鑰的)雜湊函式,以及鑑別式密碼——也就是所有使用對稱金鑰、或完全不用金鑰的主要密碼學元件。
在進入非對稱密碼學之前,第 9 章會更著重於電腦科學與數學,為 RSA(第 10 章)與 Diffie–Hellman(第 11 章)這類非對稱方案鋪好背景。