2010-02-16 20 views
9

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(); 
} 
+1

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) –

Respuesta

4

Parece que los recipientes clave no están destinados para este fin (esto está implícito en "Cómo: Tienda asimétricas Claves en un contenedor de claves" de la Guía del programador de .NET Framework, y confirmados por a disccusion on MSDN).

Se deben utilizar otros mecanismos, como el almacenamiento de la clave en un archivo XML, para lograr este objetivo.

-1

Este enlace puede ayudarlo. 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(); 

Esto es lo que dice acerca de la eliminación de clave.

Cuestiones relacionadas