首页 » 前端 » Javascript » 正文

CryptoJS 的 AES、DES 加密与解密示例

发布者:站点默认
2013/06/27 浏览数(2,999) 分类:Javascript 评论(1)

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

关联:PHP 的 DES 加密与解密示例

点击返回顶部
  1. 留言
  2. 联系方式