AES對稱加密(crypto-js)

前言

使用crypto-js加密庫,實現AES對稱加密。AES有多種加密模式,本文僅介紹基於ECBCBC的加密(填充算法採用PKCS7)。javascript

  • 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

本算法使用256位密鑰,即32字節。一般狀況下,將43位字符串進行Base64解碼便可得到32字節密鑰,但某些隨機字符可能Base64解碼長度非32字節。html

/**
   * 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個字節。若是有特殊要求,能夠參考下面示例代碼進行調整。java

/**
   * 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)

附錄

相關文章
相關標籤/搜索