Le chiffrement vous permet de protéger des données en empêchant que celles-ci ne soient lues ou modifiées et fournit un moyen de communication sécurisé sur des canaux qui ne sont pas autrement sécurisés. Par exemple, des données peuvent être chiffrées à l'aide d'un algorithme de chiffrement, transmises sous une forme chiffrée, puis déchiffrées par le destinataire auquel elles sont adressées. Si un tiers intercepte les données chiffrées, il lui sera difficile de les déchiffrer.
En général, lorsqu'on utilise le chiffrement, deux parties (Alice et Bob) communiquent sur un canal non sécurisé. Alice et Bob veulent s'assurer que leur communication reste incompréhensible pour toute personne qui pourrait écouter. De plus, comme Alice et Bob se trouvent dans des endroits distants, Alice doit être certaine que les informations qu'elle reçoit de Bob n'ont pas été modifiées par quiconque lors de la transmission. En outre, elle doit être certaine que les informations proviennent bien de Bob et non pas d'une personne se faisant passer pour Bob.
Le chiffrement est utilisé pour atteindre les objectifs suivants :
-
Confidentialité : Pour permettre de protéger l'identité d'un utilisateur ou empêcher la lecture de données.
-
Intégrité des données : Pour permettre de protéger des données et empêcher qu'elles ne soient modifiées.
-
Authentification : Pour s'assurer que des données proviennent bien d'un expéditeur particulier.
Pour atteindre ces objectifs, vous pouvez utiliser une combinaison d'algorithmes et de pratiques connues sous le nom de primitives de chiffrement pour créer un modèle de chiffrement. Le tableau suivant répertorie les primitives de chiffrement et leur utilisation.
| Primitives de chiffrement | Utiliser |
|---|---|
| Chiffrement à clé secrète (chiffrement symétrique) | Effectue une transformation des données, empêchant que celles-ci ne soient lues par des tiers. Ce type de chiffrement utilise une clé secrète, de partage unique pour chiffrer et déchiffrer des données. |
| Chiffrement à clé privée (chiffrement asymétrique) | Effectue une transformation des données, empêchant que celles-ci ne soient lues par des tiers. Ce type de chiffrement utilise une paire de clés publique/privée à partage unique pour chiffrer et déchiffrer des données. |
| Signature de chiffrement | Permet de vérifier que les données proviennent d'une partie spécifique en créant une signature numérique propre à cette partie. Ce processus utilise également des fonctions de hachage. |
| Hachages de chiffrement | Associe des données de n'importe quelle longueur à une séquence d'octets de longueur fixe. Les hachages sont statistiquement uniques ; une séquence de deux octets différente n'a pas la même valeur de hachage. |
Chiffrement à clé secrète
Les algorithmes de chiffrement à clé secrète utilisent une clé secrète unique pour chiffrer et déchiffrer des données. Vous devez protéger la clé contre tout accès par des agents non autorisés, car toute partie qui possède la clé peut s'en servir pour déchiffrer les données. Le chiffrement à clé secrète est également appelé chiffrement symétrique, car la même clé est utilisée pour le chiffrement et le déchiffrement. Les algorithmes de chiffrement à clé secrète sont extrêmement rapides (en comparaison avec les algorithmes de clé publique) et sont bien adaptés pour effectuer des transformations de chiffrement sur des larges flux de données.
Généralement, les algorithmes de clé secrète, appelés chiffrements de blocs, sont utilisés pour chiffrer un bloc de données à la fois. Les chiffrements de blocs (comme RC2, DES, TripleDES, et Rijndael) transforment par chiffrement un bloc d'entrée de n octets en un bloc de sortie d'octets chiffrés. Si vous voulez chiffrer ou déchiffrer une séquence d'octets, vous devez le faire bloc par bloc. Comme n est de petite taille (n = 8 octets pour RC2, DES, et TripleDES; n = 16 [paramètre par défaut]; n = 24 ou n = 32 octets pour Rijndael), les valeurs supérieures à n doivent être chiffrées un bloc à la fois.
Les classes de chiffrement de blocs fournies dans la bibliothèque de classes de base utilisent un chaînage de chiffrement de blocs (CBC, Cipher Block Chaining) qui utilise une clé et un vecteur d'initialisation (IV, Initialization Vector) pour effectuer des transformations de chiffrement sur les données. Pour une clé secrète k donnée, un simple chiffrement de blocs qui n'utilise pas un vecteur d'initialisation chiffre le même bloc d'entrée de texte brut en bloc de sortie similaire de texte de chiffrement. Si vous avez des blocs dupliqués au sein de votre flux de texte brut, vous aurez des blocs dupliqués au sein de votre flux de texte de chiffrement. Si des utilisateurs non autorisés possèdent des informations sur la structure d'un bloc de votre texte brut, ils peuvent utiliser ces informations pour déchiffrer le bloc de texte de chiffrement connu et éventuellement extraire votre clé. Pour faire face à ce problème, les informations du bloc précédent sont mélangées dans le processus de chiffrement du bloc suivant. Ainsi, le résultat de deux blocs de texte brut identiques est différent. Comme cette technique utilise le bloc précédent pour chiffrer le bloc suivant, un IV (Initialization Vector) est utilisé pour chiffrer le premier bloc de données. Grâce à ce système, les en-têtes de messages courants dont un utilisateur non autorisé aurait connaissance ne peuvent pas être utilisés pour effectuer une ingénierie à rebours d'une clé.
L'une des méthodes pour compromettre des données chiffrées avec ce type de chiffrement est d'effectuer une recherche exhaustive de chaque clé possible. En fonction de la taille de la clé utilisée pour effectuer le chiffrement, ce type de recherche prend beaucoup de temps même en utilisant les ordinateurs les plus rapides. Par conséquent, elle n'est pas praticable. Les tailles de clés plus grandes sont plus difficiles à déchiffrer. Bien que le chiffrement n'empêche pas en théorie un adversaire de récupérer les données chiffrées, il augmente le coût d'une telle pratique de manière significative. S'il faut trois mois pour effectuer une recherche exhaustive pour récupérer des données qui ne sont valables que quelques jours, la méthode de recherche exhaustive s'avère irréalisable.
Le désavantage du chiffrement à clé secrète est qu'il présume que deux parties ont convenu d'une clé et d'un vecteur d'initialisation dont ils ont communiqué les valeurs. La clé doit également rester à l'abri des utilisateurs non autorisés En raison de ces problèmes, le chiffrement à clé secrète est souvent associé au chiffrement à clé publique pour communiquer de manière confidentielle les valeurs de la clé et du vecteur d'initialisation.
En supposant que Alice et Bob sont deux parties qui souhaitent communiquer sur un canal non sécurisé, ils peuvent utiliser le chiffrement à clé secrète de la façon suivante. Alice et Bob conviennent tous les deux d'utiliser un algorithme particulier (Rijndael par exemple) avec une clé et un vecteur d'initialisation particuliers. Alice rédige un message et crée un flux de réseau sur lequel envoyer le message. Puis elle chiffre le texte à l'aide de la clé et du vecteur d'initialisation, et l'envoie sur Internet. Elle n'envoie pas la clé et le vecteur d'initialisation à Bob. Bob reçoit le texte chiffré et le déchiffre à l'aide de la clé et du vecteur d'initialisation dont il a été convenu précédemment. Si la transmission est interceptée, l'intercepteur ne peut pas récupérer le message d'origine, car il ne connaît pas la clé ou le vecteur d'initialisation. Dans ce scénario, la clé doit rester confidentielle, mais il n'est pas nécessaire que le vecteur d'initialisation le doive. Dans la pratique, Alice ou Bob génère une clé secrète et utilise un chiffrement à clé publique (asymétrique) pour transférer la clé secrète (symétrique) à l'autre partie. Pour plus d'informations, consultez la section relative au chiffrement à clé publique, plus loin dans cette rubrique.
Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de chiffrement à clé secrète :
Chiffrement à clé publique
Le chiffrement à clé publique utilise une clé privée qui doit rester à l'abri des utilisateurs non autorisés et une clé publique qui peut être rendue publique à n'importe qui. La clé privée et la clé publique sont liées mathématiquement ; les données chiffrées à l'aide de la clé publique ne peuvent être déchiffrées qu'à l'aide de la clé privée et les données signées à l'aide de la clé privée ne peuvent être vérifiées qu'à l'aide de la clé publique. La clé publique peut être mise à la disposition de n'importe qui ; elle est utilisée pour le chiffrement des données à envoyer au détenteur de la clé privée. Les deux clés sont spécifiques à la session de communication. Les algorithmes de chiffrement à clé publique sont également connus sous le nom d'algorithmes asymétriques, car une clé est nécessaire pour chiffrer des données tandis qu'une autre clé est nécessaire pour les déchiffrer.
Les algorithmes de chiffrement à clé publique utilisent une taille de mémoire tampon fixe tandis que les algorithmes de chiffrement à clé secrète utilisent une mémoire tampon de longueur variable. Les algorithmes de clé publique ne peuvent pas être utilisés pour enchaîner des données entre elles sous la forme de flux à la manière des algorithmes de clé secrète car seules des petites quantités de données peuvent être chiffrées. Par conséquent, les opérations asymétriques n'utilisent pas le même modèle de diffusion en contenu que les opérations symétriques.
Deux parties (Alice et Bob) peuvent utiliser le chiffrement à clé publique de la manière suivante. Alice génère d'abord une paire de clés publique/privée. Si Bob veut envoyer un message chiffré à Alice, il lui demande sa clé publique. Alice envoie sa clé publique à Bob via un réseau non sécurisé et Bob utilise cette clé pour chiffrer un message. (Si Bob reçoit la clé de Alice via un canal non sécurisé, comme un réseau public, Bob doit vérifier auprès d'Alice qu'il possède une copie correcte de sa clé publique.) Bob envoie le message chiffré à Alice et elle le déchiffre à l'aide de sa clé privée.
Cependant, durant la transmission de la clé publique d'Alice, un agent non autorisé peut intercepter la clé. En outre, ce même agent pourrait intercepter le message chiffré de Bob. Toutefois, l'agent ne peut pas déchiffrer le message à l'aide de la clé publique. Le message ne peut être déchiffré qu'à l'aide de la clé privée de Alice qui n'a pas été transmise. Alice n'utilise pas sa clé privée pour chiffrer un message de réponse à Bob car toute personne en possession de la clé publique pourrait déchiffrer le message. Si Alice veut renvoyer un message à Bob, elle demande sa clé publique à Bob et chiffre son message à l'aide de cette clé publique. Bob déchiffre ensuite le message à l'aide de sa clé privée associée.
Dans la pratique, Alice et Bob utilisent un chiffrement à clé publique (asymétrique) pour transférer une clé secrète (symétrique) et utilisent un chiffrement à clé secrète pour le reste de leur session.
Le chiffrement à clé publique possède un espace de clé beaucoup plus important (éventail de valeurs possibles pour la clé). Il est par conséquent moins susceptible de subir des attaques exhaustives qui essaient toutes les clés possibles. Une clé publique est facile à distribuer, car il n'est pas nécessaire qu'elle soit sécurisée. Les algorithmes de clé publique peuvent être utilisés pour créer des signatures numériques afin de vérifier l'identité de l'expéditeur des données. Toutefois, les algorithmes de clé publique sont extrêmement lents (en comparaison avec les algorithmes de clé secrète) et ne sont pas conçus pour chiffrer de grandes quantités de données. Les algorithmes de clé publique sont utiles uniquement pour transférer des petites quantités de données. Généralement, le chiffrement à clé publique est utilisée pour chiffrer une clé ou un vecteur d'initialisation pour une utilisation par un algorithme de clé secrète. Après le transfert de la clé et du vecteur d'initialisation, le chiffrement à clé secrète est ensuite utilisé pour le reste de la session.
Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de chiffrement à clé publique :
Signatures numériques
Les algorithmes de clé publique peuvent également être utilisés pour former des signatures numériques. Les signatures numériques authentifient l'identité d'un expéditeur (si vous faites confiance à la clé publique de l'expéditeur) et permettent de protéger l'intégrité des données. À l'aide d'une clé publique générée par Alice, le destinataire des données d'Alice peut vérifier que Alice a envoyé les données en comparant la signature numérique aux données d'Alice et à la clé publique d'Alice.
Pour utiliser le chiffrement à clé publique pour signer numériquement un message, Alice applique d'abord un algorithme de hachage au message pour créer un résumé du message. Le résumé du message est une représentation compacte et unique de ses données. Alice chiffre ensuite le résumé du message à l'aide de sa clé privée pour créer sa signature personnelle. À la réception du message et de la signature, Bob déchiffre la signature à l'aide de la clé publique d'Alice pour récupérer le résumé du message et effectue un hachage du message à l'aide du même algorithme de hachage utilisé par Alice. Si le résumé du message traité par Bob correspond exactement au résumé du message reçu d'Alice, Bob est certain que le message provient du détenteur de la clé privée et que les données n'ont pas été modifiées. Si Bob fait confiance au fait qu'Alice est la détentrice de la clé privée, il sait dans ce cas que le message provient d'Alice.
Remarquez qu'une signature peut être vérifiée par n'importe qui, car la clé publique de l'expéditeur est connue de tous et est généralement incluse dans le format de la signature numérique. Cette méthode ne conserve pas la confidentialité du message ; pour que celui-ci soit confidentiel, il doit être également chiffré.
Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de signature numérique :
Valeurs de hachage
Les algorithmes de hachage associent des valeurs binaires de longueur arbitraire à des petites valeurs binaires de longueur fixe connues sous le nom de valeurs de hachage. Une valeur de hachage est une unique représentation numérique extrêmement compacte d'une donnée. Si vous effectuez le hachage d'un paragraphe de texte brut et changez ne serait ce qu'une lettre du paragraphe, un hachage suivant produira une valeur différente. Il est improbable d'obtenir par le calcul la même valeur de hachage pour deux entrées distinctes.
Les fonctions de hachage MAC (Message Authentification Code) sont couramment utilisées avec des signatures numériques pour signer des données, tandis que les fonctions de hachage MDC (Message Detection Code) sont utilisées pour l'intégrité des données.
Deux parties (Alice et Bob) peuvent utiliser une fonction de hachage de la façon suivante pour garantir l'intégrité des données. Si Alice écrit un message à Bob et crée un hachage de ce message, Bob peut ensuite effectuer un hachage du message ultérieurement et comparer son hachage au hachage d'origine. Si les valeurs de hachage sont identiques, cela signifie que le message n'a pas été modifié ; cependant, si les valeurs ne sont pas identiques, le message a été modifié après qu'Alice l'eut rédigé. Pour que ce système fonctionne, Alice doit cacher la valeur de hachage d'origine à toutes les parties sauf Bob.
Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de signature numérique :
Génération de numéros aléatoires
La génération de numéro aléatoire fait partie intégrante d'un grand nombre d'opérations de chiffrement. Par exemple, les clés de chiffrement doivent être aussi aléatoires que possible afin qu'elles ne puissent pas être reproduites. Les générateurs de nombre aléatoire de chiffrement doivent générer des sorties qui soient impossibles à prédire par le calcul avec une probabilité supérieure à p < .05 ; c'est-à-dire que toute méthode de prédiction du bit de sortie suivant ne doit pas obtenir de résultats supérieurs à une prédiction aléatoire. Les classes dans le .NET Framework utilisent des générateurs de nombre aléatoire pour générer des clés de chiffrement.
La classe RNGCryptoServiceProvider est une implémentation d'un algorithme générateur de nombre aléatoire.
Voir aussi
Concepts
Modèle de chiffrement de .NET FrameworkAutres ressources
Tâches de chiffrementServices de chiffrement
Outils (masquer)
S'enregistrer
Liste des Membres
Qui est en ligne?
FAQ