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读取逻辑
- 给公钥字符串拼接标准PEM头尾,再使用
- 额外注意:你当前代码使用的是PKCS#1 v1.5填充,需要和API要求的填充格式保持一致,如果API要求OAEP填充,即使公钥解析正确,密文也无法被正常解密。
内容的提问来源于stack exchange,提问作者ddb20
相关产品推荐
相关产品推荐

