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

C#实现Java RSAPublicKey转换及RSA加密对接报错咨询

RSA公钥转换与加密相关问题解答

基础素材

收到的公钥字符串

string publicKey =
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlUCQZso6P43gKqw0CfTlwYb3N+m4v6IME 4nPA3WXe52wFpDM/JCFWSdXa7BewlwzDYjblgwL4u59CPxNTPTh7LTD4xXOaGDJHjX5+YgqK4fb9rs ImjMpIACrND/LAdrq5mctWWzw3UtW3F+o+sNwIZM8n65ysS+Vhq9IypFlfuQbWrKjAcWZ3u1iLtplz yf/pjhOEyyZiBUnh6D219+pMiE9nhCpc4xkH1gnlGszIDBqZMMULtGJvFXydA1vv5HxxCYJ2ydEzmA KYxVgA9BGXPEGE89dQbeJsieTj+FSsp9oTm+4vi345opRvH8DWhmZc4OPSwBEL8pwgS7cUnKPtwIDA QAB";

注意:该公钥字符串中包含多处空格、换行,实际使用前必须先移除所有空白字符,否则Base64解码会失败。

待验证Java代码

byte[] decoedPublicKey = Base64.getDecoder().decode(publicKey);
RSAPublicKey rsaPublicKey = (RSAPublicKey) KeyFactory.getInstance("RSA").
    generatePublic(new X509EncodedKeySpec(decoedPublicKey));

待验证C#加密代码

Pkcs1Encoding pkcs1Encoding = new Pkcs1Encoding((IAsymmetricBlockCipher)new RsaEngine());
using (StringReader reader = new StringReader(publicKey))
{
    AsymmetricKeyParameter parameters = (AsymmetricKeyParameter)new PemReader((TextReader)reader).ReadObject();
    pkcs1Encoding.Init(true, (ICipherParameters)parameters);
}

return Convert.ToBase64String(pkcs1Encoding.ProcessBlock(bytes, 0, bytes.Length));

问题答复

  • Java代码有效性判定
    移除公钥字符串中的空白字符后,这段代码可以正确实现Base64字符串公钥到RSAPublicKey类型的转换。你持有的公钥是标准X.509 SubjectPublicKeyInfo结构的DER编码Base64串,代码逻辑完全匹配该格式的解析流程:先Base64解码得到二进制公钥字节,再通过RSA密钥工厂按照X.509公钥规范生成密钥实例,强转RSAPublicKey为合法操作。

  • C#对等实现说明
    C#存在完全对等的实现,.NET Core 3.0+、.NET 5+内置API即可完成,无需第三方依赖,逻辑和Java完全对齐:

    // 清理公钥中的空白字符
    string cleanPubKey = publicKey.Replace(" ", "").Replace("\r","").Replace("\n","");
    byte[] pubKeyBytes = Convert.FromBase64String(cleanPubKey);
    using RSA rsa = RSA.Create();
    rsa.ImportSubjectPublicKeyInfo(pubKeyBytes, out _);
    // 得到的rsa实例即和Java端RSAPublicKey完全对等
    
  • 公钥转换的必要性
    是必须 必须步骤。所有RSA加密实现都无法直接使用Base64字符串格式的公钥完成运算,必须先将字符串解析为加密库可识别的公钥参数结构——本质是从ASN.1编码的公钥数据中提取模数、公钥指数等核心参数传递给加密引擎。跳过该步骤时,加密逻辑拿不到正确参数,输出的密文必然无法被对端解密。

  • 当前C#加密代码问题说明
    你使用的BouncyCastle代码存在错误,这也是API解密失败的核心原因:

    • PemReader仅支持读取带PEM头尾标记的公钥内容,格式要求为以-----BEGIN PUBLIC KEY-----开头、-----END PUBLIC KEY-----结尾,你传入的纯Base64字符串没有对应标记,ReadObject()方法会直接返回null,后续加密根本没有加载到正确的公钥参数。
    • 修正方案二选一即可:
      • 给公钥字符串拼接标准PEM头尾,再使用PemReader读取
      • 清理公钥空白后做Base64解码,直接调用BouncyCastle的PublicKeyFactory.CreateKey(pubKeyBytes)方法生成公钥参数,不需要走PEM读取逻辑
    • 额外注意:你当前代码使用的是PKCS#1 v1.5填充,需要和API要求的填充格式保持一致,如果API要求OAEP填充,即使公钥解析正确,密文也无法被正常解密。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:48:13