Partager via


Génération de clés pour le cryptage et le décryptage

La création et la gestion de clés constituent une part importante du processus cryptographique. Les algorithmes symétriques nécessitent la création d'une clé et d'un vecteur d'initialisation (IV Initialization Vector) qui doivent rester à l'abri de toute personne ne devant pas décrypter vos données. Les algorithmes asymétriques nécessitent la création d'une clé publique et d'une clé privée. La clé publique peut être rendue publique à n'importe qui, alors que la clé privée ne doit être connue que de la partie qui décryptera les données cryptées à l'aide de la clé publique. Cette section décrit comment générer et gérer des clés à la fois pour les algorithmes symétriques et les algorithmes asymétriques.

Clés symétriques

Les classes de cryptage symétrique fournies par le .NET Framework nécessite une clé et nouveau vecteur d'initialisation pour crypter et décrypter des données. À chaque fois que vous créez une nouvelle instance d'une des classes cryptographiques symétriques managées à l'aide du constructeur par défaut, une nouvelle clé et un nouveau vecteur d'initialisation sont créés automatiquement. Toute personne que vous souhaitez être en mesure de décrypter vos données doit posséder la même clé et le même vecteur d'initialisation, et doit utiliser le même algorithme de cryptage. Généralement, une nouvelle clé et un nouveau vecteur d'initialisation doivent être créés pour chaque session. Ni la clé, ni le vecteur d'initialisation ne doivent être stockés pour une utilisation lors d'une session ultérieure.

Pour communiquer une clé et un vecteur d'initialisation symétriques à une partie distante, vous devez habituellement crypter la clé et le vecteur d'initialisation symétriques à l'aide d'un cryptage asymétrique. L'envoi de ces valeurs sur un réseau non sécurisé sans cryptage s'avère extrêmement risqué dans la mesure où n'importe quelle personne interceptant ces valeurs a le pouvoir de décrypter vos données. Pour plus d'informations sur ce processus de cryptage et de transfert de la clé et du vecteur d'initialisation, consultez Création d'un modèle cryptographique.

L'exemple suivant montre la création d'une nouvelle instance de la classe TripleDESCryptoServiceProvider qui implémente l'algorithme TripleDES.

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
[C#]
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();

Lorsque le code précédent est exécuté, une nouvelle clé et un nouveau vecteur d'initialisation sont générés et placés dans les propriétés Key et IV, respectivement.

Dans certains cas, il vous faudra générer plusieurs clés. Dans cette situation, vous pouvez créer une nouvelle instance d'une classe qui implémente un algorithme symétrique puis créer une nouvelle clé et un nouveau vecteur d'initialisation en appelant les méthodes GenerateKey et GenerateIV. L'exemple de code suivant illustre la manière de créer de nouvelles clés et de nouveaux vecteurs d'initialisation après la création d'une nouvelle instance de la classe cryptographique asymétrique.

Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
[C#]
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();

Lorsque le code précédent est exécuté, une nouvelle clé et un nouveau vecteur d'initialisation sont générés lors de la création de la nouvelle instance TripleDESCryptoServiceProvider. Une autre clé et un autre vecteur d'initialisation sont créés lorsque les méthodes GenerateKey et GenerateIV sont appelées.

Clés asymétriques

Le .NET Framework fournit les classes RSACryptoServiceProvider et DSACryptoServiceProvider pour le cryptage asymétrique. Ces classes créent une paire de clés publique/privée lorsque vous utilisez le constructeur par défaut pour créer une nouvelle instance. Les clés asymétriques peuvent être soit stockées dans de multiples sessions, soit générées pour une seule session seulement. S'il est possible de rendre la clé publique disponible à tous, la clé privée doit être conservée sous protection.

Une paire de clé publique/privée est générée chaque fois qu'une nouvelle instance d'une classe d'algorithme asymétrique est créée. Une fois créée une nouvelle instance de la classe, les informations sur les clés peuvent être extraites à l'aide de l'une des deux méthodes suivantes :

  • La méthode ToXMLString qui retourne une représentation XML des informations sur les clés.
  • La méthode ExportParameters qui retourne une énumération RSAParameters pour stocker les informations sur les clés.

Ces deux méthodes acceptent une valeur Boolean qui indique s'il faut retourner uniquement les informations de clé publique ou les informations de clé privée et de clé publique. Une classe RSACryptoServiceProvider peut être initialisée en lui donnant la valeur d'une structure RSAParameters à l'aide de la méthode ImportParameters.

L'exemple de code suivant crée une nouvelle instance de la classe RSACryptoServiceProvider qui crée une paire de clés privée/publique, et enregistre les informations de clé publique dans une structure RSAParameters.

'Generate a public/private key pair.
Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider()
'Save the public key information to an RSAParameters structure.
Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)
[C#]
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);

Stockage de clés asymétriques dans un conteneur de clé

Les clés privées asymétriques ne doivent jamais être stockées textuellement ou sous forme de texte brut sur l'ordinateur local. Si vous avez besoin de stocker une clé privée, vous devez utiliser un conteneur de clé. Pour plus d'informations sur les conteneurs de clé, consultez la section CryptoAPI de la documentation du SDK Platform à l'adresse https://msdn.microsoft.com.

Pour créer une clé asymétrique et l'enregistrer dans un conteneur de clé

  1. Créez une nouvelle instance de la classe CspParameters et passez le nom que vous voulez attribuer au conteneur de clé au champ CspParameters.KeyContainerName.
  2. Créez une nouvelle instance d'une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez à son constructeur l'objet CspParameters créé précédemment.

Pour supprimer une clé d'un conteneur de clé

  1. Créez une nouvelle instance d'une classe CspParameters et passez le nom que vous voulez attribuer au conteneur de clé au champ CspParameters.KeyContainerName.
  2. Créez une nouvelle instance d'une classe qui dérive de la classe AsymmetricAlgorithm (généralement RSACryptoServiceProvider ou DSACryptoServiceProvider) et passez à son constructeur l'objet CspParameters créé précédemment.
  3. Assignez à la propriété PersistKeyInCSP de la classe qui dérive de AsymmetricAlgorithm la valeur false (False dans Visual Basic).
  4. Appelez la méthode Clear de la classe qui dérive de AsymmetricAlgorithm. Cette méthode libère toutes les ressources de la classe et efface le conteneur de clé.

L'exemple suivant illustre la création d'une clé asymétrique, son enregistrement dans un conteneur de clé, l'extraction de la clé ultérieurement et la suppression de celle-ci du conteneur.

Imports System
Imports System.IO
Imports System.Security.Cryptography
 _

Public Class StoreKey

    Public Shared Sub Main()
        Try
            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")

            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

            ' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        End Try
    End Sub

    Public Shared Sub GenKey_SaveInContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        ' name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

        ' Display the key information to the console.
        Console.WriteLine("Key added to container:  {0}", rsa.ToXmlString(True))
    End Sub

    Public Shared Sub GetKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

        ' Display the key information to the console.
        Console.WriteLine("Key retrieved from container : {0}", rsa.ToXmlString(True))
    End Sub

    Public Shared Sub DeleteKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container 
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

        ' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container.
        Dim rsa As 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()

        Console.WriteLine("Key deleted.")
    End Sub
End Class
[C#]
using System;
using System.IO;
using System.Security.Cryptography;

public class StoreKey

{
    public static void Main()
    {
        try
        {
            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");
            
            // Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer");
    
            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");

            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");

            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }

    }

    public static void GenKey_SaveInContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

        // Display the key information to the console.
        Console.WriteLine("Key added to container: \n  {0}", rsa.ToXmlString(true));
    }

    public static void GetKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

        // Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

        // Display the key information to the console.
        Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
    }

    public static void DeleteKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container 
        // name used to store the RSA key pair.
        CspParameters 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();

        Console.WriteLine("Key deleted.");
    }
}

Une fois exécuté l'exemple précédent, le code suivant est affiché sur la console.

Key added to container:

<RSAKeyValue> ...Key Information A...</RSAKeyValue>

Key retrieved from container :

<RSAKeyValue> ...Key Information A...</RSAKeyValue>

Key deleted.

Key added to container:

<RSAKeyValue> ...Key Information B...</RSAKeyValue>

Key deleted.

Voir aussi

Cryptage de données | Décryptage de données Tâches cryptographiques Services cryptographiques