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