2010-02-16 73 views
9

我在使用机器级别的RSA密钥容器时仅存储公钥/私钥对的公钥时出现问题。如何将公钥存储在机器级别的RSA密钥容器中

以下代码创建一个公共/私有对,并从该对中提取公钥。该对和公钥存储在单独的密钥容器中。然后从这些密钥容器中获得密钥,此时它们应该与进入容器的密钥相同。当用于CspParameters.Flags指定CspProviderFlags.UseDefaultKeyContainer(即,密钥读取来自公钥容器背出是相同的),但是当用于CspParameters.Flags指定CspProviderFlags.UseMachineKeyStore读取公钥背面的键是不同

代码工作。

为什么行为不同,我需要做什么不同才能从机器级别的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(); 
} 
+1

有关此问题的讨论可以在MSDN上找到(http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e3902420-3a82-42cf-a4a3-de230ebcea56) –

回答

4

看来,密钥容器不能用于这一目的(这暗含“如何:存储非对称密钥在密钥容器”从.NET Framework开发人员指南,并通过a disccusion on MSDN确认)。

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

-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(); 

这就是关于删除键的说法。