數據塊加密模式以及IV的意思


(本文資料主要來自:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

目前流行的加密和數字認證算法,都是采用塊加密(block cipher)方式(注:還有一種叫 stream cipher,流式加密)。就是將需要加密的明文分成固定大小的數據塊,然后對其執行密碼算法,得到密文。數據塊的大小通常采用跟密鑰一樣的長度。

加密模式在加密算法的基礎上發展出來,同時也可以獨立於加密算法而存在。加密算法,如DES、AES等不多的幾種,目前采用最多的是AES。而加密模式是定義怎樣通過重復利用加密算法將大於一個數據塊大小的明文轉化為密文。目前利用較多的加密模式有以下幾種:

• ECB:Electronic Code Book(電子碼本模式)
• CBC:Cipher Block Chaining(密碼塊鏈模式)
• CTR:Counter(計數器模式)

此外,還有其他的一些模式,本文中將不做介紹。
• CFB:Cipher Feedback(密碼反饋模式)
• OFB:Output Feedback(輸出反饋模式)


電子碼本模式(ECB)

這是一種最簡單的加密模式,只是將明文分塊,並將加密算法應用於數據塊,沒有任何其他的前后處理。加密和解密流程如下圖所示:

在ECB加密模式下,各個數據塊的加解密是完全獨立的,因此各個數據塊的處理可以完全平行地進行,易於用硬件實現,達到很高的處理性能。但ECB有一個致命的弱點,也即不能隱藏明文數據的特定模式。在數據模式中包含較多有用信息時,不用破解就可以發現很多信息。下面就是一個用ECB對一個圖像文件加密的典型例子,主要信息實際上已經泄漏了。

另外,由於相同的明文總是得到相同的密文,因此不能抵擋回放攻擊(Playback Attack)。比如說,可能不能竊取到你的密碼信息,只要通過監視偷錄到密碼加密后的數據,就可以通過回放進入到你的網上賬戶。

為了解決以上兩個問題,就需要對加密后的數據進行二次處理,以破壞其中的數據模式,同時達到相同的明文在不同時刻加密得到不同的密文,以有效阻止回放攻擊。

密碼塊鏈模式(CBC)

CBC的基本思路是在明文的各個模塊加密之前,與另一個選定的數據塊執行一次異或操作,有效地破壞明文數據中的模式。為了保持所選的數據塊的隨機性,在CBC中選擇了前一個數據塊的密文。但是對第一個數據塊,因為沒有前一個數據塊的加密結果,需要引入一個初始向量(Initialization Vector: IV)作為選定的數據塊。加解密流程如下圖所示:

從上述流程圖可以看出,CBC的最大問題是各個數據塊的加密必須按順序進行,但解密是可以平行進行的。

CBC的還有一個有趣的特點是,即使中間有一個密文數據塊丟失,這只影響它后面的一個數據塊的解密,此后的數據塊還是可以正確解密的。這個特點引入了一個解決IV選擇的思路:Explicit Initialization Vector。在明文之前加一個隨機數據塊,然后用一個隨機的IV對它加密。IV和這隨機數據塊並不通知到解密側。在解密側,第一個數據塊由於缺少IV信息,不能正確解密,但其后的數據塊都可以正確解密。由於第一個數據塊是為了加密而引入的內容,因此可以得到完整的明文內容。

上述Linux企鵝用CBC加密后的數據就非常接近偽隨機數。如下圖所示:

計數器模式(CTR)

CTR模式的加解密流程如下圖所示。

CTR模式解決問題的思路與CBC等不同,它是對一個構建成的數據塊施行加密操作,然后再用生成的密文與明文進行異或操作,生成最后的密文。由於對於各個模塊的加解密操作都是獨立的,因此可以平行處理。

在CTR模式中,加密操作用的構建數據塊由兩部分構成:Nonce和Counter。為了保證安全性,通常要求Nonce在一個Key的使用周期內保持唯一。在能夠保證時間同步的系統中,經常選擇時間作為Nonce。

另外,在CTR處理中,不需要對明文進行pad補0操作。

CTR模式廣泛用在各種系統中,在互聯網和物聯網中廣泛使用的CCM模式的加解密部分用的就是CTR模式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM