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
相关产品推荐
相关产品推荐

