現在來看一個建構鑑別式密碼的全然不同的取徑:不是圍繞 AES 這類區塊密碼建立運作模式,而是圍繞一個置換建立模式。

置換只是把輸入可逆地變換成同樣大小的輸出,不使用金鑰——這是能想像到的最簡單元件。

更棒的是,所得的 AEAD 快速、可證明安全,而且比 GCM 與 OCB 更能抵抗 nonce 重用

運作方式#

  1. 從某個固定的初始狀態 H₀ 出發,把金鑰 K 與 nonce N XOR 進內部狀態,得到與原狀態同樣大小的新值。
  2. 用置換 P 變換這個新狀態,得到另一個狀態值。
  3. 把第一個明文區塊 P₁ 與當前狀態 XOR,取所得的值作為第一個密文區塊 C₁P₁C₁ 等長,但小於狀態)。
  4. 要加密第二個區塊,就用 P 變換狀態、把 P₂ 與當前狀態 XOR、取結果為 C₂
  5. 對所有明文區塊迭代,最後一次呼叫 P 之後,從內部狀態取出若干位元作為鑑別標籤 T

圖 8-4:基於置換的鑑別式密碼

這個模式可以調整以支援關聯資料,但過程稍微複雜些,此處略過。

設計要求#

要確保安全,設計基於置換的鑑別式密碼有一些要求:

事實上,全部的安全性都依賴於內部狀態的秘密性

反例:若最後一個明文區塊比完整區塊短,不能只用零填充。否則一個兩位元組的明文區塊(0000)會被補成一個完整的明文區塊(0000...0000),而一個三位元組的區塊(000000)也會補成同一個結果——於是兩則大小不同的訊息會得到相同的標籤

nonce 被重用時#

好消息是:衝擊不像 GCM 或 OCB 那麼糟——鑑別標籤的強度不會被危及。

若 nonce 重複,成功的攻擊者只能學到:

  • 兩則加密訊息是否以相同的值開頭
  • 這個共同開頭(前綴)的長度

例如用相同 nonce 加密兩則六區塊訊息 ABCXYZABCDYZ(每個字母代表一個區塊),可能產生密文 JKLTUVJKLMNO——它們有相同的前綴。

但攻擊者無法得知這兩段明文共享相同的最後兩個區塊(YZ

效能#

特性基於置換的 AEAD
運算層數單層(優點)
可串流性可串流(優點)
加解密核心演算法單一個(優點)
可平行性不可平行化(缺點)——新的 P 呼叫必須等前一次呼叫完成

如果你手癢想挑一個自己喜歡的置換、自己編一個鑑別式密碼——別這麼做

你很可能把細節搞錯,最後得到一個不安全的密碼。

去讀讀有經驗的密碼學家為 Keyak(源自 Keccak 的演算法)與 NORX(由 Philipp Jovanovic、Samuel Neves 與本書作者設計)這類演算法所寫的規格,你就會發現基於置換的密碼遠比它們初看起來複雜得多