java
package com.ys.common.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
/**
* @author lqp
* @description /aes加密解密
* @date 2021/2/5 11:44
*/
public class AesUtil {
private static final String ALGORITHM = "AES/ECB/PKCS5Padding"; //"算法/模式/补码方式"
/*****************************************************
* AES加密
* @param content 加密内容
* @param key 加密密码,由字母或数字组成
此方法使用AES-128-ECB加密模式,key需要为16位
加密解密key必须相同,如:abcd1234abcd1234
* @return 加密密文
****************************************************/
public static String enCode(String content, String key) {
if (key == null || "".equals(key)) {
return null;
}
if (key.length() != 16) {
return null;
}
try {
//获得密码的字节数组
byte[] raw = key.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(ALGORITHM);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
cipher.init(Cipher.ENCRYPT_MODE, skey);
//获取加密内容的字节数组(设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
byte [] byte_content = content.getBytes("utf-8");
//密码器加密数据
byte [] encode_content = cipher.doFinal(byte_content);
//将加密后的数据转换为字符串返回
return Base64.encodeBase64String(encode_content);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*****************************************************
* AES解密
* @param content 加密密文
* @param key 加密密码,由字母或数字组成
此方法使用AES-128-ECB加密模式,key需要为16位
加密解密key必须相同
* @return 解密明文
****************************************************/
public static String deCode(String content, String key) {
if (key == null || "".equals(key)) {
return null;
}
if (key.length() != 16) {
return null;
}
try {
//获得密码的字节数组
byte[] raw = key.getBytes();
//根据密码生成AES密钥
SecretKeySpec skey = new SecretKeySpec(raw, "AES");
//根据指定算法ALGORITHM自成密码器
Cipher cipher = Cipher.getInstance(ALGORITHM);
//初始化密码器,第一个参数为加密(ENCRYPT_MODE)或者解密(DECRYPT_MODE)操作,第二个参数为生成的AES密钥
cipher.init(Cipher.DECRYPT_MODE, skey);
//把密文字符串转回密文字节数组
byte [] encode_content = Base64.decodeBase64(content);
//密码器解密数据
byte [] byte_content = cipher.doFinal(encode_content);
//将解密后的数据转换为字符串返回
return new String(byte_content,"utf-8");
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*****************************************************
* AES加密解密测试
* @param args
* @return
****************************************************/
public static void main(String[] args) {
String content = "加密解密测试";
System.out.println("加密content:"+content);
String key = "abcd1234abcd1234";
System.out.println("加密key:"+key);
String enResult = enCode(content, key);
System.out.println("加密result:"+enResult);
String deResult = deCode(enResult, key);
System.out.println("解密result:"+deResult);
}
}
vue
先引入
npm install crypto-js --save-dev
js
import CryptoJS from "crypto-js";
/**
*
* 第一个参数word是待加密或者解密的字符串;
* 第二个参数keyStr是aes加密需要用到的16位字符串的key;
*
* 如果想对一个js对象加密,需要先把该对象转成json字符串。
*/
export default {
// 加密
encrypt(word, keyStr) {
keyStr = keyStr ? keyStr : "abcd1234abcd1234";
let key = CryptoJS.enc.Utf8.parse(keyStr);
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
},
// 解密
decrypt(word, keyStr) {
keyStr = keyStr ? keyStr : "abcd1234abcd1234";
var key = CryptoJS.enc.Utf8.parse(keyStr);
var decrypt = CryptoJS.AES.decrypt(word, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypt).toString();
}
};
页面上引入js
import CryptoJS from '@/utils/CryptoJS'