调试了一天终于把java后台与javascript之间的AES加密解密成功了,记录一下过程。
后台java解密代码:解码算法及模式为
AES/CBC/PKCS5Padding
key与iv要为16位
得到16的字符数组按照16进制编码转化为字符串
public static String encrypt(String content, String key) throwsException {try{
Key keySpec= new SecretKeySpec(key.getBytes(), "AES"); //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
String iv= "1234567890123456";//初始化向量参数,AES 为16bytes. DES 为8bytes.
IvParameterSpec ivSpec= newIvParameterSpec(iv.getBytes());
Cipher cipher= Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec,ivSpec);//Cipher cipher = AesUtil.generateCipher(Cipher.ENCRYPT_MODE,"1234567890123456".getBytes(),"1234567890123456".getBytes());
byte[] byteResult =cipher.doFinal(content.getBytes());
StringBuffer sb= newStringBuffer();for (int i = 0; i < byteResult.length; i++) {
String hex= Integer.toHexString(byteResult[i] & 0xFF);if (hex.length() == 1) {
hex= ‘0‘ +hex;
}
sb.append(hex.toUpperCase());
}returnsb.toString();
}catch(Exception e) {
e.printStackTrace();
}return null;
}
前端JAVASCRIPT代码如下:
37999D4237A3D2701EB368EC53097EC963B5E128D13C8360051ECE37AF7D3A649626AA1D828B9B61813A7557C2C464CDFD913D84C8E507804B51B5904323C8BF为java后台生成的密文
需要先转为16进制字节数组,再转化为BASE64编码才能被
CryptoJS.AES.decrypt方法使用。
key与iv也要经过CryptoJS.enc.Utf8.parse方法转化才能使用。
得到的decrypted1是一个对象,需要进行解析才能使用。
依赖的js文件是CryptoJS v3.1.2:
var encryptedHexStr = CryptoJS.enc.Hex.parse("37999D4237A3D2701EB368EC53097EC963B5E128D13C8360051ECE37AF7D3A649626AA1D828B9B61813A7557C2C464CDFD913D84C8E507804B51B5904323C8BF");
//将密文转为Base64的字符串
//只有Base64类型的字符串密文才能对其进行解密
var encryptedBase64Str =CryptoJS.enc.Base64.stringify(encryptedHexStr);//alert("encryptedBase64Str");
var decrypted1 = CryptoJS.AES.decrypt(encryptedBase64Str, CryptoJS.enc.Utf8.parse("1234567890123456"),
{
iv: CryptoJS.enc.Utf8.parse("1234567890123456"),
mode:CryptoJS.mode.CBC,
padding:CryptoJS.pad.Pkcs7
});
alert(CryptoJS.enc.Utf8.stringify(decrypted1).toString());var txt = (CryptoJS.enc.Utf8.stringify(decrypted).toString());
原文:http://www.cnblogs.com/mafei6827/p/5674359.html