【问题标题】:PyCrypto Decryption MessPyCrypto 解密混乱
【发布时间】:2017-03-24 18:52:42
【问题描述】:

所以我现在正在尝试在 Python 中创建一个简单的 AES 加密/解密系统......但是当它解密时,它在解密的字符串前面有一堆 /xxx/xxx/xxx/xxx/。如何清理它并使其仅打印明文。

我的代码是:

import base64
from Crypto.Cipher import AES
from Crypto import Random

key = b'Sixteen byte key'
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn...')
print (msg)
print (base64.b64encode(msg))

print (cipher.decrypt(msg))

decrypt 的输出如下所示:

b'\xfb\xb8\xf0\xc3\xffH\xfc~\x19[\xecy?\xf8\xcc\x80Attack at dawn...'

【问题讨论】:

标签: python python-3.x encryption cryptography pycrypto


【解决方案1】:

初始化向量 (IV) 是加密消息 (msg) 的一部分,但密文本身应包含 IV。这意味着您必须在解密之前删除 IV,即像这样:

cipher.decrypt(msg[16:])

下一个问题是您不应该使用相同的AES 实例进行加密和解密。 AES 实例包含无法轻松刷新的内部缓冲区。

key = b'Sixteen byte key'

# encryption
iv = Random.new().read(AES.block_size)
cipher = AES.new(key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn...')
print (msg)
print (base64.b64encode(msg))

# decryption
cipher = AES.new(key, AES.MODE_CFB, msg[:16])
print (cipher.decrypt(msg[16:]))

但是当它解密时,它在解密后的字符串前面有一堆 /xxx/xxx/xxx/xxx/。

你很幸运能在最后看到解密的字符串。这只是因为 IV 被预先添加到消息和 CFB 操作模式的内部工作中。如果您使用 CTR 模式,情况会大不相同。

【讨论】:

    【解决方案2】:

    docs 状态:

    这也意味着您不能重用一个对象来使用相同的密钥加密或解密其他数据。

    这有点神秘,但如果似乎意味着您不能重用 cipher 来解密。另外,我不确定您为什么将iv 连接到您的加密消息。

    下面的代码对我来说很好用:

    key = b'Sixteen byte key'
    iv = Random.new().read(AES.block_size)
    c = AES.new(key, AES.MODE_CFB, iv)
    msg = c.encrypt('Attack at dawn...')
    d = AES.new(key, AES.MODE_CFB, iv)
    d.decrypt(msg)
    

    【讨论】:

    • IV 附加在加密数据之前,因此可用于解密,不需要保密。只有加密需要共享,并且可以多次使用。但是对于使用相同密钥的每个加密,IV 应该是唯一的,因此它与加密数据一起提供。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2011-11-29
    • 2010-11-08
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多