为什么AES的所有输入必须是16的倍数?

时间:2013-07-21 14:35:52

标签: aes pycrypto

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

3 个答案:

答案 0 :(得分:5)

AES是block cipher。来自维基百科页面的引用:“分组密码是一种在固定长度的比特组上运行的确定性算法”。

AES只能使用128位的块(即16个字符,正如您所注意到的那样)。

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

答案 1 :(得分:2)

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

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

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

ECB和CBC模式也有mode of operation方法。

  

使用允许的分组密码操作模式的方法   处理不可均分为块的消息   没有导致密文的任何扩展,代价是   复杂性略有增加

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

答案 2 :(得分:1)

由于block size是16个字节,因此加密时处理此问题的方法是add padding