CryptoJS 的 AES、DES 加密与解密示例
AES
注意:
- IV 的长度必须是128位(16字节即16个字符),其它长度可能导致加密失败;
- IV 不需要保密,但必须与密文一起传输,以便接收方可以使用相同的IV进行解密;
- 密钥的长度必须是16字节(128位)、24字节(192位)或32字节(256位)分别对应AES-128、AES-192和AES-256,其它长度可能导致加密失败;
import CryptoJS from 'crypto-js';
export function encrypt(plaintext, password = process.env.VUE_APP_AES_KEY) {
const keyHash = CryptoJS.SHA256(password);
const aesKey = CryptoJS.lib.WordArray.create(keyHash.words, 32);
const iv = CryptoJS.lib.WordArray.random(16);
const encrypted = CryptoJS.AES.encrypt(plaintext, aesKey, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
// 合并IV和密文
const ivAndCiphertext = iv.concat(encrypted.ciphertext);
const ciphertext = ivAndCiphertext.toString(CryptoJS.enc.Base64);
return ciphertext;
}
export function decrypt(ciphertext, password = process.env.VUE_APP_AES_KEY) {
const keyHash = CryptoJS.SHA256(password);
const aesKey = CryptoJS.lib.WordArray.create(keyHash.words, 32);
// 分离IV和密文
const ivAndCiphertext = CryptoJS.enc.Base64.parse(ciphertext);
const iv = CryptoJS.lib.WordArray.create(ivAndCiphertext.words.slice(0, 4), 16);
const encrypted = CryptoJS.lib.WordArray.create(ivAndCiphertext.words.slice(4), ivAndCiphertext.sigBytes - 16);
// 解密
const decrypted = CryptoJS.AES.decrypt({ ciphertext: encrypted }, aesKey, {
iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
});
const plaintext = decrypted.toString(CryptoJS.enc.Utf8);
return plaintext;
}
DES
import CryptoJS from 'crypto-js';
export const encrypt = (string) => {
let password = process.env.APP_KEY;
var key = CryptoJS.enc.Utf8.parse(password);
var option = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 };
var encrypted = CryptoJS.DES.encrypt(string, key, option);
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
};
export const decrypt = (base64Message) => {
let password = process.env.APP_KEY;
var key = CryptoJS.enc.Utf8.parse(password);
var decrypted = CryptoJS.DES.decrypt(base64Message, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
});
return decrypted.toString(CryptoJS.enc.Utf8);
};