C#使用RSA-OAEP-256加密提交服务器提示RSA块数据过大问题咨询
错误原因与修复方案
你收到的Cannot decrypt PAN (RsaOaep256): too much data for RSA block错误本质是服务器收到的密文长度超过了其RSA私钥对应的最大块长度(2048位RSA对应的密文固定长度为256字节),你的加密逻辑存在以下几处问题和可优化点:
1. 移除冗余的RSA实例初始化代码
你当前用rsa = RSA.Create(2048)初始化RSA实例是多余的,后续你会导入JWK对应的公钥参数,不需要预先指定密钥长度,直接改成rsa = RSA.Create()即可,避免导入非2048位密钥时出现意料之外的错误。
2. 优先验证公钥导入正确性
先做两个基础校验,确保公钥导入没有问题:
- 校验
FromBase64Url(flexKeyResponse.Jwk.N)得到的字节数组长度为256字节(对应2048位RSA模数长度) - 校验
FromBase64Url(flexKeyResponse.Jwk.E)得到的字节数组长度为3字节(AQAB解码后对应公钥指数0x01 0x00 0x01)
如果两个校验任意一个不通过,说明你的JWK字段映射或者Base64Url解码逻辑有问题,优先排查这部分。
3. 修复密文提交环节的问题
如果你本地加密时没有抛出「明文过长」的异常,说明加密环节的明文长度符合要求,问题出在密文提交环节:
- 先校验加密得到的
encrypted字节数组长度是否为固定的256字节,如果不是说明公钥导入错误 - 确认你提交给服务器的密文字符串没有经过多余的二次编码、拼接额外内容、转义处理
- 大部分接收加密支付信息的接口要求密文为Base64Url格式,你当前生成的是标准Base64格式,需要做以下转换后再提交:
string encryptedB64Url = Convert.ToBase64String(encrypted) .Replace('+', '-') .Replace('/', '_') .TrimEnd('=');
4. 补充明文校验
确认你加密的卡号没有多余的不可见字符,转字节数组前先做Trim处理:
var plainBytes = Encoding.UTF8.GetBytes(moduleConfig.Profile.CardDetails.Number.Trim()); var encrypted = rsa.Encrypt(plainBytes, padding);
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

