我使用AES算法BCB模式对文件加密后再对其进行解密,在解密文件中出现了乱码情况,与被加密文件不一致,通常都是前十几个字节是乱码,后来查找了相关资料才解决了该问题。以下是解决方法:
对于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
需要改成如下代码:
- 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的
原文地址:http://teloon.tiddlyspot.com/
转载于:https://blog.51cto.com/ddkangfu/484801