【问题标题】:First 8 byes of my encrypted data corrupting using 3DES and CBC使用 3DES 和 CBC 破坏我的加密数据的前 8 个字节
【发布时间】:2013-05-02 23:37:05
【问题描述】:

我在应用程序中使用 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 的块大小。

【问题讨论】:

    标签: python cryptography corruption pycrypto


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多