Partager via


Clés de chiffrement

Cet article montre comment utiliser les fonctions de dérivation de clés standard, et chiffrer du contenu à l’aide de clés symétriques et asymétriques.

Clés symétriques

Le chiffrement à clé symétrique, également appelé chiffrement de clé secrète, exige que la clé utilisée pour le chiffrement soit également utilisée pour le déchiffrement. Vous pouvez utiliser une classe SymmetricKeyAlgorithmProvider pour spécifier un algorithme symétrique et créer ou importer une clé. Vous pouvez utiliser des méthodes statiques sur la classe CryptographicEngine pour chiffrer et déchiffrer des données à l’aide de l’algorithme et de la clé.

Le chiffrement à clé symétrique utilise généralement des chiffrements de bloc et des modes de chiffrement de bloc. Un chiffrement de bloc est une fonction de chiffrement symétrique qui fonctionne sur des blocs de taille fixe. Si le message que vous souhaitez chiffrer est plus long que la longueur du bloc, vous devez utiliser un mode de chiffrement de bloc. Un mode de chiffrement de bloc est une fonction de chiffrement symétrique créée à l’aide d’un chiffrement de bloc. Il chiffre le texte en clair sous la forme d’une série de blocs de taille fixe. Les modes suivants sont pris en charge pour les applications :

  • Le mode BCE (codebook électronique) chiffre chaque bloc du message séparément. Cela n’est pas considéré comme un mode de chiffrement sécurisé.
  • Le mode CBC (chaînage de blocs de chiffrement) utilise le bloc de texte chiffré précédent pour obfusquer le bloc actuel. Vous devez déterminer la valeur à utiliser pour le premier bloc. Cette valeur est appelée vecteur d’initialisation (IV).
  • Le mode CCM (compteur avec CBC-MAC) combine le mode de chiffrement de bloc CBC avec un code d’authentification de message (MAC).
  • Le mode GCM (mode compteur Galois) combine le mode de chiffrement du compteur avec le mode d’authentification Galois.

Certains modes tels que CBC nécessitent l’utilisation d’un vecteur d’initialisation (IV) pour le premier bloc de texte chiffré. Voici les vecteurs d’initialisation courants. Vous spécifiez l’IV lors de l’appel de CryptographicEngine.Encrypt. Dans la plupart des cas, il est important que le iv ne soit jamais réutilisé avec la même clé.

  • Correction utilise le même IV pour tous les messages à chiffrer. Cette fuite d’informations et son utilisation n’est pas recommandée.
  • Le compteur incrémente l’IV pour chaque bloc.
  • Random crée un pseudorandom IV. Vous pouvez utiliser CryptographicBuffer.GenerateRandom pour créer l’iv.
  • Non généré utilise un nombre unique pour chaque message à chiffrer. En règle générale, la nonce est un message modifié ou un identificateur de transaction. La nonce n’a pas besoin d’être conservée secrète, mais elle ne doit jamais être réutilisée sous la même clé.

La plupart des modes nécessitent que la longueur du texte en clair soit un multiple exact de la taille du bloc. Cela nécessite généralement que vous remplissez le texte en clair pour obtenir la longueur appropriée.

Bien que les chiffrements de bloc chiffrent des blocs de taille fixe de données, les chiffrements de flux sont des fonctions de chiffrement symétriques qui combinent des bits en texte brut avec un flux de bits pseudo-random (appelé flux de clés) pour générer le texte chiffré. Certains modes de chiffrement de bloc tels que le mode de retour de sortie (OTF) et le mode compteur (CTR) transforment efficacement un chiffrement de bloc en chiffrement de flux. Les chiffrements de flux réels tels que RC4, cependant, fonctionnent généralement à des vitesses plus élevées que les modes de chiffrement de bloc sont capables d’atteindre.

L’exemple suivant montre comment utiliser la classe SymmetricKeyAlgorithmProvider pour créer une clé symétrique et l’utiliser pour chiffrer et déchiffrer des données.

Clés asymétriques

Le chiffrement à clé asymétrique, également appelé chiffrement à clé publique, utilise une clé publique et une clé privée pour effectuer le chiffrement et le déchiffrement. Les clés sont différentes, mais mathématiquement liées. En règle générale, la clé privée est conservée secrète et est utilisée pour déchiffrer les données tandis que la clé publique est distribuée aux parties intéressées et est utilisée pour chiffrer les données. Le chiffrement asymétrique est également utile pour la signature de données.

Étant donné que le chiffrement asymétrique est beaucoup plus lent que le chiffrement symétrique, il est rarement utilisé pour chiffrer directement de grandes quantités de données. Au lieu de cela, il est généralement utilisé de la manière suivante pour chiffrer les clés.

  • Alice exige que Bob envoie ses messages chiffrés uniquement.
  • Alice crée une paire de clés privées/publiques, conserve son secret de clé privée et publie sa clé publique.
  • Bob a un message qu’il veut envoyer à Alice.
  • Bob crée une clé symétrique.
  • Bob utilise sa nouvelle clé symétrique pour chiffrer son message à Alice.
  • Bob utilise la clé publique d’Alice pour chiffrer sa clé symétrique.
  • Bob envoie le message chiffré et la clé symétrique chiffrée à Alice (enveloppe).
  • Alice utilise sa clé privée (de la paire privée/publique) pour déchiffrer la clé symétrique de Bob.
  • Alice utilise la clé symétrique de Bob pour déchiffrer le message.

Vous pouvez utiliser un objet AsymmetricKeyAlgorithmProvider pour spécifier un algorithme asymétrique ou un algorithme de signature, créer ou importer une paire de clés éphémère ou importer la partie clé publique d’une paire de clés.

Dérivation des clés

Il est souvent nécessaire de dériver des clés supplémentaires d’un secret partagé. Vous pouvez utiliser la classe KeyDerivationAlgorithmProvider et l’une des méthodes spécialisées suivantes dans la classe KeyDerivationParameters pour dériver des clés.

Object Description
BuildForPbkdf2 Crée un objet KeyDerivationParameters à utiliser dans la fonction de dérivation de clé basée sur mot de passe 2 (PBKDF2).
BuildForSP800108 Crée un objet KeyDerivationParameters à utiliser en mode compteur, fonction de dérivation de clé HMAC (Code d’authentification de message basé sur le hachage).
BuildForSP80056a Crée un objet KeyDerivationParameters à utiliser dans la fonction de dérivation de clé SP800-56A.