You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#加密字符串后React端用CryptoJS解密失败问题求助

解决C# AES加密后React CryptoJS解密为空/UTF-8格式错误问题

核心问题分析

  • 加密模式不匹配:C#中Aes.Create()默认使用CBC模式,但前端代码指定了ECB模式,两者加密逻辑完全不兼容。
  • IV未随密文传递:C#生成了随机IV但未将其附加到密文中,前端解密时缺少必要的初始化向量,导致解密失败。
  • 前端拼写错误:代码中CryptoJS.end.Utf8是笔误,正确应为CryptoJS.enc.Utf8,这会直接导致解密结果无法正常转成UTF-8字符串。
  • 密文格式不完整:后端返回的密文仅包含加密后的内容,未携带IV,前端无法正确还原解密所需的完整数据。

修正后的C#加密代码

将IV和加密内容拼接(IV放在密文开头)后统一转Base64返回,确保前端能获取到解密必需的IV:

public static string EncryptString(string value) {
    var keyString = "E546C8DF278CD5931069B522E695D4F2";
    var key = Encoding.UTF8.GetBytes(keyString);
    var iv = new byte[16];
    byte[] result;
    
    using (var rng = RandomNumberGenerator.Create()) {
        rng.GetBytes(iv);
    }

    using (var aes = Aes.Create()) {
        aes.Key = key;
        aes.IV = iv;
        aes.Mode = CipherMode.CBC; // 显式指定模式,避免默认值变更
        aes.Padding = PaddingMode.PKCS7; // 与CryptoJS默认填充规则一致

        using (var encryptor = aes.CreateEncryptor(key, iv)) {
            using (var msEncrypt = new MemoryStream()) {
                // 先写入IV,再写入加密内容
                msEncrypt.Write(iv, 0, iv.Length);
                using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                using (var swEncrypt = new StreamWriter(csEncrypt)) {
                    swEncrypt.Write(value);
                } 
                result = msEncrypt.ToArray();
            } 
        }
    }

    return Convert.ToBase64String(result);
}

修正后的React解密代码

从Base64密文中分离出IV(前16字节),改用CBC模式解密,同时修正拼写错误:

const decrypt = (data) => {
    // 解码Base64密文
    const ciphertextBytes = CryptoJS.enc.Base64.parse(data);
    // 分离IV(前16字节)和加密内容
    const iv = CryptoJS.lib.WordArray.create(ciphertextBytes.words.slice(0, 4), 16);
    const encryptedContent = CryptoJS.lib.WordArray.create(ciphertextBytes.words.slice(4), ciphertextBytes.sigBytes - 16);
    
    const key = CryptoJS.enc.Utf8.parse("E546C8DF278CD5931069B522E695D4F2");
    const decryptedContent = CryptoJS.AES.decrypt(
        { ciphertext: encryptedContent },
        key,
        { 
            mode: CryptoJS.mode.CBC,
            iv: iv,
            padding: CryptoJS.pad.Pkcs7
        }
    );

    // 转成UTF-8字符串
    const plaintext = decryptedContent.toString(CryptoJS.enc.Utf8);
    console.log(plaintext);
    return plaintext;
}

额外注意事项

  • Key一致性:确保前后端key的编码方式统一(均为UTF8),你的key字符串是32个ASCII字符,UTF8编码后正好是32字节,对应AES-256算法。
  • IV安全性:随机IV无需保密,随密文传递是CBC模式的标准安全做法。
  • 异常处理:建议在前后端添加异常捕获逻辑,解密失败时返回友好提示,避免直接抛出错误影响页面运行。

内容的提问来源于stack exchange,提问作者Ottarl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:40:16