Java 不添加 PKCS5 填充

Java not adding PKCS5 padding

我对 PKCS5 and PKCS7 填充的理解是,它们在加密前向纯文本添加字节,因此最后一个块已满。密文解密后,检查最后一个块,填充字节标记哪些字节是填充的,哪些是纯文本。

当我在Java中使用128位AES和PKCS5加密8个字节(小于一个块)时,doFinal()的结果只有8个字节。

是不是没有应用 PKCS7,还是我错过了它的工作原理?

Random secureRandom = new SecureRandom();

byte[] ctr = new byte[16];
byte[] keyBytes = new byte[16];

secureRandom.nextBytes(ctr);
secureRandom.nextBytes(keyBytes);

IvParameterSpec ivSpec = new IvParameterSpec(ctr);
Key key = new SecretKeySpec(keyBytes, "AES");

byte[] plainText = new byte[8];

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

byte[] cipherText = cipher.doFinal(plainText);
System.out.println(cipherText.length);

8

您正在使用 CTR(计数器)模式,这是一种 "stream cipher" 模式。您的密文将与纯文本的长度相同。在 CTR 模式下,通过对连续的计数器值进行加密来创建伪随机流。此流与纯文本流进行异或运算以生成密文流。

密码提供者接受除 NoPadding 以外的任何规范与 CTR 模式相结合,这让我感到有些惊讶。