将Java RSA公钥/私钥转换为C# XML RSAKeyValue格式
转换Java RSA密钥到C# XML格式的
刚巧我之前做过Java和C#之间的RSA密钥互转,要把Java的RSA公/私钥转换成C# RSACryptoServiceProvider 能用的<RSAKeyValue> XML格式,核心就是解析Java密钥里的各个参数,再映射到C#的RSA参数结构里,下面给你具体的实现方法:
一、转换Java公钥到C# XML格式
Java生成的公钥通常是X.509格式(带-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----头尾标识),里面只包含Modulus和Exponent两个核心参数,这正好对应C# XML公钥里的节点。
推荐用BouncyCastle库来解析密钥(避免手动处理复杂的ASN.1结构),步骤如下:
- 先通过NuGet安装
BouncyCastle.Crypto包; - 用以下代码实现转换:
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; using System.Security.Cryptography; using System.Text; public static string JavaPublicKeyToCSharpXml(string javaPublicKey) { // 清理Java公钥字符串:去掉头尾标识和换行符 var cleanedPublicKey = javaPublicKey .Replace("-----BEGIN PUBLIC KEY-----", "") .Replace("-----END PUBLIC KEY-----", "") .Replace("\n", "") .Replace("\r", ""); // 解码Base64字符串为字节数组 var publicKeyBytes = Convert.FromBase64String(cleanedPublicKey); // 用BouncyCastle解析公钥参数 var rsaKeyParams = PublicKeyFactory.CreateKey(publicKeyBytes) as RsaKeyParameters; if (rsaKeyParams == null) throw new ArgumentException("无效的Java RSA公钥"); // 映射到C#的RSAParameters结构 var csharpRsaParams = new RSAParameters { Modulus = rsaKeyParams.Modulus.ToByteArrayUnsigned(), Exponent = rsaKeyParams.Exponent.ToByteArrayUnsigned() }; // 导出为C# XML格式的公钥 using var rsaProvider = new RSACryptoServiceProvider(); rsaProvider.ImportParameters(csharpRsaParams); return rsaProvider.ToXmlString(false); // false表示仅导出公钥部分 }
调用这个方法后,就能得到你需要的<RSAKeyValue>格式公钥,包含<Modulus>和<Exponent>节点。
二、转换Java私钥到C# XML格式
Java生成的私钥通常是PKCS#8格式(带-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----头尾标识),里面包含Modulus、Exponent、D、P、Q、DP、DQ、InverseQ等多个参数,这些都是C# XML私钥必须的节点。
同样用BouncyCastle来解析,代码如下:
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; using System; using System.Security.Cryptography; using System.Text; public static string JavaPrivateKeyToCSharpXml(string javaPrivateKey) { // 清理Java私钥字符串:去掉头尾标识和换行符 var cleanedPrivateKey = javaPrivateKey .Replace("-----BEGIN PRIVATE KEY-----", "") .Replace("-----END PRIVATE KEY-----", "") .Replace("\n", "") .Replace("\r", ""); // 解码Base64字符串为字节数组 var privateKeyBytes = Convert.FromBase64String(cleanedPrivateKey); // 用BouncyCastle解析私钥参数 var rsaPrivateParams = PrivateKeyFactory.CreateKey(privateKeyBytes) as RsaPrivateCrtKeyParameters; if (rsaPrivateParams == null) throw new ArgumentException("无效的Java RSA私钥"); // 映射到C#的RSAParameters结构 var csharpRsaParams = new RSAParameters { Modulus = rsaPrivateParams.Modulus.ToByteArrayUnsigned(), Exponent = rsaPrivateParams.PublicExponent.ToByteArrayUnsigned(), D = rsaPrivateParams.Exponent.ToByteArrayUnsigned(), P = rsaPrivateParams.P.ToByteArrayUnsigned(), Q = rsaPrivateParams.Q.ToByteArrayUnsigned(), DP = rsaPrivateParams.DP.ToByteArrayUnsigned(), DQ = rsaPrivateParams.DQ.ToByteArrayUnsigned(), InverseQ = rsaPrivateParams.QInv.ToByteArrayUnsigned() }; // 导出为C# XML格式的私钥 using var rsaProvider = new RSACryptoServiceProvider(); rsaProvider.ImportParameters(csharpRsaParams); return rsaProvider.ToXmlString(true); // true表示导出完整私钥 }
这个方法会生成包含所有必要节点的<RSAKeyValue>私钥,直接可以给RSACryptoServiceProvider使用。
注意事项
- 如果你的Java密钥不是标准的X.509/PKCS#8格式(比如是PKCS#1格式的私钥,带
-----BEGIN RSA PRIVATE KEY-----头),需要先转换为PKCS#8格式再用上面的代码,或者调整BouncyCastle的解析逻辑; - 确保BouncyCastle库的版本和你的.NET版本兼容,避免出现依赖问题。
内容的提问来源于stack exchange,提问作者VSB
相关产品推荐
相关产品推荐

