java - 为什么 Java 加密 AES 会填充我的 16 字节明文消息?

标签 java encryption aes

例如,如果消息的长度为 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 的缺失字节数,并且您的消息以 0102 0203 03 03 等结尾。您将不知道它是填充还是数据。

关于java - 为什么 Java 加密 AES 会填充我的 16 字节明文消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22057966/

相关文章:

c++ - AES 限制和混合列

java - POI Java Excel解决方案——缩进值

java - 找到随后的数字行(由非字母字符分隔)并计算它们

java - 在Java中再次向下转换执行父构造函数?

c++ - 如何使用 kotlin 正确解密 c++ aes Rijndael CBC?

python - 使用 AES+CTR 的 PyCrypto 问题

java - 我在 android 5.0.2 源中找到 WIFI_SCANNING_SERVICE 但无法使用此服务

c - VB在3DES加密后无法检索字符串

java - 在服务器端解密加密消息

c# - 一个新的随机初始化向量在加密过程中总是产生相同的密文