現在來看一個建構鑑別式密碼的全然不同的取徑:不是圍繞 AES 這類區塊密碼建立運作模式,而是圍繞一個置換建立模式。
置換只是把輸入可逆地變換成同樣大小的輸出,不使用金鑰——這是能想像到的最簡單元件。
更棒的是,所得的 AEAD 快速、可證明安全,而且比 GCM 與 OCB 更能抵抗 nonce 重用。
運作方式#
- 從某個固定的初始狀態
H₀出發,把金鑰K與 nonceNXOR 進內部狀態,得到與原狀態同樣大小的新值。 - 用置換
P變換這個新狀態,得到另一個狀態值。 - 把第一個明文區塊
P₁與當前狀態 XOR,取所得的值作為第一個密文區塊C₁(P₁與C₁等長,但小於狀態)。 - 要加密第二個區塊,就用
P變換狀態、把P₂與當前狀態 XOR、取結果為C₂。 - 對所有明文區塊迭代,最後一次呼叫
P之後,從內部狀態取出若干位元作為鑑別標籤T。

圖 8-4:基於置換的鑑別式密碼
這個模式可以調整以支援關聯資料,但過程稍微複雜些,此處略過。
設計要求#
要確保安全,設計基於置換的鑑別式密碼有一些要求:
事實上,全部的安全性都依賴於內部狀態的秘密性。
反例:若最後一個明文區塊比完整區塊短,不能只用零填充。否則一個兩位元組的明文區塊(
0000)會被補成一個完整的明文區塊(0000...0000),而一個三位元組的區塊(000000)也會補成同一個結果——於是兩則大小不同的訊息會得到相同的標籤。
nonce 被重用時#
好消息是:衝擊不像 GCM 或 OCB 那麼糟——鑑別標籤的強度不會被危及。
若 nonce 重複,成功的攻擊者只能學到:
- 兩則加密訊息是否以相同的值開頭
- 這個共同開頭(前綴)的長度
例如用相同 nonce 加密兩則六區塊訊息
ABCXYZ與ABCDYZ(每個字母代表一個區塊),可能產生密文JKLTUV與JKLMNO——它們有相同的前綴。但攻擊者無法得知這兩段明文共享相同的最後兩個區塊(
YZ)。
效能#
| 特性 | 基於置換的 AEAD |
|---|---|
| 運算層數 | 單層(優點) |
| 可串流性 | 可串流(優點) |
| 加解密核心演算法 | 單一個(優點) |
| 可平行性 | 不可平行化(缺點)——新的 P 呼叫必須等前一次呼叫完成 |
如果你手癢想挑一個自己喜歡的置換、自己編一個鑑別式密碼——別這麼做。
你很可能把細節搞錯,最後得到一個不安全的密碼。
去讀讀有經驗的密碼學家為 Keyak(源自 Keccak 的演算法)與 NORX(由 Philipp Jovanovic、Samuel Neves 與本書作者設計)這類演算法所寫的規格,你就會發現基於置換的密碼遠比它們初看起來複雜得多。