编程语言
首页 > 编程语言> > python – 使用3DES和CBC破坏我的加密数据的前8个字节

python – 使用3DES和CBC破坏我的加密数据的前8个字节

作者:互联网

我在应用程序中使用PyCrypto来加密数据,但由于某种原因,无论我做什么,前8个字节(对应于第一个块)都会损坏.

>>> 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'

我已经读到这是IV已损坏的迹象,但是这些消息来源还说使用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的块大小.

解决方法:

您必须在解密之前重置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

标签:python,cryptography,corruption,pycrypto
来源: https://codeday.me/bug/20190520/1142610.html