Partager via


Services de chiffrement

Les réseaux publics comme Internet ne fournissent pas de moyen de communication sécurisée entre des entités. Les communications sur ces réseaux sont susceptibles d'être lues voire modifiées par des tiers non autorisés. Le chiffrement permet d'empêcher la visualisation des données, de détecter si les données ont été modifiées et fournit un moyen de communication sécurisé sur des canaux autrement non 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.

Dans le .NET Framework, les classes dans l'espace de noms System.Security.Cryptography gèrent de nombreuses informations de chiffrement pour vous. Certaines sont des wrappers pour l'interface Microsoft Cryptography API (CryptoAPI) non managée, tandis que d'autres sont de pures implémentations managées. Il n'est pas nécessaire d'être un expert en chiffrement pour utiliser ces classes. Lorsque vous créez une nouvelle instance de l'une des classes d'algorithme de chiffrement, des clés sont générées automatiquement par souci de convivialité, et les propriétés par défaut sont aussi sécurisées que possible.

Cette présentation fournit un synopsis des méthodes et pratiques de chiffrement prises en charge par le .NET Framework, notamment la prise en charge des manifestes ClickOnce, de Suite B et de CNG (Cryptography Next Generation) introduites par le .NET Framework version 3.5.

Cette vue d'ensemble contient les sections suivantes :

  • Primitives de chiffrement

  • Chiffrement à clé secrète

  • Chiffrement à clé publique

  • Signatures numériques

  • Valeurs de hachage

  • Génération de numéros aléatoires

  • Manifestes ClickOnce

  • Prise en charge de Suite B

  • Classes CNG (Cryptography Next Generation)

  • Rubriques connexes

Pour plus d'informations sur le chiffrement et les services, composants et outils Microsoft qui vous permettent d'ajouter la sécurité du chiffrement à vos applications, consultez la section relative à la sécurité du développement Win32 et COM dans cette documentation.

Primitives de chiffrement

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 s'assurer que les informations proviennent bien de Bob et non pas d'une personne se faisant passer pour lui.

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 protéger les données et empêcher qu'elles ne soient modifiées.

  • Authentification : Pour s'assurer que les données proviennent bien d'un expéditeur particulier.

  • Non-répudiation : Pour empêcher un tiers donné de nier qu'il a envoyé un message.

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.

Primitive de chiffrement

Utilisation

Chiffrement à clé secrète (chiffrement symétrique)

Effectue une transformation des données afin d'empêcher leur lecture 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 afin d'empêcher leur lecture 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.

Retour au début

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 vos données ou chiffrer ses propres données et prétendre que vous en êtes l'expéditeur.

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 très 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. Les algorithmes de chiffrement asymétriques, tels que RSA, sont mathématiquement limités quant à la quantité des données qu'ils peuvent chiffrer. Les algorithmes de chiffrement symétrique n'induisent généralement pas ces problèmes.

Un type d'algorithme de clé secrète, appelé chiffrement de blocs, est utilisé pour chiffrer un bloc de données à la fois. Les chiffrements de blocs, comme DES (Data Encryption Standard), TripleDES et AES (Advanced Encryption Standard), transforment par chiffrement un bloc d'entrées de n octets en un bloc d'octets chiffrés de sortie. 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 (8 octets pour DES et TripleDES ; 16 octets [paramètre par défaut], 24 octets ou 32 octets pour AES), les valeurs de données supérieures à n doivent être chiffrées un bloc à la fois. Les valeurs de données inférieures à n doivent être étendues à n en vue de leur traitement.

Une forme simple de chiffrement de blocs est appelée « mode ECB (livre de codes électronique) ». Le mode ECB n'est pas considéré comme un mode sécurisé car il n'utilise pas un vecteur d'initialisation pour initialiser le premier bloc de texte brut. 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. Par conséquent, si votre flux de texte brut d'entrée comprend des blocs dupliqués, votre flux de texte de chiffrement de sortie contiendra également des blocs dupliqués. Ces blocs de sortie dupliqués signalent aux utilisateurs non autorisés les faibles algorithmes de chiffrement qui ont pu être utilisés et les modes d'attaque possibles. Le mode de chiffrement ECB est par conséquent assez vulnérable à l'analyse et, finalement, à la découverte de clé.

Les classes de chiffrement de blocs fournies dans la bibliothèque de classes de base utilisent un mode de chaînage par défaut, appelé « chiffrement de blocs (CBC, Cipher Block Chaining) ». Vous pouvez cependant modifier ce mode par défaut.

Le chiffrement CBC surmonte les problèmes associés au chiffrement ECB grâce à l'utilisation d'un vecteur d'initialisation (IV) pour le chiffrement du premier bloc de texte brut. Chaque bloc de texte brut suivant subit une opération OR exclusive au niveau du bit (XOR) avec le bloc de texte de chiffrement avant d'être chiffré. Chaque bloc de texte de chiffrement dépend par conséquent de tous les blocs précédents. Lorsque ce système est utilisé, 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 permettant de compromettre des données chiffrées avec un chiffrement CBC consiste à 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. 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. Le vecteur d'initialisation n'est pas considéré secret et peut être transmis en texte brut avec le message. Toutefois, 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 qu'Alice et Bob souhaitent communiquer sur un canal non sécurisé, ils peuvent utiliser le chiffrement à clé secrète de la manière suivante : ils conviennent tous les deux d'utiliser un algorithme donné (AES, par exemple) avec une clé et un vecteur d'initialisation spécifiques. Alice compose un message et crée un flux de réseau (par exemple, un canal nommé ou une messagerie électronique de réseau) sur lequel envoyer le message. Elle chiffre ensuite le texte à l'aide de la clé et du vecteur d'initialisation et envoie le message chiffré et le vecteur à Bob sur l'intranet. Bob reçoit le texte chiffré et le déchiffre à l'aide du vecteur d'initialisation et de la clé dont ils ont précédemment convenu. 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é. Dans ce scénario, seule la clé doit rester secrète. 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 concernant le chiffrement à clé publique, consultez la section suivante.

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

Retour au début

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 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. Une règle de chiffrement de base interdit la réutilisation d'une clé et les deux clés doivent être uniques pour chaque session de communication. Toutefois, dans la pratique, les clés asymétriques ont généralement une longue durée de vie.

Deux parties (Alice et Bob) peuvent utiliser le chiffrement à clé publique de la manière suivante : dans un premier temps, Alice génère 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 sur un réseau non sécurisé et Bob utilise cette clé pour chiffrer un message. Bob envoie le message chiffré à Alice et elle le déchiffre à l'aide de sa clé privée. Si Bob a reçu la clé d'Alice sur un canal non sécurisé, comme un réseau public, il est alors exposé à des attaques de type « man-in-the-middle ». Par conséquent, il doit vérifier auprès d'Alice qu'il a la copie correcte de sa clé publique.

Pendant sa transmission, un agent non autorisé peut intercepter la clé publique d'Alice,. 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 d'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 ce scénario, 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.

La liste suivante compare les algorithmes de chiffrement à clé publique et à clé secrète :

  • 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.

  • Le chiffrement à clé publique dispose d'un espace de clé (plage des valeurs possibles pour la clé) beaucoup plus grand que le chiffrement à clé secrète. Il est par conséquent moins exposé aux attaques exhaustives qui essaient toutes les clés possibles.

  • Les clés publiques peuvent être facilement distribuées car elles ne doivent pas être sécurisées, à condition qu'il soit possible de vérifier l'identité de l'expéditeur.

  • Certains algorithmes de clé publique (par exemple, RSA et DSA, mais pas Diffie-Hellman) peuvent être utilisés pour créer des signatures numériques afin de vérifier l'identité de l'expéditeur des données.

  • Les algorithmes à clé publique sont beaucoup plus lents que les algorithmes à 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é 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 utilisé pour le reste de la session.

.NET Framework fournit les classes suivantes qui implémentent des algorithmes de chiffrement à clé publique :

RSA permet aussi bien le chiffrement que la signature. En revanche, DSA ne peut être utilisé que pour la signature et Diffie-Hellman que pour la génération de clé. En règle générale, les algorithmes de clé publique ont des usages plus limités que les algorithmes de clé privée.

Retour au début

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 alors que le message provient d'Alice.

RemarqueRemarque

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é.

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

Retour au début

Valeurs de hachage

Les algorithmes de hachage associent des valeurs binaires de longueur arbitraire à des valeurs binaires de longueur fixe de plus petite taille, connues sous le nom de valeurs de hachage. Une valeur de hachage est une représentation numérique 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, le hachage suivant produira une valeur différente. Si le hachage est robuste du point de vue du chiffrement, sa valeur changera de façon substantielle. Par exemple, si un seul bit d'un message est modifié, une puissante fonction de hachage pourrait produire une sortie différente de 50 %. De nombreuses valeurs d'entrée peuvent être hachées et produire la même valeur de sortie. Toutefois, il est impossible d'obtenir par le calcul la même valeur de hachage pour deux entrées distinctes.

Deux correspondants (Alice et Bob) peuvent utiliser une fonction de hachage pour garantir l'intégrité des messages. Ils doivent alors sélectionner un algorithme de hachage pour signer leurs messages. Alice doit écrire un message, puis créer un hachage de ce message à l'aide de l'algorithme sélectionné. Ils doivent ensuite appliquer l'une des méthodes suivantes :

  • Alice envoie le message texte en clair et le message haché (signature numérique) à Bob. Bob reçoit et hache le message, puis compare sa valeur de hachage à celle qu'il a reçue d'Alice. Si les valeurs de hachage sont identiques, cela signifie que le message n'a pas été modifié. Si les valeurs ne sont pas identiques, cela signifie que le message a été modifié après qu'Alice l'a rédigé.

    Malheureusement, cette méthode n'établit pas l'authenticité de l'expéditeur. N'importe qui peut emprunter l'identité d'Alice et envoyer un message à Bob. Ils peuvent utiliser le même algorithme de hachage pour signer leur message et Bob peut uniquement s'assurer que le message correspond à sa signature. C'est une forme d'attaque de l'intercepteur. Consultez Communication sécurisée Cryptography Next Generation (CNG), exemple pour plus d'informations.

  • Alice envoie le message texte en clair à Bob sur un canal public non sécurisé. Elle envoie le message haché à Bob sur un canal privé sécurisé. Bob reçoit le message texte en clair et le hache, puis compare le hachage à celui échangé en privé. Si les hachages correspondent, Bob sait deux choses :

    • Le message n'a pas été modifié.

    • L'expéditeur du message (Alice) est authentique.

    Pour que ce système fonctionne, Alice doit cacher la valeur de hachage d'origine à tous les tiers excepté Bob.

  • Alice envoie le message texte en clair à Bob sur un canal public non sécurisé et place le message haché sur son site Web public.

    Cette méthode évite la falsification du message car elle empêche la modification de la valeur de hachage. Bien que le message et son hachage puissent être consultés par n'importe qui, la valeur de hachage peut être modifiée uniquement par Alice. Un intrus qui souhaite emprunter l'identité d'Alice doit avoir accès au site Web d'Alice.

Aucune des méthodes précédentes ne peut empêcher quelqu'un de lire les messages d'Alice car ils sont transmis en texte en clair. Une sécurité totale demande généralement l'utilisation de signatures numériques (signature de message) et du chiffrement.

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

RemarqueRemarque

Des défauts ayant été observés dans la conception de l'algorithme MD5 en 1996, SHA-1 a été recommandé à sa place.En 2004, d'autres défauts ont été découverts. De ce fait, l'algorithme MD5 n'est plus considéré sécurisé.Il a également été observé que l'algorithme SHA-1 n'est pas sécurisé. De ce fait, SHA-2 a été recommandé à la place.

Retour au début

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 nombres aléatoires de chiffrement doivent générer une sortie impossible à prévoir par calcul avec une probabilité supérieure à un demi. Les méthodes permettant de prévoir le bit de sortie suivant ne doivent pas être plus performantes que l'estimation aléatoire. Les classes dans .NET Framework utilisent des générateurs de nombre aléatoire pour générer des clés de chiffrement.

La classe RNGCryptoServiceProvider correspond à l'implémentation d'un algorithme de générateur de nombres aléatoires.

Retour au début

Manifestes ClickOnce

Dans .NET Framework 3.5, les classes de chiffrement suivantes vous permettent d'obtenir et de vérifier les informations relatives aux signatures de manifeste des applications déployées à l'aide de la technologie ClickOnce :

De plus, les classes suivantes fournissent des informations de signature spécifiques :

Retour au début

Prise en charge de Suite B

Le .NET Framework 3.5 prend en charge le jeu d'algorithmes de chiffrement Suite B publié par la NSA (National Security Agency). Pour plus d'informations sur Suite B, consultez NSA Suite B Cryptography Fact Sheet.

Les algorithmes suivants sont inclus :

  • AES (Advanced Encryption Standard) avec des tailles de clé de 128, 192 et 256 bits pour le chiffrement.

  • SHA-1, SHA-256, SHA-384 et SHA-512 pour le hachage. (Les trois derniers algorithmes sont généralement regroupés et désignés par SHA-2.)

  • ECDSA (Elliptic Curve Digital Signature Algorithm), utilisant les courbes des premiers modules 256, 384 et 521 bits pour la signature. La documentation NSA définit en particulier ces courbes, qu'elle appelle P-256, P-384 et P-521. Cet algorithme est fourni par la classe ECDsaCng. Il vous permet de signer avec une clé privée et de vérifier la signature avec une clé publique.

  • ECDH (Elliptic Curve Diffie-Hellman), utilisant les courbes des premiers modules 256, 384 et 521 bits pour l'échange de clé et l'accord secret. Cet algorithme est fourni par la classe ECDiffieHellmanCng.

Les wrappers de code managé pour les implémentations certifiées FIPS (Federal Information Processing Standard) des implémentations AES, SHA-256, SHA-384 et SHA-512 sont disponibles dans les nouvelles classes AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider et SHA512CryptoServiceProvider.

Retour au début

Classes CNG (Cryptography Next Generation)

Les classes CNG (Cryptography Next Generation) fournissent un wrapper managé autour des fonctions CNG. (CNG remplace CryptoAPI.) Ces classes comportent « Cng » dans leurs noms. La classe du conteneur de clé CngKey est le point central des classes wrapper CNG ; elle isole le stockage et l'utilisation des clés CNG. Cette classe vous permet de stocker une paire de clés ou une clé publique en toute sécurité et d'y faire référence avec un simple nom de chaîne. La classe de signature ECDsaCng basée sur des courbes elliptiques et la classe de chiffrement ECDiffieHellmanCng peuvent utiliser des objets CngKey.

La classe CngKey est utilisée pour diverses opérations supplémentaires, notamment l'ouverture, la création, la suppression et l'exportation de clés. Elle fournit également un accès au handle de clé sous-jacent à utiliser pour appeler des fonctions natives directement.

.NET Framework 3.5 comprend également diverses classes CNG de prise en charge, comme :

Retour au début

Rubriques connexes

Titre

Description

Modèle de chiffrement de .NET Framework

Décrit la manière dont le chiffrement est implémenté dans la bibliothèque de classes de base.

Tâches de chiffrement

Décrit comment effectuer des tâches de chiffrement spécifiques à l'aide de la bibliothèque de classes de base.

Procédure pas à pas : création d'une application de chiffrement

Décrit les tâches de base de chiffrement et de déchiffrement.

Configuration de classes de chiffrement

Décrit la manière d'associer des noms d'algorithme à des classes de chiffrement et comment associer des identificateurs d'objets à un algorithme de chiffrement.

Retour au début