2010-02-16 72 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(); 

這就是關於刪除鍵的說法。