Java没有添加PKCS5填充

时间:2017-09-05 20:42:13

标签: java cryptography aes pkcs#7

我对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

1 个答案:

答案 0 :(得分:2)

您正在使用CTR(计数器)模式,这是一种“流密码”模式。您的密文长度与纯文本的长度相同。在CTR模式中,通过加密连续的计数器值来创建伪随机流。此流与纯文本流进行XOR运算以生成密文流。

我实际上有点惊讶的是,加密提供商接受除NoPadding以及点击率模式以外的任何规范。