Comment conserver une clé publique dans un conteneur de clés RSA au niveau de la machine

j'ai un problème avec l'utilisation d'un conteneur de clés RSA au niveau de la machine lorsque je ne stocke que les clés publiques d'une paire de clés publiques/privées.

le code suivant crée une paire public/privé et extrait la clé publique de cette paire. La paire et la clé publique sont stockées dans des conteneurs à clé séparés. Les clés sont alors obtenues à partir de ces conteneurs clés, à partir desquels elles doivent être identiques aux clés entrant dans les conteneurs.

le code fonctionne lorsque CspProviderFlags.UseDefaultKeyContainer est spécifié pour CspParameters.Flags (c'est-à-dire que la clé lue en retrait du PublicKey conteneur est le même), mais lorsque CspProviderFlags.UseMachineKeyStore est spécifié pour CspParameters.Flags la clé lue en arrière de PublicKey est différent.

pourquoi le comportement est-il différent, et que dois-je faire différemment pour récupérer la clé publique à partir d'un conteneur RSA de niveau machine?

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();
}
9
demandé sur Will 2010-02-16 19:50:07

2 réponses

il semble que les conteneurs-clés ne soient pas destinés à cet usage (ceci est sous-entendu par" how to: Store Asymmetric Keys in a Key Container "du .net Framework Developer's Guide, et confirmé par une discussion sur MSDN ).

D'autres mécanismes, comme le stockage de la clé dans un fichier XML, doivent être utilisés pour atteindre cet objectif.

5
répondu Andrew Kimball 2010-02-18 09:38:00

Ce lien peut vous aider. http://msdn.microsoft.com/en-IN/library/tswxhw92 (v = 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();

C'est ce qu'il dit sur la suppression de clé.

-1
répondu WarrenDodsworth 2013-05-02 15:50:21