我想在密钥容器中存储私钥,以便为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时,它无法正常工作。
答案 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);