Générer des clés pour le chiffrement et le déchiffrement

La création et la gestion des clés constituent une part importante du processus de chiffrement. Les algorithmes symétriques nécessitent la création d'une clé et d'un vecteur d'initialisation. Vous devez garder cette clé secrète contre toute personne qui ne soit pas autorisée à déchiffrer vos données. Le vecteur d’initialisation peut être divulgué, mais doit être modifié à chaque session. Les algorithmes asymétriques nécessitent la création d'une clé publique et d'une clé privée. La clé publique peut être mise à la connaissance de n’importe qui, mais le personnel responsable du déchiffrement doit uniquement connaître la clé privée correspondante. Cette section décrit comment générer et gérer des clés pour les algorithmes symétriques et asymétriques.

Clés symétriques

Les classes de chiffrement symétrique fournies par .NET nécessitent une clé et un nouveau vecteur d’initialisation pour chiffrer et déchiffrer les données. Une clé et un vecteur d’initialisation sont automatiquement créés lorsque vous créez une instance de l’une des classes de chiffrement symétrique managées à l’aide de la méthode Create() sans paramètres. Toute personne que vous autorisez à déchiffrer vos données doit posséder la même clé et le même vecteur d'initialisation, et doit utiliser le même algorithme. En général, 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 en vue d’être utilisés dans une session ultérieure.

Pour communiquer une clé symétrique et un vecteur d’initialisation à une partie distante, en général, vous chiffrez la clé symétrique à l’aide du chiffrement asymétrique. L’envoi d’une clé non chiffrée vers un réseau non sécurisé est risqué, car toute personne qui intercepte la clé et le vecteur d’initialisation peut ensuite déchiffrer vos données.

L’exemple suivant montre la création d’une instance de la classe d’implémentation par défaut pour l’algorithme Aes :

Dim aes As Aes = Aes.Create()  
Aes aes = Aes.Create();  

L’exécution du code précédent génère une nouvelle clé et un nouveau vecteur d’initialisation et les définit en tant que valeurs pour les propriétés Clé et Vecteur d’initialisation, respectivement.

Vous devrez parfois générer plusieurs clés. Dans ce cas, vous pouvez créer une instance de classe qui implémente un algorithme symétrique. Ensuite, créez une clé et un vecteur d’initialisation en appelant les méthodes GenerateKey et GenerateIV. L’exemple de code suivant montre comment créer de nouvelles clés et de nouveaux vecteurs d’initialisation après la création d’une nouvelle instance de la classe de chiffrement symétrique :

Dim aes As Aes = Aes.Create()  
aes.GenerateIV()  
aes.GenerateKey()  
Aes aes = Aes.Create();  
aes.GenerateIV();  
aes.GenerateKey();  

L’exécution du code précédent crée une nouvelle instance de Aes et génère une clé et un vecteur d’initialisation. Une autre clé et un autre vecteur d’initialisation sont créés quand les méthodes GenerateKey et GenerateIV sont appelées.

Clés asymétriques

.NET fournit la classe RSA pour le chiffrement asymétrique. Lorsque vous utilisez la méthode Create() sans paramètres pour créer une instance, la classe RSA crée une paire de clés publique/privée. Les clés asymétriques peuvent être stockées en vue d'être utilisées pour plusieurs sessions, ou bien être générées pour une session unique. Bien que vous puissiez rendre la clé publique disponible, vous devez protéger étroitement la clé privée.

Une paire de clés publique/privée est générée lorsque vous créez une nouvelle instance d’une classe d’algorithme asymétrique. Après avoir créé une instance de la classe, vous pouvez extraire les informations de clé à l’aide de la méthode ExportParameters. La méthode retourne une structure RSAParameters qui contient les informations de clé. La méthode accepte également une valeur booléenne qui indique s’il faut retourner uniquement les informations concernant la clé publique ou retourner les informations concernant la clé publique et la clé privée.

Vous pouvez également utiliser d’autres méthodes pour extraire les informations de clé, par exemple :

Vous pouvez utiliser la méthode ImportParameters pour initialiser une instance RSA à la valeur d’une structure RSAParameters. Vous pouvez également utiliser la méthode RSA.Create(RSAParameters) pour créer une instance.

Ne stockez jamais les clés privées asymétriques sous forme de chaîne textuelle ou texte brut sur l’ordinateur local. Si vous avez besoin de stocker une clé privée, vous devez utiliser un conteneur de clés. Pour plus d’informations sur la façon de stocker une clé privée dans un conteneur de clés, consultez Comment stocker des clés asymétriques dans un conteneur de clés.

L’exemple de code suivant crée une nouvelle instance de la classe RSA, en créant une paire de clés publique/privée et en enregistrant les informations de la clé publique dans une structure RSAParameters :

'Generate a public/private key pair.  
Dim rsa as RSA = RSA.Create()  
'Save the public key information to an RSAParameters structure.  
Dim rsaKeyInfo As RSAParameters = rsa.ExportParameters(false)  
//Generate a public/private key pair.  
RSA rsa = RSA.Create();  
//Save the public key information to an RSAParameters structure.  
RSAParameters rsaKeyInfo = rsa.ExportParameters(false);  

Voir aussi