原文: https://blog.csdn.net/bobozhangyx/article/details/80528893
使用Google的前端加密套件CryptoJS实现基于AES前后端的加/解密交互。
官方github地址:https://github.com/brix/crypto-js
前端加密demo
<script src="crypto-js-develop/src/core.js"></script>
<script src="crypto-js-develop/src/cipher-core.js"></script>
<script src="crypto-js-develop/src/mode-ecb.js"></script>
<script src="crypto-js-develop/src/aes.js"></script>
<script>
var key = CryptoJS.enc.Utf8.parse("8NONwyJtHesysWpM");
var plaintText = 'ABCDEFGH'; // 明文
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
console.log("加密前:"+plaintText + '');
console.log("加密后:"+encryptedData + '');
</script>
注意:(1)js之间存在依赖关系,不能改变js引入的顺序。
(2)加密结果是16进制的字符串,因此在后端处理时需要将16进制转为字节数组。
(3)js转化出的encryptedData是个对象,隐式转化下 var str = encryptedData + "";
后端解密demo
/**
* PKCS5Padding -- Pkcs7 两种padding方法都可以
* @param content 3c2b1416d82883dfeaa6a9aa5ecb8245 16进制
* @param key
* @return
*/
public static String decryptAES(String content, String key) {
try {
content = replaceUnSpecial(content);
SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式"
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
return new String(cipher.doFinal(parseHexStr2Byte(content)));
} catch (Exception e) {
e.printStackTrace();
MonitorLogger.getInstance().log("AES.desEncrypt fail", e);
}
return null;
}
/**将16进制转换为二进制
* @param hexStr
* @return
*/
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1)
return null;
byte[] result = new byte[hexStr.length()/2];
for (int i = 0;i< hexStr.length()/2; i++) {
int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}
-
注意:js使用PKCS7的补码方式,其实和PKCS5是一致的。
后记:
AES还支持CBC加密的方式。