使用 CryptoJS 进行 AES 的 128 bit 加密和解密

CryptoJS 是一个多功能 js 加密解密库,是一个前端 jser 不可不知的前端工具包。那么,使用 CryptoJS 是如何进行 AES 的 128 bit 加密和解密呢?废话不多说,下面直接上代码,已封装好,可以直接使用,拿走不谢。使用之前先使用 npm 安装一下包:npm install crypto-js

import CryptoJS from 'crypto-js'
/**
 * CryptoJS AES 加密。str 是需要加密的字符串明文;key 是密钥;iv 是偏移向量,默认 iv 是 16 个 0(这个称为初始化向量),我们可以指定 iv 来进行加解密,加大破解难度;返回值为加密结果字符串密文
 *
 * @param {String} str
 * @param {String} key
 * @param {String} iv
 * @return {String}
 */
function aesEncrypt (str, key, iv) {
  const formatedKey = CryptoJS.enc.Utf8.parse(key) // 将 key 转为 128bit 格式
  const formatedIv = CryptoJS.enc.Utf8.parse(iv) // 将 iv 转为 128bit 格式
  const encrypted = CryptoJS.AES.encrypt(str, formatedKey, { iv: formatedIv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) // 加密
  return encrypted.ciphertext.toString() // AES 加密生成的密文是一个对象,如果直接将其转为字符串是一个 Base64 编码串,在 encrypted.ciphertext 上的属性转为字符串才是后端需要的密文格式
}
/**
 * CryptoJS AES 解密。encryptedStr 字符串密文;key 是密钥;iv 是偏移量;返回结果为解密后的结果明文
 * 注意:key 与 iv 要与上面加密使用的 key 与 iv 保持一致
 *
 * @param {String} encryptedStr
 * @param {String} key
 * @param {String} iv
 * @return {String}
 */
function aesDecrypt (encryptedStr, key, iv) {
  const encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr) // 把密文由 128 bit 转为十六进制
  const encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr) // 再转为 Base64 编码的字符串
  const formatedKey = CryptoJS.enc.Utf8.parse(key) // 将 key 转为 128bit 格式
  const formatedIv = CryptoJS.enc.Utf8.parse(iv) // 将 iv 转为 128bit 格式
  const decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, formatedKey, { iv: formatedIv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }) // 解密
  return decryptedData.toString(CryptoJS.enc.Utf8) // 经过 AES 解密后,依然是一个对象,将其变成明文就需要按照 Utf8 格式转为字符串
}