密碼體系三 - 分組密碼

弓長86說 發佈 2022-08-10T10:17:47.382676+00:00

當需要加密任意長度明文時,就需要分組疊代進行加密。 下面我們會聊到常用的分組模式和使用場景分組密碼有很多模式,如果模式選擇不當,就無法充分保證明文的機密性(還記得密碼加密體系要完成的三個目標麼?)。

當需要加密任意長度明文時,就需要分組疊代進行加密。 下面我們會聊到常用的分組模式和使用場景


分組密碼有很多模式,如果模式選擇不當,就無法充分保證明文的機密性(還記得密碼加密體系要完成的三個目標麼?)。比如當我們使用密鑰加密一個全是'A'字符的文件時,如果沒有分組疊代,那麼密文可能都是相同字符的重複。 雖然我們沒辦法通過密文反推出明文,但根據不斷重複出現的密文,可以大致推測出明文的字符分布規律。藉助其他統計概率方法,可以大幅降低解密難度(參考通過詞頻破解凱撒加密的案例)。

那什麼是模式呢?

模式是:分組密碼的疊代算法。比如我們常使用的 DES 算法中的 ECB 模式。 ECB 模式就是將明文分割成多個分組並逐個加密的方法。 ECB 算法計算量小,加解密速度快,但現在已經證實 ECB 是不可靠的模式了。 所以正式場合中不要使用 ECB 模式。

模式是分組密碼特有的方式,在流密碼中並不存在模式。那何為流密碼呢?

分組密碼每次只能處理特定長度的一塊數據,一塊有時也稱之為block。一個分組(block)的比特數就是分組長度。 流密碼是對數據流進行連續處理的加密算法。流密碼在加解密時需要保存上次計算的狀態(分組密碼則不需要,因為分組密碼只需要計算當前 block 數據就可以了)。

我們在本節中只介紹分組密碼,暫不介紹流密碼

下面來看常見的幾種分組模式。

  • ECB

ECB 將明文進行分組後直接加密產生密文分組

由圖可以看出 ECB 模式中,明文和密文是一一對應的。相同的明文一定可以得到相同的密文。所以雖然不能直接根據密文推導出明文,但可以根據密文的特點進行定向攻擊。

例如: Bob 向 Alice 發送了一個轉帳的報文:

分組1 = Bob的銀行帳號 
分組2 = Alice的銀行帳號 
分組3 = 轉帳金額

雖然 Eve 不能直接修改帳號和金額(因為沒有解密數據),但 Eve 可以通過交換分組 1 和分組 2,造成攻擊。

分組1 = Alice的銀行帳號 
分組2 = Bob的銀行帳號 
分組3 = 轉帳金額

這種攻擊方式能成功就是因為 ECB 沒有隱藏明文信息造成的。

  • CBC

密文分組連結模式

顧名思義,CBC 是將密文分組像鏈條一樣相互連接起來。典型的加密流程如下:

CBC 最核心的一個環節,是將前一個密文分組作為一個變量帶入了下一個明文加密中。 這樣即便明文相同,但經過密文異或操作後,就會出現不同的結果。通過這樣就實現了混淆明文信息的目的。

但不知道你有沒有發現,第一個明文分組如何處理呢? 在處理第一個明文分組時,異或為 0.那麼密文分組 A 就退化成了 ECB 模式。 為了避免出現這種情況,我們就需要人為補充一個初始密文分組,這個初始的密文分組就稱為IV分量

一般來說,每次加密時都應該隨機產生一個不同比特的 IV 分量(如何隨機產生,請參考本系列最後的隨機工具箱說明)

在 CBC 模式中,我們無法單獨解密某個分組。從圖中也很容易理解,每個分組都需要前向分組信息才可以計算。這樣設計有利有弊,好的是安全性高,但不好的地方是如果某個分組數據被損壞,會導致當前分組和下個分組的數據無法正常解密。

  • CFB

對 CBC 模式的一種改進

CFB 是對 CBC 模式的一種優化,加密流程看起來很類似:

在 CFB 模式中,明文分組和密文分組之間只做異或操作就可以了。在此時此刻,密碼算法的輸出有一些一次性密碼本的意思了。

  • OFB

輸出反饋模式。 密碼算法的輸出會反饋到密碼算法的輸入中

OFB 並不是通過密碼算法對明文進行加密的,而是通過將明文分組密碼算法的輸出進行異或來產生密文的。所以 OFB 和 CFB 也有一些類似.

注意: 加密函數的順序一定要保持一致,無論是加密和解密都需要相同順序的加密函數序列

從圖中可以看出 OFB 模式和 CFB 模式很相近,區別僅僅在於密碼算法的輸入。

CFB 是將前一個密文分組作為下一個密碼算法的輸入,所以叫做密文反饋模式。 OFB 則是將前一個密碼算法的輸出當作下一個密碼算法的輸入,所以叫做輸出反饋模式.

這四種是常用的分組密碼模式,那麼我們應該選擇哪種模式作為分組加密模式呢?

  1. 首先可以排除 ECB,雖然它簡單、快速和支持並行。 但無法隱藏明文信息所以不安全。
  2. CBC 可以支持並行解密,並且可以解密任意的密文分組。 所以在可以容忍串行加密的場景中,推薦使用 CBC。
  3. CFB 同樣支持並行解密,並且可以解密任意的密文分組。但 CFB 不能抵禦重放攻擊。
  4. OFB 不需要對明文進行填充 Padding。如果密文包含錯誤比特時,只有明文中相對應的比特會出錯。但不支持並行解密,存在比特反轉攻擊的問題。

所以綜上所述,除了 ECB 不推薦之外。其他三種,只能可以容忍缺點,那麼都是推薦使用的分組模式。

關鍵字: