我使用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只能处理128位的块(如您所注意到的,即16个字符)。
如果您的输入的长度可能不是128的倍数,则取决于您的应用程序,您可能必须非常小心如何处理填充。
只想添加有关操作模式的信息
是的,AES是一个128位(16字节)的分组密码,具有多个可能的密钥长度(128192256),但这种文本填充限制(和错误消息)的原因是ECB操作模式。ECB是最简单的加密模式。我不知道你的目标,所以我将跳过它没有提供严重的消息机密性这一部分。
CBC和CTR更常见,通常适合使用,在CTR模式下,您不需要128位的消息长度。
对于ECB和CBC模式,还有密文窃取(CTS)方法。
使用块密码操作模式的方法,该操作模式允许处理不可等分为块的消息而不会导致密文的任何扩展,代价是稍微增加了的复杂性
但是ECB模式的密文窃取要求明文比一个128位块长。
由于块大小为16字节,因此处理此问题的方法是在加密时添加填充。