【问题标题】:Why must all inputs to AES be multiples of 16?为什么 AES 的所有输入都必须是 16 的倍数?
【发布时间】:2013-07-21 14:35:52
【问题描述】:

我正在使用 AES 的 PyCrypto 实现,我正在尝试使用 24 字节密钥加密一些文本(24 字节)。

aes_ecb = AES.new('\x00'*24, AES.MODE_ECB)
aes_ecb.encrypt("123456"*4)

我收到了这个令人惊讶的错误ValueError: Input strings must be a multiple of 16 in length
那么为什么我的输入必须是 16 的倍数呢?输入字符串长度必须是我的密钥大小的倍数对我来说更有意义,因为这将允许在密钥和明文块之间进行良好的按位操作。

【问题讨论】:

    标签: aes pycrypto


    【解决方案1】:

    AES 是block cipher。引用自 Wikipedia 页面:“分组密码是一种在固定长度的位组上运行的确定性算法”。

    AES 只能处理 128 位的块(即 16 个字符,如您所见)。

    如果您的输入长度可能不是 128 的倍数,则取决于您的应用程序,您可能必须非常小心如何处理 padding

    【讨论】:

    • 然后在引擎盖下,AES 填充我的密钥,使其成为 16 的倍数?
    • @Mark 输入必须是块大小的倍数,而不是键。 AES 允许密钥大小为 128、192 和 256。一个块的加密不是密钥和块之间的简单异或,它更复杂,并且不需要块大小与密钥大小相同。
    【解决方案2】:

    只想添加有关操作模式的信息

    是的,AES 是一个 128 位(16 字节)分组密码,具有多个可能的密钥长度(128、192、256),但此文本填充限制(和错误消息)的原因是 ECB mode of operation。 ECB 是最简单的加密模式。我不知道你的目标,所以将跳过它不提供严格的消息机密性的部分。

    CBC 和 CTR 更常见,通常适合使用,在 CTR 模式下,您不需要 128 位消息长度。

    还有用于 ECB 和 CBC 模式的 ciphertext stealing (CTS) 方法。

    使用分组密码操作模式的方法,允许 处理不能均匀分成块的消息 不会导致密文的任何扩展,代价是 稍微增加复杂性

    但 ECB 模式的密文窃取要求明文长度超过一个 128 位块。

    【讨论】:

      【解决方案3】:

      因为block size是16字节,处理的方法是加密时add padding

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 1970-01-01
        • 2019-01-04
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多