前言

应用crypto-js加密库,实现AES对称加密。AES有多种加密模式,本文仅介绍基于ECBCBC的加密(填充算法采纳PKCS7)。

  • ECB:电码本模式(Electronic Codebook Book)。将整个明文分成若干段雷同的小段,而后对每一小段进行加密。
  • CBC:明码分组链接模式(Cipher Block Chaining)。先将明文切分成若干小段,而后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

援用脚本

<script src="http://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.js"></script>

AES-256-ECB

本算法应用32位密钥。通常状况下,将43位字符串进行Base64解码即可取得32位密钥,但某些随机字符可能Base64解码长度非32位。

  /**   * AES-256-ECB对称加密   * @param text {string} 要加密的明文   * @param secretKey {string} 密钥,43位随机大小写与数字   * @returns {string} 加密后的密文,Base64格局   */  function AES_ECB_ENCRYPT(text, secretKey) {    var keyHex = CryptoJS.enc.Base64.parse(secretKey);    var messageHex = CryptoJS.enc.Utf8.parse(text);    var encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {      "mode": CryptoJS.mode.ECB,      "padding": CryptoJS.pad.Pkcs7    });    return encrypted.toString();  }  /**   * AES-256-ECB对称解密   * @param textBase64 {string} 要解密的密文,Base64格局   * @param secretKey {string} 密钥,43位随机大小写与数字   * @returns {string} 解密后的明文   */  function AES_ECB_DECRYPT(textBase64, secretKey) {    var keyHex = CryptoJS.enc.Base64.parse(secretKey);    var decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, {      "mode": CryptoJS.mode.ECB,      "padding": CryptoJS.pad.Pkcs7    });    return CryptoJS.enc.Utf8.stringify(decrypt);  }

AES-256-CBC

CBC模式的向量,做了一个非凡解决,应用密钥的前16个字节。如果有特殊要求,能够参考上面示例代码进行调整。

  /**   * AES-256-CBC对称加密   * @param text {string} 要加密的明文   * @param secretKey {string} 密钥,43位随机大小写与数字   * @returns {string} 加密后的密文,Base64格局   */  function AES_CBC_ENCRYPT(text, secretKey) {    var keyHex = CryptoJS.enc.Base64.parse(secretKey);    var ivHex = keyHex.clone();    // 前16字节作为向量    ivHex.sigBytes = 16;    ivHex.words.splice(4);    var messageHex = CryptoJS.enc.Utf8.parse(text);    var encrypted = CryptoJS.AES.encrypt(messageHex, keyHex, {      "iv": ivHex,      "mode": CryptoJS.mode.CBC,      "padding": CryptoJS.pad.Pkcs7    });    return encrypted.toString();  }  /**   * AES-256-CBC对称解密   * @param textBase64 {string} 要解密的密文,Base64格局   * @param secretKey {string} 密钥,43位随机大小写与数字   * @returns {string} 解密后的明文   */  function AES_CBC_DECRYPT(textBase64, secretKey) {    var keyHex = CryptoJS.enc.Base64.parse(secretKey);    var ivHex = keyHex.clone();    // 前16字节作为向量    ivHex.sigBytes = 16;    ivHex.words.splice(4);    var decrypt = CryptoJS.AES.decrypt(textBase64, keyHex, {      "iv": ivHex,      "mode": CryptoJS.mode.CBC,      "padding": CryptoJS.pad.Pkcs7    });    return CryptoJS.enc.Utf8.stringify(decrypt);  }

测试用例

  var message = "123加密解密工具测试类sss";  var key = "KUf4hM5rThssysJhcRFCfxLR8Imihjl0eMsyhh1M7Wk";  // 测试AES-256-ECB  var ecbEncrypt = AES_ECB_ENCRYPT(message, key);  console.log("ecb加密", ecbEncrypt);  var ecbDecrypt = AES_ECB_DECRYPT(ecbEncrypt, key);  console.log("ecb后果比拟---", message === ecbDecrypt)  // 测试AES-256-CBC  var cbcEncrypt = AES_CBC_ENCRYPT(message, key);  console.log("cbc加密", cbcEncrypt);  var cbcDecrypt = AES_CBC_DECRYPT(cbcEncrypt, key);  console.log("cbc后果比拟---", message === cbcDecrypt)

附录

  • crypto-js https://github.com/brix/crypto-js
  • PKCS7 https://segmentfault.com/a/1190000019793040