Iam在JavaScript中加密并在Java中解密,但低于错误:
java中抛出的错误: java.lang.Exception:给定最终块未正确填充
以下是我的Java脚本代码:
var key =CryptoJS.enc.Utf8.parse("0123456789012345");
var ive = CryptoJS.enc.Utf8.parse("0123456789012345");
var encrypted = CryptoJS.AES.encrypt(password, key, {iv: ive});
console.log('encrypted msg = ' + encrypted.toString());
var afterEncryptionText = encrypted.toString();
console.log("encrypted password: " + afterEncryptionText);
Java代码:
public String decrypt(String cipherText) throws Exception {
try {
String encryptionKey = "0123456789012345";
String ive = "0123456789012345";
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding", "SunJCE");
final SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ive.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText.getBytes("UTF-8")),"UTF-8");
}
catch(Exception e){
throw new Exception(e.getMessage());
}
}
答案 0 :(得分:0)
我发现将加密数据表示为字符串往往会导致有损转换。当我试图将加密的字节直接转换为字符串时,我通常会丢失映射到某些控制字符的字节或字节对。
我建议直接在加密后传输字节。如果那是不可能的,或者你不习惯这样做,我建议将加密的字节表示为数字(比如base-16或base-64),传输包含数字的字符串,在接收时解析数字通过执行表示过程的反转并解密这些字节来获取该数字的字节。例如,可以使用BigInteger
类来完成此操作,或者您可以编写自己的base-16编码器。