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