例如,如果消息的长度为 16 字节: 字符串消息 =“AAAAAAAAAAAAAAA” byte[] plaintext = message.getBytes();//plaintext.length = 16
输出的密文长度为 32 字节,这表明这里有 2 个 block ,第二个 block 已被填充。
然而,如果消息长度为 15 字节或更短: 字符串消息 =“AAAAAAAAAAAAAAA” byte[] plaintext = message.getBytes();//plaintext.length = 15
输出密文也将是 16 字节长。
既然AES的 block 是16字节长,为什么16字节的明文消息会被分成两个 block 并进行填充?
谢谢!
最佳答案
这实际上取决于加密模式。有些模式根本不需要填充,但是需要填充的模式确实要求 block 长度倍数的消息包含一个充满填充字节的附加 block ,否则数据是否填充会变得不明确。
由于一些消息将被填充,算法将总是查看最后字节并将它们解释为填充信息。因此,所有消息都必须被填充,即使是那些一开始就具有合适长度的消息。
例如,如果您的填充方案添加了字节,其值是填充 block 的缺失字节数,并且您的消息以 01
或 02 02
、03 03 03
等结尾。您将不知道它是填充还是数据。
关于java - 为什么 Java 加密 AES 会填充我的 16 字节明文消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057966/