C# BouncyCastle的PublicKeyFactory的CreateKey异常
我试图从xml字符串创建AsymmetricKeyParameter公钥obj,如下所示: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
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