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); };