简介
AES——高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥。
封装
在src下新建一个utils文件夹,专门用来存放封装的工具。然后在utils文件夹中新建一个AES.js文件,将封装好的函数写到里面。
// 引入CryptoJS
const CryptoJS = require("crypto-js");
// 偏移量
const iv = CryptoJS.enc.Utf8.parse('a1b2c3d4e5f6g7h8');
/**
* @desc AES加密
* @param {String} signKey - 加密的秘钥
* @param {String} stringData - 需要加密的数据;
*/
export const aesEncrypt = (stringData) => {
const key = CryptoJS.enc.Utf8.parse(signKey);
const srcs = CryptoJS.enc.Utf8.parse(stringData);
/**
* CipherOption, 加密的一些选项:
* mode: 加密模式, 可取值(CBC, CFB, CTR, CTRGladman, OFB, ECB), 都在 CryptoJS.mode 对象下
* padding: 填充方式, 可取值(Pkcs7, AnsiX923, Iso10126, Iso97971, ZeroPadding, NoPadding), 都在 CryptoJS.pad 对象下
* iv: 偏移量, mode === ECB 时, 不需要 iv
* 返回的是一个加密对象
*/
const cipher = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
iv,
});
return cipher.ciphertext.toString().toUpperCase();
}
/**
* @desc AES解密;
* @param {string} key - 加密使用的 key;
* @param {string} encrypted - 加密的数据;
*/
export const aesDecrypt = (encrypted, key) => {
const obj = CryptoJS.enc.Hex.parse(encrypted);
const srcs = CryptoJS.enc.Base64.stringify(obj);
// 这里 mode, padding, iv 一定要跟加密的时候完全一样
// 返回的是一个解密后的对象
const decipher = CryptoJS.AES.decrypt(srcs, key, {
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding,
iv,
});
// 将解密对象转换成 UTF8 的字符串
const resultDecipher = CryptoJS.enc.Utf8.stringify(decipher);
// 返回解密结果
return resultDecipher.toUpperCase();
}
调用
import {aesEncrypt} from "../../../utils/AES";
// 调用加密函数
const encrypted = aesEncrypt('1234567');
// 调用解密函数
const decrypted = aesDecrypt(encrypted, key);