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 模式相结合,这让我感到有些惊讶。
我对 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 模式相结合,这让我感到有些惊讶。