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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:45:03