我使用AES算法BCB模式對文件加密後再對其進行解密,在解密文件中出現了亂碼狀況,與被加密文件不一致,一般都是前十幾個字節是亂碼,後來查找了相關資料才解決了該問題。如下是解決方法:python
對於CBC模式的AES加密,下面的代碼decrypt後沒法獲得原始的data(輸出亂碼),具體緣由見這個帖子,能夠理解爲加密過程當中obj對象的狀態會變化,致使直接用它來解密的話會失效算法
- from Crypto.Cipher import AES
- PADDING = '\0'
- pad_it = lambda s: s+(16 - len(s)%16)*PADDING
- if __name__ == "__main__":
- key = '1234567890123456'
- data = 'qwertyuiopasdfgh'
- obj = AES.new(key, AES.MODE_CBC)
- crypt = obj.encrypt(data)
- print crypt
- recovery = obj.decrypt(crypt) #有問題
- print recovery
須要改爲以下代碼:ide
- from Crypto.Cipher import AES
- PADDING = '\0'
- pad_it = lambda s: s+(16 - len(s)%16)*PADDING
- if __name__ == "__main__":
- key = '1234567890123456'
- data = 'qwertyuiopasdfgh'
- obj = AES.new(key, AES.MODE_CBC)
- crypt = obj.encrypt(data)
- print crypt
- obj2 = AES.new(key, AES.MODE_CBC)
- recovery = obj2.decrypt(crypt)
- print recovery
而ECB模式沒有這個問題,由於他不是block chaining的ui
原文地址:http://teloon.tiddlyspot.com/google