如何将公钥存储在机器级RSA密钥容器中

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

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

代码适用于为CspParameters.Flags指定CspParameters.Flags (即从PublicKey容器读回的密钥相同),但是当为CspParameters.Flags指定CspParameters.Flags ,从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(); } 

似乎密钥容器不是为此目的而设计的(这是“如何:在.NET Framework开发人员指南中存储密钥容器中的非对称密钥”所暗示的,并通过对MSDN的讨论得到证实)。

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

这个链接可以帮到你。 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(); 

这就是关于密钥删除的说法。