C# 仅从公钥创建RSACryptoServiceProvider

C# 仅从公钥创建RSACryptoServiceProvider,c#,public-key,strongname,rsacryptoserviceprovider,strong-named-key,C#,Public Key,Strongname,Rsacryptoserviceprovider,Strong Named Key,我使用密钥对我的XML进行签名(使用SignedXml),并将公钥作为嵌入资源嵌入到我的应用程序中 这里是我如何创建密钥对的 sn -k Warehouse.snk sn -p Warehouse.snk WarehousePublic.snk 当我试图阅读WarehousePublic.snk时,我得到了一个异常提供程序的错误版本。 这是我的密码: using (Stream stream = assembly.GetManifestResourceStream("WareApp.Resou

我使用密钥对我的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

        ...
        ...
        ...
    }
}
是否有方法仅从公钥创建RSACryptServiceProvider

我还尝试使用X509Certificate2

X509Certificate2 cert = new X509Certificate2(bytes);  //I got exception here
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert2.PublicKey.Key;
但我发现异常无法找到请求的对象。

有什么想法吗


谢谢

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


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

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


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

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

为了使其正常工作,您需要使用
rsacryptserviceprovider.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));
            }
        }
    }
}
我希望这能帮助遇到类似问题的人

干杯

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

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

为了使其正常工作,您需要使用
rsacryptserviceprovider.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));
            }
        }
    }
}
我希望这能帮助遇到类似问题的人

干杯

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

您好,Shaamaan,这是我尝试过的(请参阅我的原始问题),但它不起作用,因为找不到请求的对象(哦,抱歉@Sam,错过了第二位(从我的手机上写下了答案)。@Sam检查我的新答案-我完全错过了问题(再次将此归咎于我的手机:P)嗨,Shaaman,这是我尝试过的(参见我的原始问题),但它不工作,错误无法找到请求的对象。:(哦,抱歉@Sam,错过了第二位。)(从我的手机上写下答案)。@Sam检查我的新答案-我完全错过了这个问题(再次,将此归咎于我的手机:P)谢谢提醒。尽管如此,它本身将
SN
工具列为对安全性不太好的工具。别误会我的意思,找到解决这个问题的方法真是太好了(我的答案也是a+1;你可能也希望接受你自己的答案,而不是我的答案),但我敢说使用
makecert.exe
可能是最好的选择……;)天哪!你是对的!!!在这种情况下,你的答案是绝对正确的!谢谢Shaaman!谢谢你的提醒。也就是说,
SN
工具本身对安全性不是很好。别误会我的意思,我很高兴能找到解决这个问题的方法(我也给了你+1的答案;你可能还想接受你自己的答案,而不是我的),但我敢说使用
makecert.exe
可能是一种方法…;)天哪!你是对的!!!在这种情况下,你的答案绝对正确!谢谢Shaaman!