2013-05-02 28 views
4

我使用PyCrypto在应用程序中的数据进行加密的,但由于某些原因,第8个字节(相当于第一块)通过腐败来不管我做。前8轮轮空我的加密数据破坏使用3DES和CBC

>>> from Crypto.Cipher import DES3 
>>> from Crypto import Random 
>>> iv = Random.new().read(DES3.block_size) 
>>> key = Random.new().read(DES3.key_size[-1]) 
>>> des3 = DES3.new(key, DES3.MODE_CBC, iv) 
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678')) 
't\x1b\x0f\xcbD\x15M\xababcdefgh12345678' 

我读过,这是一个迹象,表明四是腐败,但这些消息人士还称,使用比其他CBC模式将导致整个消息损坏。这不是这种情况:

>>> des3 = DES3.new(key, DES3.MODE_CFB, iv) 
>>> des3.decrypt(des3.encrypt('12345678abcdefgh12345678')) 
'\xe1\x85\xae,\xf1m\x83\x9cabcdefgh12345678' 

我还可以排除密码作为原因:

>>> from Crypto.Cipher import AES 
>>> from Crypto import Random 
>>> iv = Random.new().read(AES.block_size) 
>>> key = Random.new().read(AES.key_size[-1]) 
>>> aes = AES.new(key, AES.MODE_CBC, iv) 
>>> aes.decrypt(aes.encrypt('12345678abcdefgh12345678abcdefgh')) 
'\xa7l\x00]\x1cW\xec\xd0\x04\x06\xba&\x1663\xd712345678abcdefgh' 

注意,在本实施例中前16个字节是腐败,其对应于AES”块尺寸。

回答

5

您必须在解密前重置IV矢量。试试这个代码:

>>> from Crypto.Cipher import DES3 
>>> from Crypto import Random 
>>> iv = Random.new().read(DES3.block_size) 
>>> key = Random.new().read(DES3.key_size[-1]) 
>>> des3enc = DES3.new(key, DES3.MODE_CBC, iv) 
>>> des3dec = DES3.new(key, DES3.MODE_CBC, iv) 
>>> des3dec.decrypt(des3enc.encrypt('12345678abcdefgh12345678')) 

IV矢量在加密/解密每个块后发生变化。您使用了DES3类的相同实例来加密和解密该消息,因此您的解密不正确。

希望上面的代码工作 - 我没有测试它。

关于CBC模式的更多信息:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

+0

您绝对正确。谢谢! – rspeed 2013-05-03 15:19:10