javax.crypto.BadPaddingException:给定最终块没有正确填充Exception
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javax.crypto.BadPaddingException:给定最终块没有正确填充Exception相关的知识,希望对你有一定的参考价值。
我试图在javascript中加密JSON,如下所示,它是加密的。在下面“obj”是我的JSON数据,我不知道为什么“ency_key”,我从谷歌的某些地方跟着这个,他们就像那样传递了String。
var obj1 = CryptoJS.AES.encrypt(obj,'ency_key').toString();
$.ajax({
url: "web/enyDcyData",
"type": "POST",
async:true,
data:{
json:obj1,
}
但我无法解密java中的数据,我在java中尝试过如下。我得到javax.crypto.BadPaddingException:给定最后一个块在“doFinal(base64Decode(ency_data))”中没有正确填充异常;“我做错了,请帮我解决这个问题。
public static String decrypt(String ency_data)
SecretKeyFactory keyFac = SecretKeyFactory.getInstance(one);
SecretKey seckey = keyFac.generateSecret(new PBEKeySpec(two));
Cipher cipher = Cipher.getInstance(one);
pbeCipher.init(Cipher.DECRYPT_MODE, seckey , new PBEParameterSpec(SALT, 20));
byte[] res = cipher.doFinal(base64Decode(ency_data));
String decryptedValue = new String(res,"UTF-8");
}
private static byte[] base64Decode(String ency_data) throws IOException {
return new BASE64Decoder().decodeBuffer(ency_data);
}
答案
您使用的密钥派生函数是不同的。 CryptoJS(版本3)使用OpenSSL兼容密钥派生函数,而您使用PBKDF1(或可能是2,您的算法不包括在内)。您可能需要查找EVP_BytesToKey
的实现,例如here。或者,您当然可以寻找整个OpenSSL兼容层。
如果密钥或数据不同,那么您应该期望CBC / ECB模式的填充错误;如果数据大小是块大小的倍数(并且在实例化/初始化期间接受了密钥/算法),则它是唯一可以抛出的错误。
以上是关于javax.crypto.BadPaddingException:给定最终块没有正确填充Exception的主要内容,如果未能解决你的问题,请参考以下文章