我尝试在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);
}
答案 0 :(得分:1)
您使用的密钥派生功能是不同的。 CryptoJS(版本3)使用OpenSSL兼容密钥派生函数,而您使用PBKDF1(或可能是2,您的算法不包括在内)。您可能需要查找EVP_BytesToKey
的实施,例如here。或者,您当然可以寻找整个OpenSSL兼容层。
如果密钥或数据不同,那么您应该期望CBC / ECB模式的填充错误;如果数据大小是块大小的倍数(并且在实例化/初始化期间已接受密钥/算法),则它是唯一可以抛出的错误。