密文竊取(CTS)是密碼學中使用分組密碼操作模式的通用方法,該操作模式允許處理不能均勻分割成塊的消息,而不會延長密文,代價是略為複雜。

一般特性

編輯

密文竊取是一種使用塊密碼對明文進行加密的技術,但不將信息填充為塊大小的倍數,因此密文與明文大小相同。

它通過改變信息最後兩個區塊的處理過程來實現這一目的。除最後兩個區塊外,其他所有區塊的處理都保持不變,但倒數第二個區塊的部分密文會被 "竊取",以填充最後一個明文區塊。然後照常加密經過填充的最後一個區塊。

最後兩個區塊的最終密文由部分倒數第二個區塊(省略 "竊取 "部分)和完整的最後一個區塊組成,大小與原始明文相同。

解密時需要先解密最後一個區塊,然後將竊取的密文還原到倒數第二個區塊,然後再像往常一樣解密。

原則上,可以使用任何面向區塊的區塊密碼操作模式,但類似流密碼的模式已經可以應用於任意長度的信息,而無需填充,因此它們無法從這項技術中受益。與密文竊取相結合的常見操作模式是電子密碼本(ECB)和密碼塊鏈(CBC)。

ECB 模式的密文竊取要求明文長度超過一個區塊。一種可行的變通方法是,當明文長度為一個或更少時,使用類似流密碼的塊密碼操作模式,如 CTR、CFB 或 OFB 模式。

CBC 模式的密文竊取並不一定要求明文長度超過一個區塊。在明文長度為一個區塊或更短的情況下,初始化向量(IV)可以充當密碼文本的前一個區塊。在這種情況下,必須向接收方發送修改後的 IV。如果發送方在發送密文時不能自由選擇 IV(例如,IV 是一個派生或預先確定的值),則可能無法做到這一點,在這種情況下,CBC 模式的密文竊取只能發生在明文長度超過一個區塊的情況下。

要對未知長度的數據進行 CTS 加密或解密,必須延遲處理(和緩衝)最近的兩個數據塊,以便在數據流結束時對其進行適當處理。

密文格式

編輯

有幾種不同的方式來排列密文以便傳輸。不同排列方式的密文位元數都相同,只是傳輸順序不同,因此選擇不影響安全性,純粹是為了方便實現。

這裡的編號取自Dworkin所描述的。第三種最流行,由Daemen和Schneier描述;Meyer描述了相關但不兼容的方案(關於位排序和密鑰使用)。

安排密文傳輸最顯而易見的方式,不外乎是縮短倒數第二塊,後面接著完整的最後一塊。但這對接收者來說不方便,原因有二:

  1. 在任何情況下,接收方都必須首先解密最後一塊,並且
  2. 這導致最後一塊沒有按照自然邊界對齊,並將硬體複雜化。

這樣做的好處是,如果最後的明文塊恰好是塊大小的倍數,密文就與原始操作模式相同,避免了密文竊取。

通常,更方便的方式是交換最後兩塊密文塊,因此密文結尾先是完整的最後一塊,然後是截斷的倒數第二塊。密文塊就會自然對齊。

為了保持與非竊取模式的兼容性,CS2隻在竊取密文的數量非零時交換,即原始消息不是塊大小的倍數。

這保持了自然的對齊,以及與非竊取模式的兼容性,但是需要以不同的方式處理對齊和不對齊消息大小的情況。

最流行的替代方案是無條件交換最後兩塊密文塊。下面描述了使用該方案的順序。

竊取密文模式描述CS3

編輯

為了加密或解密數據,對除最後兩個數據塊外的所有數據塊使用標準分組密碼操作模式。

下面的步驟描述了如何處理明文的最後兩個塊,即Pn-1和Pn,其中Pn-1的長度等於以位表示的密碼的塊大小B;最後一個塊的長度Pn是百萬位元(Mbit);k是正在使用的密鑰。M可以範圍從1到B,所以Pn可能是一個完整的塊。CBC模式描述還使用了就在有關塊Cn-2之前的密文塊,如果明文適合在兩個塊內,則該密文塊實際上可能是IV。

對於這描述,使用以下函數和操作符:

  • Head(data,a):返回「data」字串第一位。
  • Tail(data,a):返回「data」字串最後一位。
  • Encrypt(k,data):在「data」字串用加密模式的底層塊密碼,用密鑰k。
  • Decrypt(k,data):在「data」字串的解密模式用基礎塊密碼,用密鑰k。
  • XOR或運算。等價於不用進位的按位加法。
  • | |:與運算符。合併運算符兩邊的字串。
  • 0^a:一串0位元的字串。

ECB密文竊取

編輯

ECB模式的密文竊取在前兩塊內引入了塊間依賴關係,改變後兩塊的錯誤傳播行為。

Ecb加密步驟(見圖)

編輯

參考文獻

編輯