前端crypto-js aes加解密

CryptoJS是javascrpit强大的加密解密库,要实现加解密,云侧和端侧的加密方式需要一一对应。例如,云侧采用AES/CBC/PKCS5Padding加密,前端CryptoJS也要采用aes的CBC/PKCS5Padding方式加密。

具体以下5项要和云侧保持一致:

  1. Key
  2. IV,偏移量
  3. Mode,加密模式,有CBC、ECB等
  4. Padding,补齐模式,Pkcs7等。加密串按照一定的大小进行分组,最后分剩下那一组,不够长度,就需要进行补齐,这个属性代表了以何种方式补齐
  5. 加密串编码格式,通过CryptoJS.AES.encrypt方法加密完成后,要和云侧约定以何种方式对加密串编码后传给云侧,例如,不编码直接传,base64,hex等等,我们项目采用base64, 所以最终调用CryptoJS.enc.Base64.stringify(encrypted.ciphertext)导出。

以下为加密函数的调用实现:

import CryptoJS from "crypto-js";

const key = CryptoJS.enc.Utf8.parse("$$ysdfsdfsdfbj"); 
const iv = CryptoJS.enc.Utf8.parse("dYsdfgssdfgsddfgo");
export default {
  //aes加密
  aesEncrypt(word) {
    let encrypted = "";
    if (typeof word == "string") {
      const srcs = CryptoJS.enc.Utf8.parse(word);
      //模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
      encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });
    } else if (typeof word == "object") {
      const data = JSON.stringify(word);
      const srcs = CryptoJS.enc.Utf8.parse(data);
      //模式为CBC,补码方式为PKCS5Padding(也就是PKCS7)
      encrypted = CryptoJS.AES.encrypt(srcs, key, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      });
    }
    //编码导出
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
  },
  // aes解密
  aesDecrypt(word) {
    const encryptedHexStr = CryptoJS.enc.Hex.parse(word);
    const srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
    const decrypt = CryptoJS.AES.decrypt(srcs, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.Pkcs7
    });
    const decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
    return decryptedStr.toString();
  }
};

参考:

AES/CBC/PKCS5Padding 到底是什么

https://xie.infoq.cn/article/7e93850ddb9a6170bd49cd28c</wiz-editor-doc>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容