Vue d'ensemble de la cryptographie

La cryptographie 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 cryptées à l'aide d'un algorithme cryptographique, transmises sous une forme cryptée, puis ensuite décryptées par le destinataire auquel elles sont adressées. Si un tiers intercepte les données cryptées, il lui sera difficile de les déchiffrer.

En général, lorsqu'on utilise la cryptographie, deux parties (Alice et Bob) communiquent sur un canal non sécurisé. Alice et Bob veulent s'assurer que leur communication restent 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.

La cryptographie est utilisée 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 cryptographiques pour créer un modèle cryptographique. Le tableau suivant répertorie les primitives cryptographiques et leur utilisation.

Primitives cryptographiques Utilisation
Cryptage de clé secrète (cryptographie symétrique) Effectue une transformation des données, empêchant que celles-ci ne soient lues par des tiers. Ce type de cryptage utilise une clé secrète, de partage unique pour crypter et décrypter des données.
Cryptage de clé privée (cryptographie asymétrique) Effectue une transformation des données, empêchant que celles-ci ne soient lues par des tiers. Ce type de cryptage utilise une paire de clés publique/privée à partage unique pour crypter et décrypter des données.
Signature cryptographique 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 cryptographiques 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.

Cryptage de clé secrète

Les algorithmes de cryptage de clé secrète utilisent une clé secrète unique pour crypter et décrypter 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écrypter les données. Le cryptage de clé secrète est également appelé cryptage symétrique car la même clé est utilisée pour le cryptage et le décryptage. Les algorithmes de cryptage de clé secrète sont extrêmement rapides (en comparaison avec les algorithmes de clé publique) et sont bien adaptés pour effectuer des transformations cryptographiques 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 crypter un bloc de données à la fois. Les chiffrements de blocs (comme RC2, DES, TripleDES, et Rijndael) transforment de manière cryptographique un bloc d'entrée de n octets en un bloc de sortie d'octets cryptés. Si vous voulez crypter ou décrypter 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 crypté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 cryptographiques 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 crypte 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 cryptage 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 crypter le bloc suivant, un IV (Initialization Vector) est utilisé pour crypter 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 crypté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 cryptage, 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 cryptage n'empêche pas en théorie un adversaire de récupérer les données crypté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 cryptage de 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 cryptage de clé secrète est souvent associé au cryptage de 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 cryptage de 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 crypte 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 crypté et le décrypte à 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 cryptage de 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 cryptage de clé publique, plus loin dans cette rubrique.

Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de cryptage de clé secrète :

Cryptage de clé publique

Le cryptage de 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 cryptées à l'aide de la clé publique ne peuvent être décrypté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ée 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 cryptage 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 cryptographiques de clé publique sont également connus sous le nom d'algorithmes asymétriques car une clé est nécessaire pour crypter des données tandis qu'une autre clé est nécessaire pour les décrypter.

Les algorithmes cryptographiques de clé publique utilisent une taille de mémoire tampon fixe tandis que les algorithmes cryptographiques de 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 crypté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 cryptage de 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 crypté à 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 crypter 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 crypté à Alice et elle le décrypte à 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 crypté de Bob. Toutefois, l'agent ne peut pas décrypter le message à l'aide de la clé publique. Le message ne peut être décrypté 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 crypter un message de réponse à Bob car toute personne en possession de la clé publique pourrait décrypter le message. Si Alice veut renvoyer un message à Bob, elle demande sa clé publique à Bob et crypte son message à l'aide de cette clé publique. Bob décrypte ensuite le message à l'aide de sa clé privée associée.

Dans la pratique, Alice et Bob utilisent un cryptage de clé publique (asymétrique) pour transférer une clé secrète (symétrique) et utilisent un cryptage de clé secrète pour le reste de leur session.

Le cryptage de 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 crypter 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 cryptage de clé publique est utilisée pour crypter 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 cryptage de 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 cryptage de 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 permet 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 la cryptographie de 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 crypte 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écrypte 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 crypté.

Le .NET Framework fournit les classes suivantes qui implémentent des algorithmes de signature numérique :

Valeurs de hachage

Les algorithmes de hachage associe 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'ait 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 cryptographiques. Par exemple, les clés cryptographiques doivent être aussi aléatoires que possible afin qu'elles ne puissent pas être reproduites. Les générateurs de nombre aléatoire cryptographique 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 cryptographiques.

La classe RNGCryptoServiceProvider est une implémentation d'un algorithme générateur de nombre aléatoire.

Voir aussi

Modèle cryptographique de .NET Framework | Tâches cryptographiques Services cryptographiques