1. 程式人生 > >對稱加密演算法常用的五種分組模式(ECB/CBC/CFB/OFB/CTR)

對稱加密演算法常用的五種分組模式(ECB/CBC/CFB/OFB/CTR)

版權宣告:本文為作者原創,如需轉載,請註明出處
https://blog.csdn.net/weixin_42940826
注:以下圖片來自於《圖解密碼學》,這本書講的更全面細緻,建議閱讀,在我資源庫中有此書,還有使用go語言具體實現和解釋此書中的各種加密演算法的文件,有需要的可以自習前往免費下載

Q:為什麼需要分組模式?
A:明文的長度不固定,而分組密碼只能處理特定長度的一塊資料,這就需要對分組密碼的演算法進行迭代,以便將一段很長的明文全部加密,而迭代的方法就是分組的模式。

一圖全覽五種分組模式

常用分組模式全覽

五種模式詳解

1. ECB - Electronic Code Book, 電子密碼本模式

  • 特點: 簡單, 效率高, 密文有規律, 容易被破解
  • 最後一個明文分組必須要填充
    • des/3des -> 最後一個分組填充滿8位元組
    • aes -> 最後一個分組填充滿16位元組
  • 不需要初始化向量

ECB模式圖解


2. CBC - Cipher Block Chaining, 密碼塊鏈模式(推薦使用)

  • 特點: 密文沒有規律, 經常使用的加密方式
  • 最後一個明文分組需要填充
    • des/3des -> 最後一個分組填充滿8位元組
    • aes -> 最後一個分組填充滿16位元組
  • 需要一個初始化向量 - 一個數組
    • 陣列的長度: 與明文分組相等
    • 資料來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同
      CBC模式的加密

3. CFB - Cipher FeedBack, 密文反饋模式

  • 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
  • 需要一個初始化向量 - 一個數組
    • 陣列的長度: 與明文分組相等
    • 資料來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同
  • 不需要填充
    CFB模式加密

4. OFB - Output-Feedback, 輸出反饋模式

  • 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
  • 需要一個初始化向量 - 一個數組
    • 陣列的長度: 與明文分組相等
    • 資料來源: 負責加密的人的提供的
    • 加解密使用的初始化向量值必須相同
  • 不需要填充
    OFB分組模式

5. CTR - CounTeR, 計數器模式(重點,推薦使用)

  • 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
  • 不需要初始化向量
    • go介面中的iv可以理解為隨機數種子, iv的長度 == 明文分組的長度
  • 不需要填充
    這裡我們有必要給出CTR模式額解密流程,因為CTR模式的解密和加密是一模一樣的過程,在程式實現中也是可逆的,具體程式在文章實現底部有連結
    CTR分組模式
    CTR解密流程
    通過對比發現CTR加密即解密,解密即加密,且各分組之間是獨立的,可以併發完成,效率高。

總結

以上五種分組模式中,ECB模式很容易被破解,如今已經很少再使用,其餘四種分組模式各有千秋。
但極力推薦CBC模式和CTR模式,尤其是CTR模式,不需要填充,程式碼實現起來很方便。而且加密和解密的方法是一樣的,並且可以實現併發分組,效率高,安全性也有保障

Q:何時需要填充,何時不需要填充?
A:觀察分組模式的圖示可以看出,加密後再進行亦或操作的不需要填充,而先進性亦或操作再加密的則不需要填充,這是因為亦或操作需要兩個相同長度的資料,一一對比計算!


程式碼實現

篇幅有限,我在這篇帖子用以上分組模式實現了AES、DES、3DES的加密解密(go語言),輕戳瞭解。
CBC模式實現DES和3DES加密解密
CTR模式實現AES加密解密