我使用AES算法BCB模式对文件加密后再对其进行解密,在解密文件中出现了乱码情况,与被加密文件不一致,通常都是前十几个字节是乱码,后来查找了相关资料才解决了该问题。以下是解决方法:

对于CBC模式的AES加密,下面的代码decrypt后无法得到原始的data(输出乱码),具体原因见这个帖子,可以理解为加密过程中obj对象的状态会变化,导致直接用它来解密的话会失效

 

 
  
  1. from Crypto.Cipher import AES 
  2.  
  3. PADDING = '\0' 
  4. pad_it = lambda s: s+(16 - len(s)%16)*PADDING 
  5.  
  6. if __name__ == "__main__":  
  7.     key = '1234567890123456' 
  8.     data = 'qwertyuiopasdfgh' 
  9.     obj = AES.new(key, AES.MODE_CBC)     
  10.     crypt = obj.encrypt(data)   
  11.     print crypt   
  12.     recovery = obj.decrypt(crypt)  #有问题   
  13.     print recovery   

需要改成如下代码:

 
  
  1. from Crypto.Cipher import AES   
  2.     
  3. PADDING = '\0'   
  4. pad_it = lambda s: s+(16 - len(s)%16)*PADDING      
  5. if __name__ == "__main__":   
  6.     key = '1234567890123456'   
  7.     data = 'qwertyuiopasdfgh'   
  8.     obj = AES.new(key, AES.MODE_CBC)   
  9.     crypt = obj.encrypt(data)   
  10.     print crypt   
  11.     obj2 = AES.new(key, AES.MODE_CBC)   
  12.     recovery = obj2.decrypt(crypt)   
  13.     print recovery 

ECB模式没有这个问题,因为他不是block chaining的

 

原文地址:http://teloon.tiddlyspot.com/