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

Blazor WASM与ASP.NET Core API AES加解密:解密结果乱码前缀问题排查

AES解密结果前出现乱码问题

我在Blazor WASM中使用以下JavaScript代码做AES加密:

function encrypt(plainText, key) {
    debugger;
    const iv = CryptoJS.lib.WordArray.random(16);
    const keyBytes = CryptoJS.enc.Utf8.parse(key);
    const encrypted = CryptoJS.AES.encrypt(plainText, keyBytes, {
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    const encryptedText = iv.concat(encrypted.ciphertext).toString(CryptoJS.enc.Base64);
    return encryptedText;
}

在ASP.NET Core API中用以下C#代码解密:

public string Decrypt(string cipherText, string key)
{
    try
    {
        var iv = new byte[16];
        var buffer = Convert.FromBase64String(cipherText);
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = iv;
            aes.Padding = PaddingMode.PKCS7;
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            using (MemoryStream ms = new MemoryStream(buffer))
            {
                using (CryptoStream cryptoStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cryptoStream))
                    {
                        var result = sr.ReadToEnd();
                        return result;
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        throw;
    }
}

双方使用相同密钥:private const string INITIAL_KEY = @"mPqqfIRf74nIJiO4";。解密能得到目标内容,但结果前会出现不可读乱码,比如客户端明文是encryptedMessage,服务端解密后显示为���������|����^encryptedMessage,请问哪里操作错误?


错误原因

你的C#解密代码没有正确提取IV:

  • JS加密时,是将16字节的IV和密文拼接后转成Base64返回的
  • 但C#代码里直接用了空的new byte[16]作为IV,没有从解密的buffer中分离出前16字节的IV,导致解密时用了错误的IV,进而让密文开头部分解密乱码,后面内容因对齐巧合能正确解密。

修复后的C#解密代码

public string Decrypt(string cipherText, string key)
{
    try
    {
        var buffer = Convert.FromBase64String(cipherText);
        // 从buffer中提取前16字节作为IV
        var iv = buffer.Take(16).ToArray();
        // 剩下的部分才是真正的密文
        var cipherBytes = buffer.Skip(16).ToArray();
        
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = iv;
            aes.Padding = PaddingMode.PKCS7;
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            
            // 使用密文字节数组创建MemoryStream,而不是整个buffer
            using (MemoryStream ms = new MemoryStream(cipherBytes))
            {
                using (CryptoStream cryptoStream = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cryptoStream))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
    catch (Exception e)
    {
        throw;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:37:21