2010-02-16 8 views
9

Ho riscontrato un problema nell'utilizzo di un contenitore di chiavi RSA a livello di macchina quando si memorizza solo la chiave pubblica di una coppia di chiavi pubblica/privata.Come memorizzare una chiave pubblica in un contenitore di chiavi RSA a livello di macchina

Il codice seguente crea una coppia pubblica/privata ed estrae la chiave pubblica da quella coppia. La coppia e la chiave pubblica sono memorizzate in contenitori di chiavi separati. Le chiavi vengono quindi ottenute da quei contenitori di chiavi, a quel punto dovrebbero essere uguali alle chiavi che entrano nei contenitori.

Il codice funziona quando CspProviderFlags.UseDefaultKeyContainer è specificato per CspParameters.Flags (cioè la chiave riletti dalla PublicKey contenitore è lo stesso), ma quando CspProviderFlags.UseMachineKeyStore è specificato per CspParameters.Flags la chiave riletti da PublicKey è diverso.

Perché il comportamento è diverso e cosa devo fare in modo diverso per recuperare la chiave pubblica da un contenitore di chiavi RSA a livello di macchina?

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

Una discussione su questa domanda può essere trovata su MSDN (http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e3902420-3a82-42cf-a4a3-de230ebcea56) –

risposta

4

Sembra che i contenitori chiave non sono destinati a questo scopo (questo è implicito "Procedura: Conservare asimmetrici chiavi in ​​un contenitore di chiave" dalla Guida gli sviluppatori di .NET Framework, e confermato da a disccusion on MSDN).

Altri meccanismi, come la memorizzazione della chiave in un file XML, devono essere utilizzati per raggiungere questo obiettivo.

-1

Questo collegamento può esserti utile. 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(); 

Questo è ciò che dice di eliminazione chiave.