Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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的PublicKeyFactory的CreateKey异常_C#_.net_Encryption_Bouncycastle_Pgp - Fatal编程技术网

C# BouncyCastle的PublicKeyFactory的CreateKey异常

C# BouncyCastle的PublicKeyFactory的CreateKey异常,c#,.net,encryption,bouncycastle,pgp,C#,.net,Encryption,Bouncycastle,Pgp,我试图从xml字符串创建AsymmetricKeyParameter公钥obj,如下所示: public static AsymmetricKeyParameter xmlStringToPubKey(string xmlStr) { if (String.IsNullOrEmpty(xmlStr)) { return null; } else { XDocument xdoc = XDocument.Parse(xmlSt

我试图从xml字符串创建AsymmetricKeyParameter公钥obj,如下所示:

public static AsymmetricKeyParameter xmlStringToPubKey(string xmlStr)
{
    if (String.IsNullOrEmpty(xmlStr))
    {
        return null;
    }
    else
    {
        XDocument xdoc = XDocument.Parse(xmlStr);
        return PublicKeyFactory.CreateKey(Streamify(xdoc.Descendants("Modulus").First().Value));
    }
}
我得到以下堆栈跟踪:

位于Org.BouncyCastle.Asn1.definiteLengthinInputStream.ToArray()的 Org.BouncyCastle.Asn1.Asn1InputStream.BuildObject(Int32标记,Int32 tagNo,Int32长度)在 Org.BouncyCastle.Asn1.Asn1InputStream.ReadObject()位于 Org.BouncyCastle.Asn1.Asn1Object.FromByteArray(字节[]数据)位于 Org.BouncyCastle.Security.PublicKeyFactory.CreateKey(字节[]) TestConsole.PGP.xmlStringToPubKey(String-xmlString)上的 在PGP.cs中:TestConsole.Test.Main(字符串[]args)中的第141行 测试。cs:第22行at System.AppDomain.\u下一个安全程序集(运行时程序集,字符串[]) args)位于System.AppDomain.ExecuteAssembly(字符串汇编文件, 证据汇编安全性,字符串[]args)位于 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在System.Threading.ThreadHelper.ThreadStart_上下文(对象状态)
位于System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext、ContextCallback回调、对象状态、布尔值 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback回调、对象状态、布尔值 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext、ContextCallback回调、对象状态)位于 System.Threading.ThreadHelper.ThreadStart()

虽然c#的文档很少甚至没有,但方法(CreateKey)描述接受字节数组或流作为参数。我尝试了许多方法将字符串转换为字节,但仍然无法使其工作。
欢迎提供任何提示/帮助。

PublicKeyFactory.CreateKey方法需要一个包含ASN.1编码结构的流。您得到的错误表明流没有传递正确编码的ASN.1对象

如果知道要创建的键的类型,可以直接从键参数创建
AsymmetricKeyParameter
子类型实例

例如,对于RSA密钥:

BigInteger modulus = new BigInteger(xdoc.Descendants("Modulus").First().Value);
BigInteger exponent = new BigInteger(xdoc.Descendants("Exponenet").First().Value);
AsymmetricKeyParameter param = new RsaKeyParameters(false, modulus, exponent);

谢谢后续问题:考虑到我可以直接访问D(私钥)或P或Q,我如何创建私钥的另一个AsymmetricKeyParameter?创建私钥几乎很简单:(在伪代码中)AsymmetricKeyParameter param=新的RsaKeyParameters(true,pq,D);您需要访问专用指数“d”和模数m=pq