調試了一天終於把java后台與javascript之間的AES加密解密成功了,記錄一下過程。
后台java解密代碼:解碼算法及模式為
AES/CBC/PKCS5Padding
key與iv要為16位
得到16的字符數組按照16進制編碼轉化為字符串
public static String encrypt(String content, String key) throws Exception { try { Key keySpec = new SecretKeySpec(key.getBytes(), "AES"); //兩個參數,第一個為私鑰字節數組, 第二個為加密方式 AES或者DES String iv = "1234567890123456";//初始化向量參數,AES 為16bytes. DES 為8bytes. IvParameterSpec ivSpec = new IvParameterSpec(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 = new StringBuffer(); 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()); } return sb.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:<script type="text/javascript" src="js/aes.js"></script>
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());
