Java 使用AES算法解密消息时异常:给定的最终块未正确填充
我想用AES算法进行解密 我的代码如下:Java 使用AES算法解密消息时异常:给定的最终块未正确填充,java,encryption,Java,Encryption,我想用AES算法进行解密 我的代码如下: public static String decrypt(String key, byte[] encrypted) throws GeneralSecurityException { byte[] raw = key.getBytes(Charset.forName("US-ASCII")); if (raw.length != 16) { throw new Illeg
public static String decrypt(String key, byte[] encrypted)
throws GeneralSecurityException {
byte[] raw = key.getBytes(Charset.forName("US-ASCII"));
if (raw.length != 16) {
throw new IllegalArgumentException("Invalid key size.");
}
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec,new IvParameterSpec(new byte[16]));
byte[] original = cipher.doFinal(encrypted);
return new String(original, Charset.forName("US-ASCII"));
}
为什么我会得到这个例外 AES是一种分组密码,以16字节的块进行加密。填充用于填充消息,使其大小为16字节的倍数PKCS-5填充将缺少的字节数确定为16的倍数,然后写入此数字,直到填充充分为止 这样的信息(十六进制): 会像这样被填充
D1 F2 05 7E 97 54 27 89 F2 07 07 07 07 07 07 07
-------------------- pad
解密消息时,将检查填充是否正确。如果没有,那就是出了问题
典型原因:
通常,当填充错误时,整个解密都会出错。在解密中使用NOP只能消除症状,而不能解决问题
以下所有情况都可能触发填充异常:
- 解密时使用错误的IV
- 解密时使用错误的密钥
- 解密时使用错误的链接模式(CBC)
- 或使用错误的填充模式(!)
D1 F2 05 7E 97 54 27 89 F2 07 07 07 07 07 07 07
-------------------- pad