AES对称加密我们采用 CryptoJS,AES加密支持AES-128、AES-192和AES-256 https://github.com/brix/crypto-js
RSA非对称加密我们采用JSEncrypt https://github.com/travist/jsencrypt
安装
npm i CryptoJS jsencrypt
封装 encrypt.js
import CryptoJS from 'crypto-js';
import { JSEncrypt } from 'jsencrypt';
// ==========================AES对称加密我们采用 CryptoJS==========================
/**
* 使用AES算法加密消息
* @param {string} message - 要加密的消息
* @param {string} secretKey - 加密密钥
* @returns {string} - 加密后的字符串
*/
export function AESEncrypt(message, secretKey) {
// 使用AES算法进行加密
const encrypted = CryptoJS.AES.encrypt(message, secretKey).toString();
return encrypted;
}
/**
* 使用AES算法解密消息
* @param {string} encryptedMessage - 加密后的消息字符串
* @param {string} secretKey - 解密密钥
* @returns {string} - 解密后的字符串
*/
export function AESDecrypt(encryptedMessage, secretKey) {
// 使用AES算法进行解密
const bytes = CryptoJS.AES.decrypt(encryptedMessage, secretKey);
// 将解密后的数据转换为UTF-8字符串
const decrypted = bytes.toString(CryptoJS.enc.Utf8);
return decrypted;
}
// ==========================RSA非对称加密我们采用JSEncrypt==========================
// 密钥对生成 http://web.chacuo.net/netrsakeypair
// 加密
export const encryptMessage = (publicKey, message) => {
const encrypt = new JSEncrypt();
encrypt.setPublicKey(publicKey); // 设置公钥
return encrypt.encrypt(message); // 对数据进行加密
};
// 解密
export const decryptMessage = (privateKey, encryptedMessage) => {
const decrypt = new JSEncrypt();
decrypt.setPrivateKey(privateKey); // 设置私钥
return decrypt.decrypt(encryptedMessage); // 对数据进行解密
};
使用
import { AESEncrypt, AESDecrypt, encryptMessage, decryptMessage } from '@/utils/encrypt.js';
// 1 AES对称
const message = 'Hello, World!';
const secretKey = 'mySecretKey';
// 加密
const encryptedMessage = AESEncrypt(message, secretKey);
console.log('Encrypted Message: ', encryptedMessage);
// 解密
const decryptedMessage = AESDecrypt(encryptedMessage, secretKey);
console.log('Decrypted Message: ', decryptedMessage);
// 检查点
// 密钥一致性:确保加密和解密使用相同的密钥。
// 消息格式:确保在加密和解密过程中消息格式一致。
// 编码格式:确保加密输出和解密输入的格式(如Base64)一致。
// 2 RSA非对称
const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgD4eXE+ib6kANRxTgRmpHxH5F
PgzVFWd9EHJqQcsnpl/Ym68JqohMbg/KR7jZp0aigBbSMpO/9HH0VTSpSwM6jLoO
wHjPMRHotH42BPdrkH8qd8XFt7sciXNwvC/fZUh7qwG1mVKHgkQeMn5aMqkJ8ir+
xE/BJ+WV3mhRcU3JpwIDAQAB
-----END PUBLIC KEY-----`;
const privateKey = `-----BEGIN PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOAPh5cT6JvqQA1H
FOBGakfEfkU+DNUVZ30QcmpByyemX9ibrwmqiExuD8pHuNmnRqKAFtIyk7/0cfRV
NKlLAzqMug7AeM8xEei0fjYE92uQfyp3xcW3uxyJc3C8L99lSHurAbWZUoeCRB4y
floyqQnyKv7ET8En5ZXeaFFxTcmnAgMBAAECgYAXgEl+hS4OvIE/Y0dDRt9665c6
+AksiHQ0X/dAQepnHEJNW/b+Eo79RUYOt3siCTOVc83w+jEZHzCcqhs97opF9Zr3
UPLcti1L5+NLfzaez/KEXkbAaSixq24Ni4Aah/LJ2xzWNQ4V14DlzCUoY3a54999
XIN8P5+FVMQXQfos8QJBAPgXTTSP0HH6Bimzijj6dUaSMhdLHbG0a2IrrKSSP5CF
b2vIa3EPqyKgELB1x/N4W8kJJs7JAiwapsv0P5IcB20CQQDnNB0XCe3y7v2JG7tr
YOsFRtwxShFFqx7wBhwS77Q81z17+gEEuLwjNQYYYVX3a8UUTMZObZ3fIAh11gPK
u4TjAkEAka59M6RPrt42yD4ZqKPKQgqPR4ZghX2AoUEsO+d1VBRG/W/PR7D/uXFs
23IOXDYND9xD4aG/mM59q75dphq3cQJBAOZZjq4Yj4FdyS6keat3KVDdk55sDB9c
aXt8qtXXCr0fObvejss0fwWY25TIzYywS+94uo8DOapHUQaODsMa5z8CQD1IjrLY
ddqTCLNS+VT+qOKOdrDiHYNfSHbfD9kwOxjuBswTCr15E+8gvEheaxBI1I0nskKf
cQNV1g7u+ePgEMM=
-----END PRIVATE KEY-----
`;
const message2 = 'Hello, RSA!';
const encryptedMessage2 = encryptMessage(publicKey, message2);
console.log('Encrypted Message:', encryptedMessage2);
const decryptedMessage2 = decryptMessage(privateKey, encryptedMessage2);
console.log('Decrypted Message:', decryptedMessage2);