Java版
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;
public class AESUtils {
private static final String CIPHER_ALGORITHM_CBC = "AES/CBC/PKCS5Padding";
private static final String KEY_ALGORITHM = "AES";
/**
* AES加密
*
* @param data 要加密的数据
* @param key key 长度16
* @param iv iv 长度16
* @return 加密后的数据byte[]
* @throws Exception
*/
public static byte[] encrypt(byte[] data, byte[] key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
Key k = new SecretKeySpec(key, KEY_ALGORITHM);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, k, paramSpec);
return cipher.doFinal(data);
}
/**
* AES解密
*
* @param bytes 加密后的数据byte[] bytes
* @param key key 长度16
* @param iv iv 长度16
* @return 解密后的数据
* @throws Exception
*/
public static byte[] decrypt(byte[] bytes, byte[] key, byte[] iv) throws Exception {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC);
Key k = new SecretKeySpec(key, KEY_ALGORITHM);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, k, paramSpec);
return cipher.doFinal(bytes);
}
/**
* AES加密后转base64
*
* @param data 要加密的数据
* @param key key 长度16
* @param iv iv 长度16
* @return base64
* @throws Exception
*/
public static String encodeToBase64String(String data, byte[] key, byte[] iv) throws Exception {
return Base64.getEncoder().encodeToString(encrypt(data.getBytes(StandardCharsets.UTF_8), key, iv));
}
/**
* 解密经AES加密后的base64
*
* @param data 经AES加密后的base64
* @param key key 长度16
* @param iv iv 长度16
* @return 解密后的数据
* @throws Exception
*/
public static String decodeFromBase64String(String data, byte[] key, byte[] iv) throws Exception {
byte[] bytes = Base64.getDecoder().decode(data);
return new String(decrypt(bytes, key, iv));
}
public static void main(String[] args) {
try {
byte[] key = "S0JsiZY2eHlgnRmv".getBytes();
byte[] iv = "kezfopM2kJUn1VUN".getBytes();
System.out.println("key:" + new String(key));
System.out.println("iv:" + new String(iv));
String content = "这是原始数据";
String cipher = AESUtils.encodeToBase64String(content, key, iv);
System.out.println("加密后的数据 -> \"" + cipher + "\"");
String plain = AESUtils.decodeFromBase64String(cipher, key, iv);
System.out.println("解密后的数据 -> \"" + plain + "\"");
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出
key:S0JsiZY2eHlgnRmv
iv:kezfopM2kJUn1VUN
加密后的数据 -> "cbHhL/Zmwtu6ffZL8sgIgUmAci1X9GdGIPl9/DMNOUQ="
解密后的数据 -> "这是原始数据"
JavaScript版
安装
npm install crypto-js --save
github地址:https://github.com/brix/crypto-js
// import CryptoJS from 'crypto-js'
let CryptoJS = require('crypto-js')
/**
* AES加密
* @param {string} data 要加密的数据
* @param {string} key 长度16
* @param {string} iv 长度16
* @returns 返回base64
*/
function Encrypt(data, key, iv) {
if (key && iv) {
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
}
let srcs = CryptoJS.enc.Utf8.parse(data);
let encrypt = CryptoJS.AES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.CBC, //AES加密的模式
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Base64.stringify(encrypt.ciphertext);
}
/**
* AES 解密
* @param {string} data 经AES加密后base64编码后的数据
* @param {string} key 长度16
* @param {string} iv 长度16
* @returns 解密后的数据
*/
function Decrypt(data, key, iv) {
if (key && iv) {
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
}
let base64 = CryptoJS.enc.Base64.parse(data);
let src = CryptoJS.enc.Base64.stringify(base64);
let decrypt = CryptoJS.AES.decrypt(src, key, {
iv: iv,
mode: CryptoJS.mode.CBC, //AES解密的模式
padding: CryptoJS.pad.Pkcs7
});
return decrypt.toString(CryptoJS.enc.Utf8).toString();
}
function test() {
let key = 'S0JsiZY2eHlgnRmv'
let iv = 'kezfopM2kJUn1VUN'
let data = '这是原始数据'
let encrypted = Encrypt(data, key, iv)
console.log("加密后的数据:" + encrypted)
console.log("解密后的数据:" + Decrypt(encrypted, key, iv))
}
test()
输出
加密后的数据:cbHhL/Zmwtu6ffZL8sgIgUmAci1X9GdGIPl9/DMNOUQ=
解密后的数据:这是原始数据