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

C#使用BouncyCastle FIPS库将RSA密钥转为RSACryptoServiceProvider咨询

适配BouncyCastle FIPS版本的密钥导入实现

你只需替换ImportPrivateKey和ImportPublicKey两个函数即可,FIPS版本没有普通版自带的DotNetUtilities工具类,需要手动解析密钥参数构造RSAParameters对象。

首先确认你已经引入了FIPS版本对应的命名空间:

using Org.BouncyCastle.OpenSsl;
using Org.BouncyCastle.Crypto.Parameters;
using System.Security.Cryptography;
using System.IO;

ImportPrivateKey实现

public RSACryptoServiceProvider ImportPrivateKey(string pem)
{
    using (var stringReader = new StringReader(pem))
    {
        var pemReader = new PemReader(stringReader);
        var keyObject = pemReader.ReadObject();
        RsaPrivateCrtKeyParameters privateKeyParams;
        
        // 兼容PKCS#8格式私钥、传统RSA私钥两种常见格式
        if (keyObject is AsymmetricCipherKeyPair keyPair)
        {
            privateKeyParams = (RsaPrivateCrtKeyParameters)keyPair.Private;
        }
        else if (keyObject is RsaPrivateCrtKeyParameters rawPrivateKey)
        {
            privateKeyParams = rawPrivateKey;
        }
        else
        {
            throw new InvalidDataException("传入的PEM不是有效的RSA私钥");
        }

        // 手动构造RSAParameters参数
        var rsaParams = new RSAParameters
        {
            Modulus = privateKeyParams.Modulus.ToByteArrayUnsigned(),
            Exponent = privateKeyParams.PublicExponent.ToByteArrayUnsigned(),
            D = privateKeyParams.Exponent.ToByteArrayUnsigned(),
            P = privateKeyParams.P.ToByteArrayUnsigned(),
            Q = privateKeyParams.Q.ToByteArrayUnsigned(),
            DP = privateKeyParams.DP.ToByteArrayUnsigned(),
            DQ = privateKeyParams.DQ.ToByteArrayUnsigned(),
            InverseQ = privateKeyParams.QInv.ToByteArrayUnsigned()
        };

        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(rsaParams);
        return rsa;
    }
}

ImportPublicKey实现

public RSACryptoServiceProvider ImportPublicKey(string pem)
{
    using (var stringReader = new StringReader(pem))
    {
        var pemReader = new PemReader(stringReader);
        var keyObject = pemReader.ReadObject();
        RsaKeyParameters publicKeyParams;

        if (keyObject is RsaKeyParameters rsaKey && !rsaKey.IsPrivate)
        {
            publicKeyParams = rsaKey;
        }
        else if (keyObject is AsymmetricKeyParameter asymmetricKey && !asymmetricKey.IsPrivate)
        {
            publicKeyParams = (RsaKeyParameters)asymmetricKey;
        }
        else
        {
            throw new InvalidDataException("传入的PEM不是有效的RSA公钥");
        }

        // 手动构造RSAParameters参数
        var rsaParams = new RSAParameters
        {
            Modulus = publicKeyParams.Modulus.ToByteArrayUnsigned(),
            Exponent = publicKeyParams.Exponent.ToByteArrayUnsigned()
        };

        var rsa = new RSACryptoServiceProvider();
        rsa.ImportParameters(rsaParams);
        return rsa;
    }
}

注意事项

  • 原有加解密逻辑不需要任何修改,替换两个导入函数即可正常运行
  • FIPS版本默认要求运行环境开启FIPS合规模式,测试环境如果需要临时关闭校验,可以在程序启动时添加代码Org.BouncyCastle.Fips.CryptoServicesRegistrar.SetApprovedOnlyMode(false);,生产环境必须开启合规模式
  • 代码兼容常见的PKCS#1、PKCS#8格式的PEM密钥,不需要额外做格式转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:36:05