如何使用 BouncyCastle c# 将 RSA public 密钥转换为字符串

How to convert RSA public key to string using BouncyCastle c#

我正在尝试将 RsaKeyParameter Public 密钥保存到 SQL 数据库中。我收到 Bouncy Castle 无法将 RsaKeyParameters 转换为字节的错误消息。

使用 BouncyCastle c#。

我生成了一个 RSA 密钥对,将私钥和 public 密钥提取到变量中。然后,我需要存储 public 密钥,以便稍后在应用程序中进行验证。

我发现 post 转换为字节然后字符串如下;

byte[] serializedPublicBytes = 
publicKeyInfo.ToAsn1Object().GetDerEncoded();
string serializedPublic = Convert.ToBase64String(serializedPublicBytes);

但它不喜欢 ToAsn1Object。只是补充一下,这是一个例子,我知道我的变量名不同。

        RsaKeyPairGenerator rsaKeyPairGen = new RsaKeyPairGenerator();
        rsaKeyPairGen.Init(new KeyGenerationParameters(new SecureRandom(), 2048));
        AsymmetricCipherKeyPair keyPair = rsaKeyPairGen.GenerateKeyPair();

        RsaKeyParameters PrivateKey = (RsaKeyParameters)keyPair.Private;
        RsaKeyParameters PublicKey = (RsaKeyParameters)keyPair.Public;

public key 应该是byte,然后是string,才能存入数据库。

可以使用 BouncyCastle 将 public 密钥转换为 X.509/SubjectPublicKeyInfo-ASN.1/DER 格式。这是一种二进制格式,可以使用 Base64 编码从中生成字符串:

byte[] publicKeyDer = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey).GetDerEncoded();
String publicKeyDerBase64 = Convert.ToBase64String(publicKeyDer);

这里,publicKey是存储在RsaKeyParameters实例中的public键。逆过程为:

byte[] publicKeyDerRestored = Convert.FromBase64String(publicKeyDerBase64);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)PublicKeyFactory.CreateKey(publicKeyDerRestored);

X.509/SubjectPublicKeyInfo 和 ASN.1/DER 格式的详细说明可以分别在 here and here 中找到。

publicKeyDer(作为十六进制字符串)和 publicKeyDerBase64 都可以在 ASN.1 编辑器中显示,例如https://lapo.it/asn1js/

另一种方法是使用 Org.BouncyCastle.OpenSsl.PEMWriter- 和 Org.BouncyCastle.OpenSsl.PEMReader-class 创建 PEM 格式 (不要与 Org.BouncyCastle.Utilities.IO.Pem.PEMWriter/PEMReader 混淆):

TextWriter textWriter = new StringWriter();
PemWriter pemWriter = new PemWriter(textWriter);
pemWriter.WriteObject(publicKey);
pemWriter.Writer.Flush();
String publicKeyPEM = textWriter.ToString();

反过来是:

TextReader textReader = new StringReader(publicKeyPEM);
PemReader pemReader = new PemReader(textReader);
RsaKeyParameters publicKeyRestored = (RsaKeyParameters)pemReader.ReadObject();

PEM 格式本质上是 DER 格式的文本表示,使用隐式 Base64 编码(例如解释 here)和页眉 (-----BEGIN PUBLIC KEY-----) 和页脚 (-----END PUBLIC KEY-----).因此,publicKeyDerBase64publicKeyPEM.

的 Base64 编码部分相同(如果忽略换行符)