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
相关产品推荐
相关产品推荐

