gpt4 book ai didi

c# - 仅从公钥创建 RSACryptoServiceProvider

转载 作者:太空宇宙 更新时间:2023-11-03 22:43:02 27 4
gpt4 key购买 nike

我正在使用 key 对对我的 XML 进行签名(使用 SignedXml),并将公钥作为嵌入式资源嵌入到我的应用中。

这里是我如何创建 key 对

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

当我尝试读取 WarehousePublic.snk 时出现异常 Bad Version of provider.

这是我的代码:

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 的回答,因为他“一半”是对的。您实际上可以使用 SN 来签署证书。 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 文件] [在 XML 文件中输出公钥]

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

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

我希望这对遇到类似问题的人有所帮助。

干杯

已更新

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

关于c# - 仅从公钥创建 RSACryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51362311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com