前端js实现方式
导入文件
首先导入crypto-js.min.js :
https://github.com/tu-gou/CryptoTools/blob/main/crypto-js.min.js
创建文件
然后创建AES.js文件,使用此文件内的函数进行AES加密。
文件内容如下:
const k='uUXsN6okXYqsh0BB';
function AES_Encrypt(data) {
// 定义前端Key秘钥-需要注意 跟后端解密秘钥保持一致
let key=k;
key = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encrypted.ciphertext.toString()));
}
function AES_Decrypt(word) {
let key=k;
key = CryptoJS.enc.Utf8.parse(key);
let decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr;
}
其中k为密钥,可以随意编写,但需要保证16位长度。 这两个函数提供了AES加密和对应的解密功能。
使用方式
需要使用什么功能就可以把对应的函数放到需要进行加解密手段的js文件中。然后通过函数调用来使用。
例如使用加密功能:
const k='uUXsN6okXYqsh0BB';
function AES_Encrypt(data) {
// 定义前端Key秘钥-需要注意 跟后端解密秘钥保持一致
let key=k;
key = CryptoJS.enc.Utf8.parse(key);
let encrypted = CryptoJS.AES.encrypt(data, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Hex.parse(encrypted.ciphertext.toString()));
}
let cipher = AES_Encrypt(plaintext);
、
后端java实现
创建工具类
首先创建一个AES的工具类AESUtils.java
/**
* 加密方法,采用AES_128位
* @param plainText
* @param secretKey
* @return
*/
public static String encrypt(String plainText, String secretKey) {
if (secretKey == null) {
throw new IllegalArgumentException("sSrc不能为空");
}
// 判断Key是否为16位
if (secretKey.length() != 16) {
throw new IllegalArgumentException("sKey长度需要为16位");
}
try {
byte[] raw = secretKey.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretkeySpec = new SecretKeySpec(raw, "AES");
//"算法/模式/补码方式"
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretkeySpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
//此处使用BASE64做转码功能,同时能起到2次加密的作用。
return new Base64().encodeToString(encrypted);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 解密方法 对AES_128位解密
* @param cipherText
* @return
*/
public static String decrypt(String cipherText,String secretKey) {
try {
byte[] raw = secretKey.getBytes(StandardCharsets.UTF_8);
SecretKeySpec secretkeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretkeySpec);
//先用base64解密
byte[] encrypted1 = new Base64().decode(cipherText);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, StandardCharsets.UTF_8);
return originalString;
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
使用工具类
直接在需要使用AES的文件中导入工具类,使用相应的方法即可。