如何将私钥存储在Key Container中?

How to store private key in Key Container?

我想将私钥存储在密钥容器中,以便为 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); 行收到以下错误:

The specified cryptographic service provider (CSP) does not support this key algorithm.

我已经使用这种方法存储 RsaCryptoServiceProvider 密钥,没有任何问题。但是,当我想将它用于 DSA 时,它不起作用。

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

This form of CspParameters initializes the ProviderType field to a value of 24, which specifies the PROV_RSA_AES provider. This default provider is compatible with the Aes algorithm.

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

Initializes a new instance of the CspParameters class with the specified provider type code.

...

To specify a provider compatible with the DSA algorithm, pass a value of 13to the dwTypeIn parameter.

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

@MaartenBodewes 提到的标准是正确的。 CspParameters 默认配置为 RSA 容器。这就是为什么用 RSACryptoServiceProvider.

尝试相同时没有错误的原因
CspParameters csp = new CspParameters();

等同于:

CspParameters csp = new CspParameters(1);

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

CspParameters csp = new CspParameters(13);