Partager via


Vue d'ensemble du code source (Exemple CNG)

Cette vue d'ensemble fournit une description détaillée des interactions entre les différents éléments de code dans l'exemple de communication sécurisée CNG (Cryptography Next Generation).

Il décrit les aspects suivants de l'exemple :

  • Applications

  • Files

  • Classes

  • Versions de sécurité

  • Vue d'ensemble de la session

  • Clés de chiffrement (versions 2 à 5)

  • Échange de signatures numériques sur un canal public (version 3)

  • Échange de signatures numériques sur un canal privé (version 4)

  • Arrêt de session (version 5)

  • Remarques supplémentaires

  • Limitations de l'exemple CNG

Applications

L'exemple se compose de trois applications console séparées, Alice, Bob et Mallory.Chaque application est créée en tant que projet Visual Studio distinct et se compose d'un fichier principal et de trois fichiers partagés.Le tableau suivant présente les applications et leurs fichiers.

Nom de l'application (projet)

Fichiers

Alice

  • Alice.cs (fichier principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Bob

  • Bob.cs (fichier principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Mallory

  • Mallory.cs (fichier principal)

  • Utilities.cs

  • ChannelManager.cs

  • Communicator.cs

Fichiers

Les tableaux des sections suivantes répertorient les classes et les méthodes utilisées par chaque application, selon leur ordre d'apparition dans le code source.

Alice.cs, Bob.cs et Mallory.cs

Nom de la classe, de la méthode ou

de la variable globale

Utilisation

CNG_SecureCommunicationExample

Classe partielle du projet.

MyColor

OtherColor

fDisplaySendMessage

Variables globales.

Main

Point d'entrée du programme pour chaque application.Cette méthode gère les opérations suivantes :

  • Lors d'un appel d'Alice, charge automatiquement Bob.exe et Mallory.exe.

  • Crée une boucle de traitement.

  • Appelle la méthode InitConsole pour définir la taille de console, la position et le titre.

  • Appelle la méthode Run.

Run

Méthode qui appelle la méthode InitializeOptions et crée le scénario de sécurité sélectionné.

Utilities.cs

Nom de la classe, de la méthode ou

de la variable globale

Utilisation

CNG_SecureCommunicationExample

Classe partielle du projet.

Version

fVerbose

fMallory

Variables globales.

Autoloader

Méthode appelée par Alice pour charger les applications Bob.exe et Mallory.exe.

InitConsole

Méthode qui gère le menu d'interface utilisateur et les messages de niveau application.

SplashScreen

Méthode qui fournit des titres de fenêtres de console.

ReadALine

Méthode utilitaire qui lit une ligne entrée par l'utilisateur dans la console.

ReadAChar

Méthode utilitaire qui affiche une question et invite l'utilisateur à répondre par oui ou non.

InitializeOptions

Méthode qui affiche des options et invite l'utilisateur à effectuer une sélection.Cette méthode définit également les indicateurs globaux Version, fVerbose et fMallory.

Display(string s)

La première des deux méthodes Display.Cette méthode passe la chaîne et la variable MyColor à la seconde méthode Display.

Display(string DisplayString, int color)

La seconde des deux méthodes Display.Cette méthode encapsule des instructions Console.WriteLine et offre la prise en charge des couleurs pour les lignes de sortie.

Pour plus d'informations sur ces classes, méthodes et variables, consultez Analyse du code des classes d'utilitaires (Exemple CNG).

ChannelManager.cs

Nom de la classe, de la méthode ou

de la variable globale

Use

CNG_SecureCommunicationExample

Classe partielle du projet.

AppControl

Méthode qui fournit un contrôle d'application interne et synchronise les trois applications console.

Alice utilise cette méthode pour envoyer les options de programme (indicateurs Version et fVerbose) à Bob et Mallory.

AppControl n'est pas une méthode de messagerie.Son contenu n'est ni chiffré ni signé.Il n'appelle pas la classe Communicator.

SendChannelName

ReceiveChannelName

Méthodes utilisées pour basculer du canal nommé PublicChannel aux canaux nommés AliceAndBobChannel et AliceAndBobChannel1.Ces méthodes permettent la violation de la sécurité délibérée décrite dans la section Vue d'ensemble de l'exemple CNG.

ChannelManager

Classe qui fournit l'infrastructure de communication entre processus pour l'application.

Pour plus d'informations sur ces classes et méthodes, consultez Analyse du code de la classe ChannelManager (Exemple CNG).

Communicator.cs

Nom de la classe, de la méthode ou

de la variable globale

Use

CNG_SecureCommunicationExample

Classe partielle du projet.

Communicator

Classe qui encapsule toutes les fonctions de chiffrement.Cette classe traite tous les messages entre Alice, Bob et Mallory.Elle ne traite pas les messages envoyés par la méthode ChannelManagerAppControl.

m_DSKey

m_ECDH_Cng

m_ECDH_local_publicKey_XML

m_ECDH_remote_publicKey

ChMgr

Variables de classe.

Communicator

Méthode qui crée un objet Communicator.

Dispose

Méthode qui libère des ressources privées.

StoreDSKey

Méthode qui stocke une clé de signature numérique.

Send_or_Receive_PublicCryptoKey

Méthode qui fournit la prise en charge de l'échange de clés.

iv

ciphertext

signature

Variables de classe privée utilisées pour chiffrer des messages texte en clair.Ces variables sont déclarées près de la méthode ReceiveMessage().

ReceiveMessage

Méthode qui reçoit des messages texte en clair ou des messages chiffrés, selon la version de sécurité.

SendMessage

Méthode qui accepte un message texte en clair et l'envoie au format texte en clair ou au format chiffré selon la version de sécurité.

Pour plus d'informations sur ces classes, méthodes et variables, consultez Analyse du code de la classe Communicator (Exemple CNG).

Classes

Chaque projet comporte trois classes :

  • public partial class CNG_SecureCommunicationExample

    Cette classe s'étend aux quatre fichiers projet inclus dans les applications Alice, Bob et Mallory.Après la compilation, la classe CNG_SecureCommunicationExample contient toutes les classes, variables et méthodes pour les quatre fichiers projet.Pour plus d'informations sur les classes partielles, consultez Classes et méthodes partielles (Guide de programmation C#).

  • internal sealed class ChannelManager

    Cette classe fournit la prise en charge des canaux nommés.Chaque projet crée plusieurs instances ChannelManager à différents moments de l'exécution du programme.Pour plus d'informations sur cette classe, consultez Analyse du code de la classe ChannelManager (Exemple CNG).

  • internal sealed class Communicator

    Cette classe fournit la prise en charge du chiffrement et du déchiffrement.Chaque projet crée plusieurs instances Communicator à différents moments de l'exécution du programme.Pour plus d'informations sur cette classe, consultez Analyse du code de la classe Communicator (Exemple CNG).

Versions de sécurité

Le code source prend en charge le scénario de sécurité présenté dans la section Vue d'ensemble de l'exemple CNG.Il implémente les cinq versions suivantes (représentant cinq niveaux de sécurité) de l'outil de messagerie instantanée :

  • Version 1 : utilise des messages texte en clair et des canaux nommés.

  • Version 2 : utilise des messages chiffrés.

  • Version 3 : utilise des messages chiffrés et des signatures numériques.

  • Version 4 : utilise des messages chiffrés et une signature numérique privée.

  • Version 5 : arrête l'application lorsque des erreurs de sécurité se produisent.

Notes

Le reste de cette rubrique fait référence à ces versions d'après leurs numéros.Selon le contexte, les noms « Alice », « Bob » et « Mallory » peuvent faire référence aux trois personnes impliquées dans le scénario de l'exemple ou aux trois applications Visual Studio.

Vue d'ensemble de la session

Alice, Bob et Mallory ont chacun une méthode Main et une méthode Run.

La méthode Main synchronise les applications et exécute les fonctions suivantes :

  • Affiche un écran de démarrage.

  • Demande à l'utilisateur de choisir des options de session (Alice uniquement).

  • Envoie les options de session à Bob et Mallory (Alice uniquement).

  • Reçoit les options de session d'Alice (Bob et Mallory uniquement).

  • Appelle la méthode Run pour exécuter la session de sécurité demandée.

La méthode Run exécute des scénarios de sécurité.

  • Chaque session illustre l'une des versions répertoriées dans la section précédente.

  • Une session démarre lorsque Alice, Bob et Mallory accèdent à leurs méthodes Run et se termine lorsqu'ils retournent à leurs méthodes Main.

  • Alice, Bob et Mallory exécutent toujours la même version pendant une session.

  • Alice lance toutes les transactions d'une session.Mallory répond à Alice et lance les transactions avec Bob.Bob répond.

Les codes sources d'Alice et de Bob sont très similaires.La différence principale est qu'Alice lance chaque session et agit comme un serveur de canaux tandis que Bob agit comme un client de canal.Le code de Mallory est plus complexe car il gère deux canaux séparés : un avec Alice et un avec Bob.

Méthode Main

Alice appelle la méthode InitializeOptions au début de sa méthode Main et reçoit des options de session (Version, fVerbose, fMallory) de l'utilisateur.Elle utilise sa méthode AppControl pour envoyer les options à Bob et Mallory, qui les reçoivent à l'aide de leurs méthodes AppControl.Si l'utilisateur décide de fermer l'application en tapant la lettre « x », la méthode AppControl d'Alice envoie la chaîne « exit » au lieu des options de session à Bob et Mallory.

Après avoir reçu les options de session, les trois applications appellent leurs méthodes Run.

Méthode Run

Alice, Bob et Mallory exécutent la session demandée en procédant comme suit :

  1. Alice appelle la méthode SendChannelName, qui utilise un canal nommé PublicChannel.Elle envoie un nouveau nom de canal (AliceAndBobChannel) à Bob.

  2. Si la valeur true est affectée à l'indicateur fMallory, Mallory écoute PublicChannel et intercepte le nouveau nom de canal (AliceAndBobChannel) d'Alice.Il envoie alors un autre nom de canal (AliceAndBobChannel1) à Bob.

  3. Alice et Bob créent des objets Communicator qui portent leurs noms.Ces objets sont créés dans des instructions using C# et sont supprimés à la fin de la méthode Run.

    Alice est lancé comme un serveur de canaux :

    using (Communicator Alice = new Communicator("server", NewChannelName))
    

    Bob est lancé comme un client de canal :

    using (Communicator Bob = new Communicator("client", NewChannelName))
    

    Mallory crée deux objets Communicator, MalloryAlice et MalloryBob.Mallory est lancé comme un client de canal avec Alice :

    using (Communicator MalloryAlice = new Communicator("client", AliceChannelName))
    

    Mallory est lancé comme un serveur de canaux avec Bob :

    using (Communicator MalloryBob = new Communicator("server", BobChannelName"))
    
  4. Le constructeur de classe Communicator accepte le nom du canal et crée un objet ChannelManager public à long terme nommé ChMgr :

    ChMgr = new ChannelManager(mode, ChannelName);
    
  5. Le constructeur ChannelManager accepte le nom du canal et crée un canal nommé correspondant.

    Notes

    À ce stade, Alice et Mallory communiquent sur un canal nommé AliceAndBobChannel tandis que Mallory et Bob communiquent sur un canal nommé AliceAndBobChannel1.

    AliceAndBobChannel et AliceAndBobChannel1 sont des canaux à long terme qui restent ouverts jusqu'à la fin du scénario de sécurité (c'est-à-dire, la fin de la méthode Run).

  6. Les valeurs des indicateurs fVersion (qui contrôle la version de sécurité) et fMallory (qui contrôle la participation de Mallory) déterminent les étapes suivantes :

    Dans la version 3, Alice envoie une clé de signature numérique à Bob sur PublicChannel.Ils utilisent cette clé de signature numérique pour signer les clés et les messages.Si fMallory a la valeur true, Mallory intercepte la clé de signature numérique et l'utilise pour signer les clés et les messages qu'il envoie à Alice et Bob.

    Dans les versions 4 et 5, Alice envoie deux clés de signature numérique à Bob.La clé de signature numérique 1 est identique à celle qu'Alice a envoyée dans la version 3.La clé de signature numérique 2 est une clé secrète que Mallory ne connaît pas.

  7. Alice et Bob échangent des clés de chiffrement publiques pour les versions 2 à 5Si fMallory a la valeur true, Mallory intercepte leurs clés publiques et les remplace par les siennes.

  8. Alice et Bob échangent des messages.Si fMallory a la valeur true, Mallory intercepte, modifie et renvoie les messages d'Alice et Bob.

  9. Une fois qu'Alice et Bob ont terminé leur discussion, vous êtes invité à envoyer vos propres messages.Vous pouvez ainsi voir comment vos messages sont chiffrés et de quelle manière Mallory les modifie.Lorsque vous avez terminé, appuyez sur ENTRÉE pour redonner le contrôle à Alice.

  10. Alice arrête la session.Les méthodes Run d'Alice, Bob et Mallory retournent le contrôle à leurs méthodes Main et l'exemple redémarre.

Clés de chiffrement (versions 2 à 5)

Les versions 2 à 5 chiffrent des messages à l'aide de l'algorithme AES (Advanced Encryption Standard).L'échange de clés de chiffrement est implémenté dans les méthodes Run d'Alice, Bob et Mallory après l'instruction de code suivante :

if (2 <= Version)

La clé de chiffrement est envoyée par l'objet ChannelManager public à long terme (ChMgr) créé par le constructeur de classe Communicator.

Les deux instructions de code suivantes montrent comment Alice envoie la clé de chiffrement et comment Bob la reçoit :

Alice.Send_or_Receive_PublicCryptoKey("send", MyColor);
Bob.Send_or_Receive_PublicCryptoKey("receive", OtherColor);

Le deuxième paramètre définit la couleur que l'application de réception doit utiliser lors de l'affichage du contenu de la clé de chiffrement.

Les implémentations AES sont considérées comme impossibles à pirater.Toutefois, AES n'offre aucune protection contre une attaque de l'intercepteur.Cela peut paraître contradictoire que Mallory puisse déchiffrer les messages d'Alice et de Bob alors qu'AES fournit un chiffrement renforcé.Ce déchiffrement est possible car Mallory détient les accords secrets partagés d'Alice et de Bob.L'interception de clé de Mallory et son remplacement rendent le chiffrement AES renforcé inutile.

L'utilisation de clés de chiffrement sans authentification donne un faux sentiment de sécurité.Alice et Bob pensent avoir un schéma de transmission de message sécurisé avec la version 2.En fait, la sécurité est compromise avant même qu'ils envoient leur tout premier message.

La société d'Alice et de Bob ne sait pas si les attaques proviennent de l'intérieur ou de l'extérieur.Elle conçoit la version 3 de l'outil messagerie instantanée pour identifier la source des attaques.

Échange de signatures numériques sur un canal public (version 3)

La version 3 tente de résoudre le défaut de sécurité de la version 2 à l'aide d'une signature numérique pour signer les clés et les messages.L'échange de clés de signature numérique est implémenté dans les méthodes Run d'Alice, Bob et Mallory après l'instruction de code suivante :

if (3 <= Version)

La clé de signature numérique est envoyée via le même canal public à long terme que les clés de chiffrement.Le code suivant est chargé d'envoyer la clé de signature numérique :

Alice.ChMgr.SendMessage(dsKeyBlob);

Notes

L'instance ChannelManager (ChMgr) qui envoie la clé de signature numérique est membre de l'objet Communicator d'Alice.

Alice et Bob stockent la clé de signature numérique comme membre privé de leurs objets Communicator :

Alice.StoreDSKey(DSKey);
Bob.StoreDSKey(DSKey);

Malheureusement, Mallory copie facilement la signature numérique à partir de PublicChannel et l'enregistre :

Mallory.StoreDSKey(DSKey);

Lorsque Alice et Bob échangent des messages signés, les signatures numériques correspondent parfaitement aux messages.En effet, Mallory les signe avec la clé de signature numérique utilisée par Alice et Bob.

Dans la version 3, les clés de chiffrement et la signature numérique sont échangées sur un canal public du réseau d'entreprise.La société pour laquelle Alice et Bob travaillent soupçonne un employé de commettre des vols.Elle crée la version 4 pour vérifier cette théorie.

Échange de signatures numériques sur un canal privé (version 4)

La version 4 utilise deux clés de signature numérique : la clé utilisée dans la version 3 et une clé secrète envoyée via un canal privé.La première clé est maintenant une clé fictive destinée à piéger le voleur.Alice et Bob utilisent la seconde clé pour signer numériquement leurs clés de chiffrement et leurs messages.

Seuls Alice et Bob disposent de la version 4 du logiciel de messagerie instantanée.Mallory continue à utiliser la version 3.Par conséquent, il ne découvre donc à aucun moment que la signature numérique qu'il utilise n'est pas valide.L'outil de messagerie instantanée d'Alice et de Bob affiche un avertissement de sécurité pour chaque clé unique et message qu'ils reçoivent.

La version 4 montre que les clés de chiffrement et les messages sont interceptés.Cela indique qu'une attaque de l'intercepteur se produit et que celle-ci commence avant même que les clés de chiffrement ne soient envoyées.Un employé de la société qui a accès au PublicChannel d'entreprise doit donc se connecter avant Bob.Une utilisation intelligente de la clé de signature numérique secrète révèle les activités de Mallory.

La transmission de clés de signature numérique secrètes est implémentée dans les méthodes Run d'Alice et de Bob après l'instruction de code suivante :

if (4 <= Version)

Les instructions de code suivantes sont chargées de créer les instances ChannelManager privées d'Alice et de Bob :

ChannelManager ChMgr2 = new ChannelManager("server", "PrivateChannel")
ChannelManager ChMgr2 = new ChannelManager("client", "PrivateChannel")

Le canal privé qu'Alice et Bob utilisent (ChMgr2) n'est pas un membre de leurs objets Communicator.Vous pouvez le voir en comparant les deux instructions de code suivantes :

Alice.ChMgr.SendMessage(dsKeyBlob); // Public channel - fake key
ChMgr2.SendMessage(dsKeyBlob);      // Private channel - real key

La première instruction utilise l'instance ChannelManager à long terme (ChMgr) créée au démarrage de la méthode Run.Cette instance reste un membre public des objets Communicator d'Alice, Bob et Mallory (consultez l'étape 3 de la section Vue d'ensemble de la session) jusqu'à la fin de la session.La deuxième instruction utilise un objet temporaire qui existe uniquement pour envoyer et recevoir la clé.Il est supprimé immédiatement après utilisation.

Une fois qu'Alice a envoyé la clé de signature numérique secrète, Bob la reçoit à l'aide de l'instruction suivante :

DSKey = ChMgr2.ReadMessage();

Alice et Bob stockent la clé comme membre privé dans leurs objets Communicator :

Alice.StoreDSKey(DSKey);
Bob.StoreDSKey(DSKey);

Ces instructions remplacent également la clé de signature numérique fictive.

Dans la version 4, Alice et Bob utilisent la clé de signature numérique secrète au lieu de la clé fictive pour signer les clés et les messages.La version 4 signe également les clés de chiffrement et affiche des avertissements de sécurité à chaque fois que la signature numérique d'un message ne correspond pas au message.

Arrêt de session (version 5)

La version 5 est identique à la version 4, sauf qu'elle arrête la session à la première erreur.Alice rencontre la première erreur lorsqu'elle reçoit la clé de chiffrement publique de Bob et découvre une signature numérique non valide.Bob rencontre la première erreur lorsqu'il reçoit la clé de chiffrement publique d'Alice et découvre une signature numérique non valide.

Remarques supplémentaires

  • Suppression d'objets : les instructions C# using offrent une plus grande sécurité.Elles permettent d'intégrer tous les objets ChannelManager et Communicator.Lorsque ces objets sont hors de portée, leurs méthodes Dispose sont immédiatement appelées et toutes les ressources détenues en interne sont libérées.

  • Méthodes d'encodage : lorsque vous transmettez des données chiffrées, vous devez les encoder en UTF8 ou Unicode, jamais en ASCII.

Limitations de l'exemple CNG

L'objectif de l'exemple de communication sécurisée CNG est d'illustrer les fonctions CNG managées.Certaines fonctionnalités ont donc été omises, notamment les suivantes :

  • Validation des paramètres sur toutes les méthodes.

  • Utilisation étendue de blocs try/catch.

  • Découverte de la déconnexion de canal fiable.

  • Enregistrement de la sortie écran dans un fichier.

  • Possibilité de configuration dynamique de l'algorithme de chiffrement.

  • Possibilité de configuration dynamique de l'algorithme de signature numérique (DSA).

  • Un autre moyen de transmettre la clé de signature numérique à Bob.Le canal nommé PrivateChannel est une solution simple, mais il existe d'autres méthodes plus sophistiquées.

  • Persistance, stockage et récupération des clés.

  • Utilisation de clés de signature numérique générées par le système d'exploitation.

  • Utilisation de clés fournies par une infrastructure à clé publique (PKI).

Ces fonctionnalités impliquent un code plus complexe et dépassent le cadre de cet exemple.

Voir aussi

Concepts

Communication sécurisée Cryptography Next Generation (CNG), exemple

Échange de clés et de messages étape par étape (Exemple CNG)

Sortie attendue (Exemple CNG)