【发布时间】:2011-01-17 11:47:27
【问题描述】:
在仅存储公钥/私钥对的公钥时,我在使用机器级 RSA 密钥容器时遇到了问题。
以下代码创建一个公共/私有对并从该对中提取公钥。该对和公钥存储在单独的密钥容器中。然后从这些密钥容器中获取密钥,此时它们应该与进入容器的密钥相同。
当为CspParameters.Flags 指定CspProviderFlags.UseDefaultKeyContainer 时,该代码有效(即从PublicKey 容器中读出的密钥是相同的),但是当为CspParameters.Flags 指定CspProviderFlags.UseMachineKeyStore 时从 PublicKey 读回的密钥不同。
为什么行为不同,我需要做些什么不同的事情来从机器级 RSA 密钥容器中检索公钥?
var publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicPrivateKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
)
{
PersistKeyInCsp = true,
};
var publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
)
{
PersistKeyInCsp = true
};
//Export the key.
publicRsa.ImportParameters(publicPrivateRsa.ExportParameters(false));
Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));
//Dispose those two CSPs.
using (publicRsa)
{
publicRsa.Clear();
}
using (publicPrivateRsa)
{
publicRsa.Clear();
}
publicPrivateRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicPrivateKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
);
publicRsa = new RSACryptoServiceProvider(new CspParameters()
{
KeyContainerName = "PublicKey",
Flags = CspProviderFlags.UseMachineKeyStore
//Flags = CspProviderFlags.UseDefaultKeyContainer
}
);
Console.WriteLine(publicRsa.ToXmlString(false));
Console.WriteLine(publicPrivateRsa.ToXmlString(false));
using (publicRsa)
{
publicRsa.Clear();
}
using (publicPrivateRsa)
{
publicRsa.Clear();
}
【问题讨论】:
-
关于这个问题的讨论可以在 MSDN (social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/…) 上找到
标签: c# cryptography rsacryptoserviceprovider