二 分組密碼模式

分組密碼的模式

簡介

前面介紹的DES和AES都屬於分組密碼,它們只能加密固定長度的明文,如果需要加密任意長度的明文,就需要對分組密碼進行迭代,而分組密碼進行迭代,而分組密碼的迭代方法就被稱爲分組密碼的“模式”。
分組密碼有很多種模式,如果模式的選擇不恰當,就無法充分保證機密性。
主要介紹分組密碼與流密碼,然後逐一介紹主要的分組密碼的模式,最後再來考察一下到底應該使用哪種模式。

分組密碼與流密碼

分組密碼: 是每次只能處理特定長度的一塊數據的一類密碼算法,這裏的“一塊”就稱爲分組 。此外,一個分組的比特數就稱爲分組長度 。
例如:

  • DES和三重DES的分組長度都是64比特。這些密碼算法一次只能加密64比特的明文,並生成64比特的密文。
  • AES的分組長度爲128比特,因此AES一次可加密128比特的明文,並生成128比特的密文。

流密碼 :是對數據流進行連續處理的一類密碼算法。流密碼彙總各一般以1比特、8比特或32比特等爲單位進行加密和解密。

分組密碼處理完一個分組就結束了,因此不需要通過內部狀態來記錄加密的進度;相對地,流密碼是對一串數據流進行連續處理,因此需要保持內部狀態,例如,一次性密碼本就屬於流密碼。

模式

分組密碼主要分組模式主要有以下5種:

  • ECB 模式:Electronic CodeBook mode(電子密碼本模式)
  • CBC 模式:Cipher Block Chaining mode(密碼分組鏈接模式)
  • CFB 模式: Cipher FeedBack mode(密文反饋模式)
  • OFB 模式: Output FeedBack mode (輸出反饋模式)
  • CTR 模式: CounTeR mode(計算器模式)

術語

明文分組 是指分組密碼算法中作爲加密對象的明文。明文分組的長度與分組密碼算法的分組長度是相等的。
密文分組 是指使用分組密碼算法將明文分組加密之後生成的密文。

ECB模式

簡介

ECB模式的全稱是Electronic CodeBook模式。在ECB模式中,將明文分組加密之後的結果將直接成爲密碼分組

使用ECB模式加密時,相同的明文分組會被轉換爲相同的密文分組,也就是說,我們可以將其理解爲是一個巨大的“明文分組->密文分組”的對應表,因此ECB模式也稱爲電子密碼本模式
當最後一個明文分組的內容小於分組長度時,需要用一些特定的數據進行填充

ECB模式的特點

ECB模式是所有模式中最簡單的一種,ECB模式中,明文分組與密文分組是一一對應的關係,因此如果明文中存在多個相同的明文分組,則這些明文分組最終都將被轉換爲相同的密文分組。這樣一來,只要觀察一下密文,就可以知道明文存在怎樣的重複組合,並可以以此爲線索來破譯密碼,因此ECB模式是存在一定風險的。

對ECB模式的攻擊

ECB模式中,每個明文分組都各自獨立地進行加密和解密,但這其實是一個很大的弱點。
假如存在主動攻擊者Mallory,他能夠改變密文分組的順序。當接收者對密文解密時,由於密文分組的順序被改變了,因此相應的明文分組的順序也會被改變。也就是說,攻擊者Mallory無需破譯密文就能夠操作明文。

CBC模式

CBC模式是指將前一個密文分組與當前明文分組的內容混合起來進行加密,這樣就可以避免ECB模式的弱點。
CBC模式的全稱Cipher Block Chaining 模式(密文分組組鏈接模式),之所以叫這個名字是因爲密文分組是像鏈條一樣相互連接在一起。
在CBC模式中,首先將明文分組與前一個密文分組進行XOR運算,然後再進行加密。

加密

解密

ECB和CBC對比

如果將–個分組的加密過程分離出來,我們就可以很容易地比較出ECB模式和CBC模式
的區別)。ECB模式只進行了加密,而CBC模式則在加密之前進行了- -次XOR。

初始化向量

當加密第一個明文分組是,由於不存在“前一個密文分組”,因此需要事先準備一個長度爲一個分組的比特序列來替代“前一個密文分組”,這個比特序列稱爲初始化向量 ,通常縮寫爲IV。每次加密時都會隨機產生一個不同的比特序列來作爲初始化向量。

CBC模式的特點

明文分組在加密之前一定會與“前一個密文分組”進行XOR運算,因此即便明文分組1和2的值是相等的,密文分組1和2的值也不一定是相等的。這樣一來,ECB模式的缺陷在CBC模式中就不存在了。
在CBC模式中,無法單獨對一箇中間的明文分組進行加密。例如,如果要生成密文分組3,則至少需要湊齊明文分組1、2、3才行。
假設CBC模式加密的密文分組中有一個分組損壞了。在這種情況下,只要密文分組的長度沒有發生編號,則解密時,最多隻會影響2個分組受到數據損壞的影響。

假設CBC模式的密文分組中有一些比特缺失了,那麼此時即便只缺失了1比特,也會導致密文分組的長度發生變化,此後的分組發生錯位,這樣一來,缺失比特的位置之後的密文分組也就全部無法解密了。

對CBC模式的攻擊

假設主動攻擊者Mallory的目的是通過修改密文來操縱解密後的明文。如果Mallory能夠對初始化向量中的任意比特進行反轉,則明文分組中相應的比特也會被反轉。這是因爲在CBC模式的解密過程中,第一個明文分組會和初始化向量進行XOR運算。

填充提示攻擊

填充提示攻擊(Padding Oracle Attack)是一種利用分組密碼中的填充部分來進行攻擊的方法。在分組密碼中,當明文長度不爲分組長度的整數倍時,需要在最後一個分組填充一些數據使其湊滿一個分組的長度。在填充提示攻擊中,攻擊者會反覆發送一段密文,每次發送時都對填充的數據進行少許改變。由於接收者在無法正確解密時會返回一個錯誤消息,攻擊者通過這一錯誤消息就可以獲得一部分與明文相關的信息。這一攻擊方式並不僅限於CBC模式,而是適用於所有需要進行分組填充的模式。2014年對SSL3.0造成重大影響的POODLE攻擊實際上就是一種填充攻擊。要防禦這種攻擊,需要對密文進行認證,確保這段密文的確是由合法的發送者在制定明文內容的前提下生成的。

對初始化向量進行攻擊

初始化向量( IV )必須使用不可預測的隨機數。然而在SSL/TLS的TLsS 1.0版本協議中,
IV並沒有使用不可預測的隨機數,而是使用了上一次CBC模式加密時的最後一個分組。爲了防
御攻擊者對此進行攻擊,TLS 1.1以上的版本中改爲了必須顯式地傳送IV ( RFC5246 6.2.3.2 )。

CFB模式

CFB模式的全稱是Cipher FeedBack (密文反饋模式)。在CFB模式中,前一個密文分組會被送回密碼算法的輸入端。所謂反饋,這裏指的就是返回輸入端的意思。

CFB和CBC對比

初始化向量

在生成第一個密文分組時,由於不存在前一個輸出的數據,因此需要使用初始化向量來替代,這一個點和CBC模式相同的。一般來說,我們需要在每次加密時生成一個不同的隨機比特序列用作初始化向量。

CFB模式與流密碼

其實CFB模式模式的結構與我們前面介紹的一次性密碼本非常相似的。一次性密碼本是通過將“明文”與“隨機比特序列”進行XOR運算生成“密文”的。而CFB模式則是通過將“明文分組”與“密碼算法的輸出”進行XOR運算來生成“密文分組”的。在通過XOR來進行加密這一點,兩者是非常相似的。
在CFB模式中,密碼算法的輸出相當於一次性密碼本中的隨機比特序列。由於密碼算法的輸出是通過計算得到的,並不是真正的隨機數,因此CFB模式不可能像一次性密碼本那樣具備理論上不可破譯的性質。

CFB模式模式中由密碼算法所生產的比特序列稱爲密鑰流 。在CFB模式中,密碼算法就相當於用來生成密鑰流的僞隨機數生成器,而初始化向量就相當於隨機數生成器的“種子”。

在CFB模式中,明文數據可以被逐比特加密,因此我們可以將CFB模式看作是一種使用分組密碼來實現流密碼的方式

對CFB模式的攻擊

對CFB模式可以實施重放攻擊。其實,對ECB、CBC模式也可以實施重放攻擊

有一天,Alice向Bob發送了一條消息,這兩條消息是由4個密文分組組成的。主動攻擊者Mallory將該消息中額後3個密文分組保存了下來。轉天,Alice又向Bob發送了內容不同的4個密文分組(我們假設使用了相同的密鑰)。Mallory用昨天保存下來的3個密文分組將今天發送的後3個密文分組進行了替換。

於是,在Bob解密時,4個分組中就只有第1個可以解密成正確的明文,第2個會出錯,,而第3和第4個則變成了Mallory替換的內容(也就是昨天發送的明文的內容)。Mallory沒有破解密碼,就成功地將以前的的電文混入了新的電文中。而第2個分組出錯到底是通信錯誤,還是被人攻擊所造成?Bob是無法做出判斷的。

OFB模式

OFB模式的全稱(Output-Feedback)(輸出反饋模式)。在OFB模式中,密碼算法的輸出會反饋到密碼算法的輸入中。

OFB模式並不是通過密碼算法對明文直接進行加密的,而是通過將“明文分組”和“密碼算法的輸出”進行XOR來產生“密文分組”的。在這一點上OFB模式和CFB模式非常相似。

初始化向量

OFB模式中也需要使用初始化向量。一般來說,我們需要每次加密時。生成一個不同的隨機比特序列作用作爲初始化向量。

CFB和OFB模式對比

CFB模式中,密碼算法的輸入時前一個密文分組。OFB模式中,密碼算法的輸入是密碼算法的前一個輸出。
如下圖:

對於CFB模式來說,必須從第一個明文分組開始按順序進行加密,也就是說無法跳過明文分組1而先對明文分組2進行加密。
相對地,OFB模式中,XOR所需要的比特序列可以事先通過密碼算法生成,和明文無關。
只要提前準備好所需的密鑰流,則在實際聰明文生成密文的過程中,就完全不需要動用密碼算法了,只要將明文與密鑰流進行XOR就可以了。和AES等密碼算法相比,XOR運算的速度是非常快的。這樣可以進行快速加密,而且生成密鑰流和進行XOR運算的操作可以並行。

CTR模式

CTR模式的全稱 CountTeR模式(計數器模式)。CTR模式是一種通過將逐此累加的計數器進行加密來生成密鑰流的流密碼

CTR模式中,每個分組對應一個逐次累加的計數器,並通過對計數器進行加密來生成密鑰流。也就是說,最終的密文分組是通過將計數器得到的比特序列,與明文分組進行XOR而得到的。

計數器生成方法

每次加密時都會生成一個不同值(nonce)來作爲計數器的初始值。當分組長度爲128比特(16字節)時,計數器的初始值可能像下面這樣的形式:

其中前8個字節爲nonce,這個值在每次加密必須都是不同的。後8個字節爲分組序號,這個部分會逐次累加的。在加密過程中,計數器的值會產生如下變化。

上述方法可以保證計數器的值每次都不同。因此每個分組生成的密鑰流也不同。這種方法就是用分組密碼來模擬生成隨機的比特序列。

OFB和CTR模式對比

CTR和OFB模式都屬於流密碼。OFB模式是將加密的輸出反饋到輸入,而CTR模式則是將計數器的值用作輸入。

在OFB模式中如果一個分組在通過加密後結果碰巧和加密前相同,那麼這一分組之後的密鑰流就會變成同一個值的不斷反覆。在CTR模式中因爲計數器每次都不同,不存在這一問題。

CTR模式的特點

CTR模式的加密和解密使用完全相同的結構,這個與OFB模式一樣,在程序實現上比較容易。
在CTR模式中,可以以任意順序對分組進行加密和解密,在加密和解密是用到的“計數器”的值可以由nonce和分組序號直接計算出來。這一點在OFB模式中每次計算依賴於上一次密碼算法的輸出。
能夠以任意順序處理分組,意味着可以實現並行計算。在支持並行計算的系統中,CTR模式的速度是非常快的。

不同分組模式的對比

參考資料

該系列的主要內容來自《圖解密碼技術第三版》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章