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 加解密都只用加密函式。