【问题标题】:How to convert RSA public key to string using BouncyCastle c#如何使用 BouncyCastle c# 将 RSA 公钥转换为字符串
【发布时间】:2019-09-22 09:31:46
【问题描述】:

我正在尝试将 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;

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

【问题讨论】:

    标签: c# rsa bouncycastle key-pair


    【解决方案1】:

    可以使用 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);
    

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

    publicKeyDer(作为十六进制字符串)和publicKeyDerBase64,都可以在 ASN.1-Editor 中显示,例如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 格式本质上是使用隐式 Base64 编码(例如解释 here)和页眉 (-----BEGIN PUBLIC KEY-----) 和页脚 (-----END PUBLIC KEY-----) 的 DER 格式的文本表示。因此,publicKeyDerBase64publicKeyPEM 的 Base64 编码部分是相同的(如果忽略换行符)。

    【讨论】:

    • 谢谢!这行得通。我转换为PEM,并在签名验证过程中使用反向。
    猜你喜欢
    • 2012-02-23
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 2021-06-07
    • 2015-03-21
    • 2014-11-27
    • 2015-10-19
    • 2011-03-10
    相关资源
    最近更新 更多