姚令武 2025-08-18 01:05 采纳率: 97.6%
浏览 4
已采纳

如何正确使用CryptoJS进行AES加密解密?

**如何正确使用CryptoJS进行AES加密解密?** 在使用CryptoJS进行AES加密与解密时,开发者常遇到几个关键问题:如何选择合适的密钥长度?加密模式(如CBC、ECB)和填充方式(如Pkcs7)如何设置?加密后的数据如何正确编码与传输?又如何确保解密时能准确还原原始数据?本文将通过完整示例,讲解在CryptoJS中进行AES加密、解密的标准流程,涵盖密钥处理、IV设置、编码格式(如Base64)等常见注意事项,帮助开发者避免常见陷阱,安全高效地实现数据加解密。
  • 写回答

1条回答 默认 最新

  • 秋葵葵 2025-08-18 01:05
    关注

    一、CryptoJS 与 AES 加密概述

    CryptoJS 是一个广泛使用的 JavaScript 加密库,支持多种加密算法,包括 AES(Advanced Encryption Standard)。AES 是一种对称加密算法,广泛应用于数据加密场景中。使用 CryptoJS 进行 AES 加密和解密时,开发者需要关注密钥长度、加密模式、填充方式以及编码格式等多个关键点。

    • 支持的 AES 密钥长度:128位、192位、256位
    • 常见的加密模式:ECB、CBC、CFB、OFB、CTR
    • 填充方式:Pkcs7(默认)、ZeroPadding、Iso10126
    • 编码格式:Base64(推荐)、Hex、Utf8

    二、密钥处理与生成

    密钥是 AES 加密的核心。开发者必须确保密钥的随机性和保密性。在 CryptoJS 中,可以使用随机生成器创建密钥,也可以从字符串派生密钥。

    
    // 生成128位(16字节)的随机密钥
    function generateKey(size = 16) {
      const key = CryptoJS.lib.WordArray.random(size);
      return key;
    }
    
    const key = generateKey();
    console.log("密钥(Base64):", key.toString(CryptoJS.enc.Base64));
    
    密钥长度对应字节数加密强度
    128位16字节足够安全
    192位24字节更强
    256位32字节最高

    三、加密模式与初始化向量(IV)设置

    AES 支持多种加密模式,其中 CBC(Cipher Block Chaining)是最常用的安全模式之一。使用 CBC 模式时,必须设置 IV(初始化向量)。

    
    // 生成16字节的随机IV
    function generateIV() {
      return CryptoJS.lib.WordArray.random(16);
    }
    
    const iv = generateIV();
    console.log("IV(Base64):", iv.toString(CryptoJS.enc.Base64));
    
    graph TD A[原始明文] --> B[AES加密] B --> C{加密模式选择} C -->|ECB| D[无IV] C -->|CBC| E[使用IV] E --> F[生成随机IV] F --> G[加密]

    四、AES加密示例

    以下是一个完整的 AES/CBC/Pkcs7 加密示例:

    
    const plaintext = "Hello, AES encryption with CryptoJS!";
    
    const encrypted = CryptoJS.AES.encrypt(
      plaintext,
      key,
      {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      }
    );
    
    console.log("加密结果(Base64):", encrypted.toString());
    

    加密结果包含密文、IV 和其他元数据,可以通过 toString() 方法以 Base64 格式输出。

    五、AES解密示例

    解密时需要使用相同的密钥和 IV,并且加密参数必须一致。

    
    const decrypted = CryptoJS.AES.decrypt(
      encrypted.toString(),
      key,
      {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
      }
    );
    
    const originalText = decrypted.toString(CryptoJS.enc.Utf8);
    console.log("解密结果:", originalText);
    

    注意:CryptoJS 的 decrypt 返回的是 WordArray,必须使用 toString(CryptoJS.enc.Utf8) 转换为字符串。

    六、编码与传输注意事项

    加密后的数据通常以 Base64 格式传输,以避免二进制数据在网络传输中出现乱码问题。

    • Base64 是推荐的编码格式
    • 加密结果可直接通过 JSON 传输
    • IV 通常需要与密文一起传输(如前16字节)
    
    // 将加密结果与IV组合后传输
    const cipherText = encrypted.ciphertext.toString(CryptoJS.enc.Base64);
    const ivText = encrypted.iv.toString(CryptoJS.enc.Base64);
    
    console.log("CipherText:", cipherText);
    console.log("IV:", ivText);
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 8月18日