无法将类型为“ Org.BouncyCastle.Asn1.DerSequence”的对象转换为类型为“ Org.BouncyCastle.Asn1.DerInteger”的对象 [英] Unable to cast object of type 'Org.BouncyCastle.Asn1.DerSequence' to type 'Org.BouncyCastle.Asn1.DerInteger'

查看:2915
本文介绍了无法将类型为“ Org.BouncyCastle.Asn1.DerSequence”的对象转换为类型为“ Org.BouncyCastle.Asn1.DerInteger”的对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的c#项目中,我放置了这段代码:



最初,我从用弹性城堡创建的证书(密钥对)中恢复了,然后我提取了私钥,我的目标是,它是一种格式。 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);

字符串data_priv_RSA = Convert.ToBase64String(serializedKey_priv_RSA);

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

我的密钥创建完美,即文件包含的内容;



'pre> ----- BEGIN RSA私钥-----

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 \项目\ PEM \ PEM \ bin \ Debug \ myprivatekey.pem; 

RsaPrivateCrtKeyParameters GetPrivateKey privat =(KeyFile);

如GetPrivateKey,如下所示:

 公共静态RsaPrivateCrtKeyParameters GetPrivateKey(String pemFile)
{
if(string.IsNullOrEmpty(pemFile))throw new ArgumentNullException( pemFile);

字符串privateKey = File.Exists(pemFile)? File.ReadAllText(pemFile):pemFile;

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

问题是我收到一个异常,位于: Object obj = reader.ReadObject();

 创建RSA私钥问题:System.InvalidCastException:

无法将类型为 Org.BouncyCastle.Asn1.DerSequence的对象转换为类型为 Org.BouncyCastle.Asn1.DerInteger的对象。
到Org.BouncyCastle.Asn1.Pkcs.RsaPrivateKeyStructure .. ctor(Asn1Sequence seq)
到Org.BouncyCastle.OpenSsl.PemReader.ReadKeyPair(字符串类型,字符串endMarker)

请帮助我,谢谢您的帮助

解决方案

由于您正在以PKCS#8格式写出私钥,因此适当的PEM标头为 BEGIN PRIVATE KEY(即不带 RSA)。 PEM数据已经包含密钥的算法, BEGIN RSA PRIVATE KEY具有直接编码的RsaPrivateCrtKeyParameters的含义,而不是您要写的内容。



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


in my c # project, I put this piece of code :

initially, I recovered from the certificate that I created with bouncy castle, the key pair, then I extract the private key, my goal is that , it is in a format. 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();

my key is created perfectly, that is, what the file contains;

-----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----- 

Now, I must do the opposite, ie, from a data key contained in the file, I must have a RsaPrivateCrtKeyParameters. to do this, I wrote this little code:

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

RsaPrivateCrtKeyParameters GetPrivateKey privat = (KeyFile);

such as GetPrivateKey, is as follows:

 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;
    } 

the problem is that I receive an exception , in : 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

解决方案

Since you are writing the private key out in PKCS#8 format, the appropriate PEM header is "BEGIN PRIVATE KEY" (i.e. without the "RSA"). The PEM data already contains the algorithm for the key, and "BEGIN RSA PRIVATE KEY" has the meaning of a directly encoded RsaPrivateCrtKeyParameters, which is not what you are writing out.

I was able to parse your example file after changing the headers to "BEGIN PRIVATE KEY". ReadObject call then returns an RsaPrivateCrtKeyParameters object.

这篇关于无法将类型为“ Org.BouncyCastle.Asn1.DerSequence”的对象转换为类型为“ Org.BouncyCastle.Asn1.DerInteger”的对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆