9

仅存储公钥/私钥对的公钥时,我在使用机器级 RSA 密钥容器时遇到问题。

以下代码创建一个公/私对并从该对中提取公钥。该对和公钥存储在单独的密钥容器中。然后从这些密钥容器中获取密钥,此时它们应该与进入容器的密钥相同。

代码在CspProviderFlags.UseDefaultKeyContainer指定时有效CspParameters.Flags(即从PublicKey容器中读取的密钥相同),但在CspProviderFlags.UseMachineKeyStore指定时CspParameters.FlagsPublicKey读取的密钥不同。

为什么行为不同,我需要做些什么不同的事情来从机器级 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();
}
4

2 回答 2

5

似乎密钥容器不适用于此目的(.NET Framework 开发人员指南中的“如何:将非对称密钥存储在密钥容器中”暗示了这一点,并由MSDN 上的讨论确认)。

需要使用其他机制(例如将密钥存储在 XML 文件中)来实现此目标。

于 2010-02-18T09:38:00.340 回答
-1

此链接可能会对您有所帮助。http://msdn.microsoft.com/en-IN/library/tswxhw92(v=vs.80).aspx

var cp = new CspParameters();
cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
// the key container.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Delete the key entry in the container.
rsa.PersistKeyInCsp = false;

// Call Clear to release resources and delete the key from the container.
rsa.Clear();

这就是它所说的密钥删除。

于 2013-05-02T15:48:48.247 回答