import CryptoJS from 'crypto-js'// 引入AES加密库 npm install crypto-js@3.1.9-1 -save // import { JSEncrypt } from 'jsencrypt'; // npm install jsencrypt -save const RsaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZf8e1tzYTSr7KciAHH2KrE3O13ftuv3rHRRz7MztYXirMdLquocTNSJ5BAoj1H3V8fvFtfmN6BkuB6XnQrbY5heOzZZQWvO4qAa0EktwkLQUwCkYJfaQNc1Iw4wZFt4VO7U8+LLo+IO7jtxmaNIBqJm8laDc1C6zw2ETZD4bQ6wIDAQAB" const iv = CryptoJS.enc.Utf8.parse('1234567812345678'); //定义rsa加密类 // const crypt = new JSEncrypt(); // crypt.setPublicKey(RsaPublicKey); // 设置公钥 // 生成一个随机的128位(16字节)AES密钥 const generateAESKey = () => { return CryptoJS.lib.WordArray.random(16); } // 转化生成AES密钥成base64字符串 const getGenerateAESKeyBase64 = (aesKey) => aesKey.toString(CryptoJS.enc.Base64) // 执行rsa加密 const encryptRSA = (str) => crypt.encrypt(str) // 执行rsa解密 const decryptRSA = (str) => crypt.decrypt(str) // 执行aes加密 export const encryptAES = (data, aesKeyBase64, iv) => { const key = CryptoJS.enc.Utf8.parse(aesKeyBase64); return CryptoJS.AES.encrypt(JSON.stringify(data), key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString(); } // aes解密 const decryptAES = (ciphertext, aesKeyBase64, iv) => { const key = CryptoJS.enc.Utf8.parse(aesKeyBase64); const bytes = CryptoJS.AES.decrypt(ciphertext, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return JSON.parse(bytes.toString(CryptoJS.enc.Utf8)); } // 加密过程 export const encryptData = (data={}) => { const aesKey = generateAESKey(); // 获取随机密钥key const aesKeyBase64 = getGenerateAESKeyBase64(aesKey) // 变成base64 const key = encryptRSA(aesKeyBase64) const ciphertext = encryptAES(data, aesKeyBase64, iv); const decryptedData = decryptAES(ciphertext, aesKeyBase64, iv); return {text:ciphertext, key:key, aesKeyBase64:aesKeyBase64} } // 解密过程 export const decryptData= (aesStr, aesKey) => { return decryptAES(aesStr, aesKey, iv) } /** * AES加密 * @param plainText 明文 * @param keyInBase64Str base64编码后的key * @returns {string} base64编码后的密文 */ export function encryptByAES(plainText, keyInBase64Str) { let key = CryptoJS.enc.Base64.parse(keyInBase64Str); let encrypted = CryptoJS.AES.encrypt(plainText, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); // 这里的encrypted不是字符串,而是一个CipherParams对象 return encrypted.ciphertext.toString(CryptoJS.enc.Base64); } /** * AES解密 * @param cipherText 密文 * @param keyInBase64Str base64编码后的key * @return 明文 */ export function decryptByAES(cipherText, keyInBase64Str) { let key = CryptoJS.enc.Base64.parse(keyInBase64Str); // 返回的是一个Word Array Object,其实就是Java里的字节数组 let decrypted = CryptoJS.AES.decrypt(cipherText, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, }); return decrypted.toString(CryptoJS.enc.Utf8); }