OCB 是 offset codebook(偏移碼本)的縮寫,不過設計者 Phil Rogaway 偏好直接叫它 OCB。

它於 2001 年首度開發,早於 GCM。和 GCM 一樣,OCB 從一個區塊密碼產生鑑別式密碼——但更快也更簡單

那為什麼 OCB 沒有被更廣泛採用?

遺憾的是,直到 2013 年,所有 OCB 的使用都需要向發明者取得授權。所幸本書寫作時,Rogaway 已對非軍事軟體實作免費授權。因此,儘管 OCB 尚未成為正式標準,或許我們將開始看到更廣泛的採用。

內部結構#

與 GCM 不同,OCB 把加密與鑑別融合成單一處理層,只用一把金鑰

沒有獨立的鑑別元件,所以 OCB 幾乎是免費取得鑑別功能,其區塊密碼呼叫次數與不帶鑑別的密碼相差無幾。

事實上,OCB 幾乎和 ECB 模式一樣簡單——只是它是安全的。

加密#

OCB 把每個明文區塊 P 加密成:

C = E(K, P ⊕ O) ⊕ O

其中 O(稱為偏移,offset)是一個依賴於金鑰與 nonce 的值,每處理一個新區塊就遞增。

產生標籤#

OCB 先把所有明文區塊 XOR 在一起:

S = P₁ ⊕ P₂ ⊕ P₃ ⊕ ...

鑑別標籤則是:

T = E(K, S ⊕ O*)

其中 O* 是從最後一個被處理之明文區塊的偏移算出來的偏移值。

圖 8-3:OCB 對兩個明文區塊(無關聯資料)的加密流程

帶關聯資料時#

與 AES-GCM 一樣,OCB 也支援一系列關聯資料區塊 A₁, A₂, ...。此時鑑別標籤依下式計算:

T = E(K, S ⊕ O*) ⊕ E(K, A₁ ⊕ O₁) ⊕ E(K, A₂ ⊕ O₂) ⊕ ...

其中 OCB 指定的偏移值與加密 P 時所用的不同。

與 GCM 及 encrypt-then-MAC「藉由組合密文產生鑑別標籤」不同,OCB 藉由組合明文資料計算鑑別標籤

這個做法沒有問題,OCB 有紮實的安全性證明支持。

想知道如何正確實作 OCB,可看 RFC 7253,或 Krovetz 與 Rogaway 2011 年的論文〈The Software Performance of Authenticated-Encryption Modes〉——它涵蓋了最新最好的版本 OCB3。更多細節見 OCB FAQ:http://web.cs.ucdavis.edu/~rogaway/ocb/ocb-faq.htm

OCB 的安全性#

OCB 面對重複 nonce 時比 GCM 稍微沒那麼脆弱

nonce 重複時攻擊者能學到什麼
OCB只能注意到(例如)第一則訊息的第三個明文區塊與第二則訊息的第三個明文區塊相同
GCM不只能找出重複,還能找出相同位置區塊之間的 XOR 差值

與 GCM 一樣,重複的 nonce 也能攻破 OCB 的真確性,只是效果較差。

例如攻擊者可以組合兩則以 OCB 鑑別之訊息的區塊,造出另一則與原本兩則之一具有相同校驗和與標籤的加密訊息——但攻擊者無法像對 GCM 那樣還原出秘密金鑰

OCB 的效率#

OCB 與 GCM 速度大致相當,兩者都可平行化、也都可串流。

就原始效率而言,兩者對底層區塊密碼(通常是 AES)的呼叫次數差不多,但 OCB 略勝一籌——因為它只是把明文 XOR 起來,而不是執行相對昂貴的 GHASH 計算。

(在較早世代的 Intel 微處理器上,AES-GCM 曾比 AES-OCB 慢三倍以上,因為 AES 與 GHASH 指令必須競爭 CPU 資源、無法平行執行。)

OCB 與 GCM 實作的一個重要差別:

  • OCB 加解密都需要區塊密碼的加密與解密兩個函式,這在只有有限矽面積可供密碼元件使用時,增加了硬體實作的成本。
  • GCM 加解密都只用加密函式。