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

Blazor WebAssembly RSA解密报错:Web Crypto API遇OperationError

解决Blazor Server加密、Wasm客户端解密的RSA-OAEP OperationError错误

核心错误原因

客户端解密时对加密后的Base64字符串处理逻辑错误:你直接用TextEncoder.encode()把Base64字符串转成UTF-8字节数组,但实际需要把Base64解码为原始的加密二进制数据,格式不匹配直接触发了OperationError。另外需确保str2ab工具函数的实现正确,这是二进制字符串转ArrayBuffer的关键环节。

修复方案

1. 修正客户端解密的数据转换逻辑

修改decryptData函数,将Base64字符串正确解码为ArrayBuffer:

async function decryptData(str) {
    const base64PrivateKey = localStorage.getItem("browser-privateKey");
    const privateKey = await importPrivateKey(base64PrivateKey);
    // 修正:将Base64字符串解码为ArrayBuffer,而非编码字符串
    const encryptedArrayBuffer = base64ToArrayBuffer(str);

    return window.crypto.subtle.decrypt(
        {
            name: 'RSA-OAEP'
        },
        privateKey,
        encryptedArrayBuffer
    )
        .then((decryptedArrayBuffer) => {
            const returnString = new TextDecoder().decode(decryptedArrayBuffer);
            return returnString;
        })
        .catch((error) => {
            console.log("Error decrypting data: " + error);
            throw error;
        });
}

// 新增Base64转ArrayBuffer工具函数
function base64ToArrayBuffer(base64) {
    const binaryString = window.atob(base64);
    const bytes = new Uint8Array(binaryString.length);
    for (let i = 0; i < binaryString.length; i++) {
        bytes[i] = binaryString.charCodeAt(i);
    }
    return bytes.buffer;
}

2. 确保str2ab函数正确实现

如果代码中未实现该函数,补充以下逻辑:

function str2ab(str) {
    const buf = new ArrayBuffer(str.length);
    const bufView = new Uint8Array(buf);
    for (let i = 0; i < str.length; i++) {
        bufView[i] = str.charCodeAt(i);
    }
    return buf;
}

3. 验证C#端加密逻辑一致性

确认ByteEncrypt方法确实使用了匹配的RSA-OAEP填充方案,示例实现如下:

private static byte[] ByteEncrypt(byte[] data, RSAParameters rsaParams, RsaCryptoHelper.PaddingScheme scheme)
{
    using (var rsa = RSA.Create())
    {
        rsa.ImportParameters(rsaParams);
        // 必须使用SHA256的OAEP填充,与前端参数对齐
        return rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA256);
    }
}

额外检查点

  • 确认密钥对生成参数(modulusLength=2048、hash=SHA-256)在加密、解密两端完全一致。
  • 检查localStorage中保存的私钥是否完整,无截断或篡改。
  • 注意RSA-OAEP的明文长度限制:2048位密钥的最大明文长度约为190字节,若明文过长需改用「对称加密+RSA密钥封装」的混合方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:35:33