仅从公钥创建RSACryptoServiceProvider



我使用密钥对对XML进行签名(使用SignedXml(,并将公钥作为嵌入资源嵌入到我的应用程序中。

以下是我如何创建密钥对

sn -k Warehouse.snk
sn -p Warehouse.snk WarehousePublic.snk

当我尝试读取WarehousePublic.snk时,我得到一个异常提供程序的错误版本

这是我的代码:

using (Stream stream = assembly.GetManifestResourceStream("WareApp.Resources.WarehousePublic.snk"))
{
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(bytes);  //the exception occurred here
...
...
...
}
}

有没有办法只从公钥创建RSACryptoServiceProvider

我也尝试过使用X509Certificate2

X509Certificate2 cert = new X509Certificate2(bytes);  //I got exception here
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert2.PublicKey.Key;

但我得到异常找不到请求的对象

知道吗?

感谢

我会接受Shaamaan的回答,因为他是">一半"对。您实际上可以使用序列号来签署证书。ImportCspBlob()将起作用!但是,当您尝试导入使用sn -p Warehouse.snk WarehousePublic.snk生成的公钥时,它不会起作用。

为了使它发挥作用,您需要使用RSACryptoServiceProvider.ToXmlString(false)在XML中生成公钥,并将其作为"嵌入式资源"嵌入。

我所做的是创建一个控制台应用程序。只需剪切并粘贴下面的代码即可在XML文件中生成公钥。

class Program
{
static void Main(string[] args)
{
if (args.Length < 2)
{
Console.WriteLine("Invalid Argument");
Console.WriteLine("Usage:");
Console.WriteLine("tExtractPublicKey [Input SNK File] [Output XML File]");
return;
}
using (FileStream fs = File.Open(args[0], FileMode.Open, FileAccess.Read))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, bytes.Length);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.ImportCspBlob(bytes);
using (StreamWriter sw = new StreamWriter(File.Open(args[1], FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)))
sw.Write(rsa.ToXmlString(false));
}
}
}
}

编译后,要使用可执行文件,只需调用:ExtractPublicKey.exe [SNK File with Private Key] [Output Public Key in XML File]

要使用嵌入式证书,只需执行以下操作:

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(stream.ReadToEnd());

我希望这能帮助遇到类似问题的人。

干杯

更新

应该遵循Shaamaan的答案。请阅读带有MSDN链接的Shaamaan评论。他的回答是站着的,因为他不仅提供了一种正确的安全方式,而且还告诉我为什么SN不是正确的安全工具。谢谢沙曼!

我认为不支持使用SN生成用于签名的证书(至少使用RSACryptoServiceProvider(。我认为这可以解释错误。在Windows中,您要查找的是.PFX文件(即带密钥的证书(和.CER文件(无私钥的证书(。

SN(MSDN链接(不提供安全性,仅用于标识。您可以使用IIS或makecert.exe生成自签名证书,该证书应与您尝试执行的操作配合使用(即.PFX文件和/或已导入Windows证书存储的证书(。然后,您可以从中提取.CER文件,并将其用于您的项目。

相关内容

  • 没有找到相关文章

最新更新