5

我正在使用 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 的倍数?输入字符串长度必须是我的密钥大小的倍数对我来说更有意义,因为这将允许在密钥和明文块之间进行良好的按位操作。

4

3 回答 3

5

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

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

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

于 2013-07-21T14:38:32.537 回答
2

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

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

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

ECB 和 CBC 模式还有密文窃取 (CTS)方法。

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

但是 ECB 模式的密文窃取要求明文长于一个 128 位块。

于 2013-07-25T03:51:09.697 回答
1

因为块大小是 16 字节,所以处理这个问题的方法是在加密时添加填充。

于 2013-07-21T14:40:04.907 回答