Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用BouncyCastle读取RSA PEM私钥_C#_Rsa_Bouncycastle_Pkcs#1 - Fatal编程技术网

C# 使用BouncyCastle读取RSA PEM私钥

C# 使用BouncyCastle读取RSA PEM私钥,c#,rsa,bouncycastle,pkcs#1,C#,Rsa,Bouncycastle,Pkcs#1,我需要C#中用于导入/导出PEM/DER字符串的函数。我在python和C#上使用RSA,但我没有在这两种语言之间工作良好的解决方案。 经过多次尝试和研究,我终于找到了一个解决方案谁读PEM公钥工作。以下代码起作用: // pubkey is the PEM file without header/footer and encoded base64 Asn1Object obj = Asn1Object.FromByteArray(pubkey_bytes); DerSequence publi

我需要C#中用于导入/导出PEM/DER字符串的函数。我在python和C#上使用RSA,但我没有在这两种语言之间工作良好的解决方案。 经过多次尝试和研究,我终于找到了一个解决方案谁读PEM公钥工作。以下代码起作用:

// pubkey is the PEM file without header/footer and encoded base64
Asn1Object obj = Asn1Object.FromByteArray(pubkey_bytes);
DerSequence publicKeySequence = (DerSequence)obj;
DerSequence publicKey = (DerSequence)Asn1Object.FromByteArray(publicKeySequence.GetEncoded());

DerInteger modulus = (DerInteger)publicKey[0];
DerInteger exponent = (DerInteger)publicKey[1];

RsaKeyParameters keyParameters = new RsaKeyParameters(false, modulus.PositiveValue, exponent.PositiveValue);
RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters);
这段代码的灵感来自我在StackOverflow上找到的一个解决方案。但是,当我尝试对私钥使用相同的解决方案时,我有一个例外“指定的大小太小”。此错误似乎出现在“InverseQ”行上。下面是我正在使用的代码:

// Private key encode base64 without header/footer
Asn1Object obj = Asn1Object.FromByteArray(privkey_bytes);
DerSequence privateKeySequence = (DerSequence)obj;
DerSequence privateKey = (DerSequence)Asn1Object.FromByteArray(privateKeySequence.GetEncoded());

DerInteger M = (DerInteger)privateKey[1];
DerInteger E = (DerInteger)privateKey[2];
DerInteger D = (DerInteger)privateKey[3];
DerInteger P = (DerInteger)privateKey[4];
DerInteger Q = (DerInteger)privateKey[5];
DerInteger DP = (DerInteger)privateKey[6];
DerInteger DQ = (DerInteger)privateKey[7];
DerInteger IQ = (DerInteger)privateKey[8];

var keyParameters = new RsaPrivateCrtKeyParameters(M.PositiveValue, 
E.PositiveValue, D.PositiveValue, P.PositiveValue, Q.PositiveValue, 
DP.PositiveValue, DQ.PositiveValue, IQ.PositiveValue);

RSAParameters parameters = DotNetUtilities.ToRSAParameters(keyParameters); // Exception here !
我还在另一篇StackOverflow文章中尝试了这段代码,以解决填充问题,但这不是我的问题:

RSAParameters parameters = new RSAParameters();
parameters.Modulus = M.PositiveValue.ToByteArrayUnsigned();
parameters.Exponent = E.PositiveValue.ToByteArrayUnsigned();
parameters.P = P.PositiveValue.ToByteArrayUnsigned();
parameters.Q = Q.PositiveValue.ToByteArrayUnsigned();Modulus.Length);
parameters.DP = ConvertRSAParametersField(DP.PositiveValue, parameters.P.Length);
parameters.DQ = ConvertRSAParametersField(DQ.PositiveValue, parameters.Q.Length);
parameters.InverseQ = ConvertRSAParametersField(IQ.PositiveValue, parameters.Q.Length);

public static RSAParameters ToRSAParameters(RsaPrivateCrtKeyParameters privKey)
{
    RSAParameters rp = new RSAParameters();
    rp.Modulus = privKey.Modulus.ToByteArrayUnsigned();
    rp.Exponent = privKey.PublicExponent.ToByteArrayUnsigned();
    rp.P = privKey.P.ToByteArrayUnsigned();
    rp.Q = privKey.Q.ToByteArrayUnsigned();
    rp.D = ConvertRSAParametersField(privKey.Exponent, rp.Modulus.Length);
    rp.DP = ConvertRSAParametersField(privKey.DP, rp.P.Length);
    rp.DQ = ConvertRSAParametersField(privKey.DQ, rp.Q.Length);
    rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length); // Exception HERE
    return rp;
}

private static byte[] ConvertRSAParametersField(BigInteger n, int size)
{
    byte[] bs = n.ToByteArrayUnsigned();
    if (bs.Length == size)
        return bs;
    if (bs.Length > size) // HERE
        throw new ArgumentException("Specified size too small", "size");
    byte[] padded = new byte[size];
    Array.Copy(bs, 0, padded, size - bs.Length, bs.Length);
    return padded;
}
我的私钥是由python生成的,我认为它是一个普通密钥:

-----BEGIN RSA PRIVATE KEY-----
MIICYAIBAAKBgQCUkUk/vvyTI3begsdjz7eQVchjMTYMTyqt8HHHSXYXY2GrQCZS
VfBVxFLmx19brgMdLrKO93CjJWt+ACXAaLHmuGCsvNgGjCFqgg4XxM4Xamt9PeOc
F8HhMH7iS3OcgybQuu9GrekZB0yL2L9GVpyVrXpVlVHi4gBVjUr80e5LUwIDAQAB
AoGAGgK9wk1bxx8EZrya0BzD1J9QMB2jitApdr6MDQoNhNa/eM4IZ43oP/vZT9JE
Hbb/kJJmbKVhsQ6SHUNFO6qJA0FWYNqEA1xsTtat3RXAB/WCExxW9GwDG6pEXjK8
OrJFbKyIOhmqy3sBib9V76ROYsMi7Gioih8vtYKz8NFBiZECRQCmOHzCqEbsWJnK
5JUsUG8DyR3wg8mzi98m1qYGz3hsuBJMCW2M/QBSgyWGdDxExbQMcTb9lmTelq4W
sHbZLQ3FVxJsbwI9AOTP4ZCLDnzblroQjiUCW1vbVE6YnoO0YTb67Dj/g9CNOZpz
E0lJ3boUlg6lOEpDdwKxSswXhQU53OMJXQJFAKC+BaB0/Uk4EVnNHZkiG4lsp2Bd
AeR4wg8cCqiRYCK7Cy6u+1sZm4Mvwk05AMN88TYLEiO/mcJLswTMF9LDqAqLvoxP
AjxDmlPXo+4k37AZyzhkIN0jN5siGZ+D5DBw0RQoBv5ICOHDC0rgdW2IQ/rN2uzV
rDcmWYFy6WQI1j636ZUCRHWmzCi6ymkcUnqwlYXsjbZSVM7njOc3sJyVhaOgqs+o
1Zjbtpqq7DYEBHPFizh/nu6kf4lT3w5+vIKGs8r4k2IUMcJi
-----END RSA PRIVATE KEY-----
我对“Asn1Object.FromByteArray()”返回的参数的顺序有疑问。我注意到[0]只是一个“0”,这对我来说意味着空的。长度是9,所以这似乎是个好方法,我只是不确定它们是按什么顺序返回的。我试图找到一些文件,但什么也没找到

提前感谢那些帮助我的人

编辑
首先,我想说我的目标是得到一个对象

由于有人删除了他的帖子,我改变了主意

 rp.InverseQ = ConvertRSAParametersField(privKey.QInv, rp.Q.Length);

但在做了这件事之后,我得到了一个异常System.Security.Cryptography.CryptographyException,他在网上告诉我“数据不正确”

var csp = new RSACryptoServiceProvider(); // my csp object is already defined somewhere else but it change nothing
csp.ImportParameters(parameters); // Exception here, he doesn't like my object who doesn't seems valid for him. 

真正的问题似乎是“为什么我的对象被RSACryptoServiceProvider.ImportParameters()拒绝”

,并且似乎能够解码PKCS#1编码的RSA私钥。您尝试过吗?第一个链接是在我需要获得RSAParameters()时直接“解密”(我正在为自己做一个“RSA软件”)谁必须显示私钥的每个参数)。第二个链接是我刚才使用的代码,但它对公钥不起作用,而python生成的一些私钥也不起作用。由于存在异常,请将其添加到您的问题中。我的答案只是猜测。为什么您需要使用
ConvertsParametersField
呢?不应该使用
ToByteArrayUnsigned()
为每个属性工作?我使用这段代码是因为他来自一个似乎比我更了解RSA的人。但我已经尝试过不使用此函数,直接使用ToByteArrayUnsigned()(因为我还尝试忽略大小异常/调整字节数组的大小)=>在最后一个参数(InvQ)期间,每种情况下我都有一个异常。我更新了我的帖子,但出现了一个例外。真正的问题似乎是“为什么我的对象被RSACryptServiceProvider.ImportParameters()拒绝”,并且似乎能够解码PKCS#1编码的RSA私钥。你试过了吗?第一个链接是在我需要获取RSACameters()时直接“解密”(我正在做一个“RSA软件”)(对于我自己)必须显示私钥的每个参数)。第二个链接是我刚才使用的代码,但它对公钥不起作用,而python生成的一些私钥也不起作用。由于存在异常,请将其添加到您的问题中。我的答案只是猜测。为什么您需要使用
ConvertsParametersField
呢?不应该使用
ToByteArrayUnsigned()
为每个属性工作?我使用这段代码是因为他来自一个似乎比我更了解RSA的人。但我已经尝试过不使用此函数,直接使用ToByteArrayUnsigned()(因为我还尝试忽略大小异常/调整字节数组的大小)=>在最后一个参数(InvQ)期间,每种情况下我都有一个异常。我更新了我的帖子,但出现了一个例外。真正的问题似乎是“为什么我的对象被RSACryptoServiceProvider.ImportParameters()拒绝”
var csp = new RSACryptoServiceProvider(); // my csp object is already defined somewhere else but it change nothing
csp.ImportParameters(parameters); // Exception here, he doesn't like my object who doesn't seems valid for him.