我对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
答案 0 :(得分:2)
您正在使用CTR(计数器)模式,这是一种“流密码”模式。您的密文长度与纯文本的长度相同。在CTR模式中,通过加密连续的计数器值来创建伪随机流。此流与纯文本流进行XOR运算以生成密文流。
我实际上有点惊讶的是,加密提供商接受除NoPadding
以及点击率模式以外的任何规范。