Génération de clés pour le chiffrement et le déchiffrement
Mise à jour : novembre 2007
La création et la gestion de 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 (IV Initialization Vector) qui doivent rester à l'abri de toute personne ne devant pas déchiffrer 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échiffrera les données chiffré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 chiffrement symétrique fournies par le .NET Framework nécessitent une clé et un nouveau vecteur d'initialisation (IV) pour chiffrer et déchiffrer des données. Lorsque vous créez une nouvelle instance d'une des classes de chiffrement symétriques gérées à l'aide du constructeur par défaut, une nouvelle clé et un IV sont créés automatiquement. 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 de chiffrement. 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 chiffrer la clé et le vecteur d'initialisation symétriques à l'aide d'un chiffrement asymétrique. L'envoi de ces valeurs sur un réseau non sécurisé sans chiffrement s'avère extrêmement risqué dans la mesure où n'importe quelle personne interceptant ces valeurs peut ensuite déchiffrer vos données. Pour plus d'informations sur ce processus de chiffrement et de transfert de la clé et du vecteur d'initialisation, consultez Création d'un modèle de chiffrement.
L'exemple suivant représente la création d'une nouvelle instance de la classe TripleDESCryptoServiceProvider qui implémente l'algorithme TripleDES.
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
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 de chiffrement asymétrique.
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()
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 chiffrement 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 structure RSAParameters contenant 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 à la valeur d'une structure RSAParameters à l'aide de la méthode ImportParameters.
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 la méthode de stockage d'une clé privée dans un conteneur de clé, consultez Comment : stocker des clés asymétriques dans un conteneur de clé.
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)
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
Voir aussi
Tâches
Comment : stocker des clés asymétriques dans un conteneur de clé