首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅从公钥创建RSACryptoServiceProvider

仅从公钥创建RSACryptoServiceProvider
EN

Stack Overflow用户
提问于 2018-07-16 12:52:30
回答 2查看 1.2K关注 0票数 1

我使用密钥对来签署我的XML (使用SignedXml),并将公钥作为嵌入式资源嵌入到我的应用程序中。

这里我是如何创建密钥对的

代码语言:javascript
复制
sn -k Warehouse.snk
sn -p Warehouse.snk WarehousePublic.snk

当我试图阅读WarehousePublic.snk时,我得到了一个异常坏版本的提供者.

这是我的代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
X509Certificate2 cert = new X509Certificate2(bytes);  //I got exception here
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert2.PublicKey.Key;

但是我得到了异常,找不到所请求的对象.

有什么想法吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-16 13:10:30

我认为不支持使用SN生成用于签名的证书(至少使用RSACryptoServiceProvider )。我想这就能解释错误了。在Windows中,您要寻找的是.PFX文件(即带密钥的证书)和.CER文件(没有私钥的证书)。

SN (MSDN链路)不提供安全性,只用于标识。您可以使用IIS或makecert.exe生成一个自签名证书,该证书应该与您要做的操作(即.PFX文件和/或已导入到中的证书)一起工作。然后,您可以从其中提取.CER文件,并将其用于项目。

票数 3
EN

Stack Overflow用户

发布于 2018-07-18 12:01:01

我会接受沙玛的回答,因为他是“”对的。您实际上可以使用SN签署证书。ImportCspBlob()会工作的!但是,当您试图导入使用sn -p Warehouse.snk WarehousePublic.snk生成的公钥时,它将无法工作。

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

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

代码语言:javascript
复制
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]

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

代码语言:javascript
复制
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(stream.ReadToEnd());

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

干杯

已更新

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51362311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档