如何使用BouncyCastle c#

时间:2019-05-03 20:13:07

标签: c# rsa bouncycastle key-pair

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

使用BouncyCastle c#。

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

我发现了如下有关转换为字节然后为字符串的文章;

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;

公钥应先字节然后字符串,以保存到数据库中。

1 个答案:

答案 0 :(得分:0)

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

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

在这里,publicKey是存储在RsaKeyParameters实例中的公钥。反向过程是:

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

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

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

另一种方法是使用Org.BouncyCastle.OpenSsl.PEMWriter-和Org.BouncyCastle.OpenSsl.PEMReader-类创建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格式本质上是使用隐式Base64编码(例如解释的here),标头(-----BEGIN PUBLIC KEY-----)和页脚(-----END PUBLIC KEY-----的DER格式的文本表示。 )。因此,publicKeyDerBase64publicKeyPEM的Base64编码部分都是相同的(如果忽略了换行符)。