如何在密钥容器中存储私钥?

时间:2017-06-14 06:03:51

标签: c# asp.net encryption encryption-asymmetric

我想在密钥容器中存储私钥,以便为asp.net网站创建数据签名。

//First I Read PrivateKey from text file that i Uploaded with FileUpload(fuPrivateKey)
var pk = Encoding.UTF8.GetString(fuPrivateKey.FileBytes);
CspParameters csp = new CspParameters();
csp.KeyContainerName = "PrivateKeyForSignature";
DSACryptoServiceProvider rsa = new DSACryptoServiceProvider(csp);//error
rsa.FromXmlString(pk);

但我在DSACryptoServiceProvider rsa = new DSACryptoServiceProvider(csp);

的行中收到以下错误
  

指定的加密服务提供程序(CSP)不支持此密钥算法。

我已经使用此方法存储RsaCryptoServiceProvider密钥而没有任何问题。但是,当我想将它用于DSA时,它无法正常工作。

2 个答案:

答案 0 :(得分:2)

如果我看一下CspParameters的默认(无参数)构造函数,那么I get this text

  

这种形式的CspParameters会将ProviderType字段初始化为 24 的值,该字段指定PROV_RSA_AES提供程序。此默认提供程序与Aes算法兼容。

如果我查找接受32位整数I get的构造函数:

  

使用指定的提供者类型代码初始化CspParameters类的新实例。

     

...

     

要指定与DSA算法兼容的提供商,请将 13 的值传递给 dwTypeIn 参数。

所以在我看来,这可以通过使用正确的代码调用CspParameters的正确构造函数来解决。

答案 1 :(得分:1)

@MaartenBodewes提到的标准是正确的。默认情况下,CspParameters配置为RSA容器。这就是为什么,使用RSACryptoServiceProvider尝试相同时没有错误。

CspParameters csp = new CspParameters();

与:

相同
CspParameters csp = new CspParameters(1);

要在DSACryptoServiceProvider中使用加密服务,必须将参数化构造函数调用为:

CspParameters csp = new CspParameters(13);