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

将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结构),步骤如下:

  1. 先通过NuGet安装BouncyCastle.Crypto包;
  2. 用以下代码实现转换:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:48:37