Tengo un problema al utilizar un contenedor de clave RSA a nivel de máquina al almacenar solo la clave pública de un par de claves pública/privada.Cómo almacenar una clave pública en un contenedor de clave RSA a nivel de máquina
El siguiente código crea un par público/privado y extrae la clave pública de ese par. El par y la clave pública se almacenan en contenedores de claves independientes. Las claves se obtienen a partir de esos contenedores de claves en cuyo punto deberían ser las mismas que las que entran en los contenedores.
El código funciona cuando se especifica CspProviderFlags.UseDefaultKeyContainer
para CspParameters.Flags
(es decir, la tecla de lectura de vuelta hacia fuera de la PublicKey recipiente es la misma), pero cuando se especifica CspProviderFlags.UseMachineKeyStore
para CspParameters.Flags
la tecla Leer volver de PublicKey es diferente.
¿Por qué es diferente el comportamiento y qué debo hacer de forma diferente para recuperar la clave pública desde un contenedor de claves RSA a nivel de máquina?
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();
}
Se puede encontrar una discusión sobre esta cuestión en MSDN (http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e3902420-3a82-42cf-a4a3-de230ebcea56) –