對稱加密演算法常用的五種分組模式(ECB/CBC/CFB/OFB/CTR)
阿新 • • 發佈:2018-11-17
版權宣告:本文為作者原創,如需轉載,請註明出處
https://blog.csdn.net/weixin_42940826
注:以下圖片來自於《圖解密碼學》,這本書講的更全面細緻,建議閱讀,在我資源庫中有此書,還有使用go語言具體實現和解釋此書中的各種加密演算法的文件,有需要的可以自習前往免費下載
Q:為什麼需要分組模式?
A:明文的長度不固定,而分組密碼只能處理特定長度的一塊資料,這就需要對分組密碼的演算法進行迭代,以便將一段很長的明文全部加密,而迭代的方法就是分組的模式。
一圖全覽五種分組模式
五種模式詳解
1. ECB - Electronic Code Book, 電子密碼本模式
- 特點: 簡單, 效率高, 密文有規律, 容易被破解
- 最後一個明文分組必須要填充
- des/3des -> 最後一個分組填充滿8位元組
- aes -> 最後一個分組填充滿16位元組
- 不需要初始化向量
2. CBC - Cipher Block Chaining, 密碼塊鏈模式(推薦使用)
- 特點: 密文沒有規律, 經常使用的加密方式
- 最後一個明文分組需要填充
- des/3des -> 最後一個分組填充滿8位元組
- aes -> 最後一個分組填充滿16位元組
- 需要一個初始化向量 - 一個數組
- 陣列的長度: 與明文分組相等
- 資料來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
3. CFB - Cipher FeedBack, 密文反饋模式
- 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
- 需要一個初始化向量 - 一個數組
- 陣列的長度: 與明文分組相等
- 資料來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
- 不需要填充
4. OFB - Output-Feedback, 輸出反饋模式
- 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
- 需要一個初始化向量 - 一個數組
- 陣列的長度: 與明文分組相等
- 資料來源: 負責加密的人的提供的
- 加解密使用的初始化向量值必須相同
- 不需要填充
5. CTR - CounTeR, 計數器模式(重點,推薦使用)
- 特點: 密文沒有規律, 明文分組是和一個數據流進行的按位異或操作, 最終生成了密文
- 不需要初始化向量
- go介面中的iv可以理解為隨機數種子, iv的長度 == 明文分組的長度
- 不需要填充
這裡我們有必要給出CTR模式額解密流程,因為CTR模式的解密和加密是一模一樣的過程,在程式實現中也是可逆的,具體程式在文章實現底部有連結
通過對比發現CTR加密即解密,解密即加密,且各分組之間是獨立的,可以併發完成,效率高。
總結
以上五種分組模式中,ECB模式很容易被破解,如今已經很少再使用,其餘四種分組模式各有千秋。
但極力推薦CBC模式和CTR模式,尤其是CTR模式,不需要填充,程式碼實現起來很方便。而且加密和解密的方法是一樣的,並且可以實現併發分組,效率高,安全性也有保障
Q:何時需要填充,何時不需要填充?
A:觀察分組模式的圖示可以看出,加密後再進行亦或操作的不需要填充,而先進性亦或操作再加密的則不需要填充,這是因為亦或操作需要兩個相同長度的資料,一一對比計算!
程式碼實現
篇幅有限,我在這篇帖子用以上分組模式實現了AES、DES、3DES的加密解密(go語言),輕戳瞭解。
CBC模式實現DES和3DES加密解密
CTR模式實現AES加密解密