为什么Java crypto AES会将我的明文消息填充到16字节?

为什么Java crypto AES会将我的明文消息填充到16字节?,java,encryption,aes,Java,Encryption,Aes,例如,如果消息长度为16字节: 字符串消息=“aaaaaaaaaaaaaa” 字节[]明文=message.getBytes()//纯文本。长度=16 输出cyphtertext的长度为32字节,这表示这里有2个块,第二个块已填充 鉴于,如果消息长度为15字节或更短: 字符串消息=“aaaaaaaaaaaaaaaa” 字节[]明文=message.getBytes()//纯文本。长度=15 输出的cyphertext也将是16字节长 既然AES的块是16字节长的,为什么16字节的明文信息会被分成

例如,如果消息长度为16字节: 字符串消息=“aaaaaaaaaaaaaa” 字节[]明文=message.getBytes()//纯文本。长度=16

输出cyphtertext的长度为32字节,这表示这里有2个块,第二个块已填充

鉴于,如果消息长度为15字节或更短: 字符串消息=“aaaaaaaaaaaaaaaa” 字节[]明文=message.getBytes()//纯文本。长度=15

输出的cyphertext也将是16字节长

既然AES的块是16字节长的,为什么16字节的明文信息会被分成两个块并进行填充


谢谢!

这实际上取决于加密模式。有些模式根本不需要填充,但需要填充的模式确实要求块长度的倍数的消息包含一个充满填充字节的额外块,否则,如果数据是否被填充,则变得不明确

由于某些消息将被填充,因此算法将始终查看最后的字节并将其解释为填充信息。因此,所有消息都必须进行填充,即使是那些具有适当长度的消息


例如,如果您的填充方案添加的字节数是要填充块的缺失字节数,而您的消息以
01
02
03 03
等结尾。您将不知道它是填充还是数据。

您能显示代码吗?你可能有虫。非常感谢。因此,如果消息长度为15字节,则填充将为01,如果消息长度为14字节,则填充将为02,如果消息长度为16字节,则算法将创建另一个块,该块本身是填充,它将为10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10。我明白了吗?是的,就是这样。但是请注意,它只是一种特殊的填充方案,称为PKCS#7,可能是最常用的,但也有其他填充方案。在任何情况下,如果明文是块长度的倍数,将添加完整的虚拟块。