无法将类型为'Org.BouncyCastle.Asn1.DerSequence'的对象转换为类型'Org.BouncyCastle.Asn1.DerInteger'。

4
在我的 C# 项目中,我放置了以下代码:
起初,我从使用 Bouncy Castle 创建的证书中恢复了密钥对,然后提取了私钥,我的目标是将其转换为 .pem 格式。
 AsymmetricKeyParameter private_RSA = keyPair2.Private;


            PrivateKeyInfo k_RSA = PrivateKeyInfoFactory.CreatePrivateKeyInfo(private_RSA);
            byte[] serializedKey_priv_RSA = k_RSA.ToAsn1Object().GetDerEncoded();


            //  byte[] clé = Org.BouncyCastle.Utilities.Encoders.Hex.Decode(serializedKey);

            string data_priv_RSA = Convert.ToBase64String(serializedKey_priv_RSA);

using (fluxInfos2 = new StreamWriter("myprivatekey.pem"))
        {
            string ligne = " -----BEGIN RSA PRIVATE KEY-----  ";
            fluxInfos2.WriteLine(ligne);   
            fluxInfos2.WriteLine(data_priv_RSA);
            string lige2 = "-----END RSA PRIVATE KEY----- ";

            fluxInfos2.WriteLine(lige2);


        }
        fluxInfos2.Close();

我的密钥已经完美创建,也就是说文件包含了密钥。

-----BEGIN RSA PRIVATE KEY-----

MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCQBr1EhPxHeVax8QbXQtUwaSyqhZehjxkgVp89Rkn3awfo7f9usQdLSp3tLSwAkHMvqi3UKSwUh8FlzCC0CBZCx1LOY05NS613tU/gaI7r+Zl4Iq+PevetEy8WxViRGoye/A9TU5r+BshT12MWYzVE/BYAb6OcsHZ5QztA+GDXA01YnTpgwOenkJXmrmmkSif80hk+NAWglnCqUzl3apZHhgVLpdkGDJPjhy8l9qOt6lu2gBQVX0AC8MyMt5Uqx9yFcR65+S8v8TV5Bc7Kk+9nkCl503k8Sn1fw4OWc6cMhK9E4/LF5MUIMO/UnIPQKeLbTlY8hAYG0sN0AJT/3IfxAgMBAAECggEAAyACT1BLYQmi9e1y5ozOr2Q40eJgLeM6+lam0d+Kj1HFNCql1jMFI38U+iZ2w/Rea3RX1jimejOP4LOTKhTa1swYYd4JvuebdfN7LjVWlIwv5klqYcSbRygZZ3cUuuFGl9SESJyRyl0/T4Jm5f91EnAd0hiaBjZV+7+Xs4swHrotSDrnSuMZGZ9skwws8Y0lfV6Lzvsh3+VerEq9X1yl8NJeKZrOOkAntu/yfMkcdj0+s+UvM7k8RenTCas1X5gVzv4b+CBNS9DgOmdIUUE4rSvF3ulTyWNXaWVJpvUvcT115ylxFPkyM+g1v/gqTd+L+I+npKVOK5qAtZobRTpMeQKBgQDBEWnu2Km3LxYYSDINbW7E5ytBUxIrNtwjo2IYstPJJ55hF4EQdwe7y10/eUbS/YsIj3xLXnYQGLaF52Mql/y9oCu8WsYE7CtFAhYfR19ibpM0Y2J4XXBc3r4Drg0EI9eqf6iT6vkpTlr7A0t7zPCc6YC6Sbt1o07NWuivdDdjPwKBgQC++Qjk9AmCbwXMBsRfgQMqdoAa+V137rl6dIE1/jHAQg39gKlQeEQ4ZI5+2FNqjMeSUSlkdJTvQhBWlFzeuiMU+uOix5E+aBuf8RVcmlT31rOtrF6DzV3Deg3zzT71SQIlbGp+dyJ8M9IOtZuDgUUu4asByklRNxt9GaqkfsK4zwKBgFPhNe3wMeQFUAsiqqRMzBg9+vv5lGY0AnZ1UHQ8lWjKjrPOG2PE4xZC53NhRFT8lMAWXsD7/D1ID1yjx+DEgaj9AqNlqKyQ0se7fVL/lkBUnB3ho/F5XwzqNRGyN7N5wwQvTFVfe/rnMP3nU48o3cy+YhANYqVcWys6+ObpjfrPAoGBAJd+jPy7TtPm6M1aTOuKN4225ZcAXJJokUDALUQ8uxDOFbUVHLuWPGAT/SpIx5uNxD+hHNnw1bkbSkS0exvAw1XAVVZrRCAijE+L+yszztWwv2a1h2C9SHVqXKkcF6aTXR187NoX/gZTQX6juJNQuCYhpPvNke3YbnkGJGVLnYLnAoGBAL/rT73jvNcr54hhzou8uYlFVGLNbE4IqbBIygTfC4Jd32NSZymcAL1/MLs6RvLj/Cd3DGVikS0y8nH5GGM8qxG0l1n9p96Z9AON+h0Jnen/HJvKPmq/SYkL2NNrg1CUHGL9FMDikMDBqIG/ttGIPCUZHyNAJJsMZJVfZJ9OP7Ru

-----END RSA PRIVATE KEY----- 

现在,我需要做相反的事情,即从文件中包含的数据密钥获取RsaPrivateCrtKeyParameters。为此,我编写了以下代码:

KeyFile string = @ "C: \ Users \ Me \ Documents \ Visual Studio 2010 \ Projects \ PEM \ PEM \ bin \ Debug \ myprivatekey.pem";

RsaPrivateCrtKeyParameters GetPrivateKey privat = (KeyFile);

例如 GetPrivateKey,其内容如下:
 public static RsaPrivateCrtKeyParameters GetPrivateKey(String pemFile)
    {
        if (string.IsNullOrEmpty(pemFile)) throw new ArgumentNullException("pemFile");

        string privateKey = File.Exists(pemFile) ? File.ReadAllText(pemFile) : pemFile;

        var reader = new PemReader(new StringReader(privateKey));
        RsaPrivateCrtKeyParameters privkey = null;
        Object obj = reader.ReadObject();
        if (obj is AsymmetricCipherKeyPair)
        {
            privkey = (RsaPrivateCrtKeyParameters)((AsymmetricCipherKeyPair)obj).Private;
        } return privkey;
    } 

问题在于我收到了一个异常,代码如下:Object obj = reader.ReadObject();

 Creating RSA private key problem: System.InvalidCastException:

 Unable to cast object of type 'Org.BouncyCastle.Asn1.DerSequence' to type 'Org.BouncyCastle.Asn1.DerInteger'.
    to Org.BouncyCastle.Asn1.Pkcs.RsaPrivateKeyStructure .. ctor (Asn1Sequence seq)
    to Org.BouncyCastle.OpenSsl.PemReader.ReadKeyPair (String type, String endMarker)

could you help me please, thank you for any help


请整理一下你的问题,并提供一个突出你问题的最小示例。 - hammar
1个回答

0

由于您正在以PKCS#8格式编写私钥,因此适当的PEM标题是“BEGIN PRIVATE KEY”(即没有“RSA”)。 PEM数据已经包含密钥算法,“BEGIN RSA PRIVATE KEY”表示直接编码的RsaPrivateCrtKeyParameters,这不是您要编写的内容。

在将标题更改为“BEGIN PRIVATE KEY”后,我能够解析您的示例文件。 ReadObject调用随后返回一个RsaPrivateCrtKeyParameters对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接