我使用3DES和CBC破坏加密数据的前8个错误

2024-04-25 19:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个应用程序中使用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以外的模式会导致整个消息的损坏。事实并非如此:

^{pr2}$

我也可以排除密码的原因:

>>> 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的块大小相对应。在


Tags: keyfromimportnewreadsize字节random
1条回答
网友
1楼 · 发布于 2024-04-25 19:18:56

你必须在解密前重置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类实例来加密和解密消息,因此解密时使用了不正确的IV。在

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

有关CBC模式的详细信息:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

相关问题 更多 >

    热门问题