Échange de Clés Basique avec Diffie-Hellman en Cryptographie

LinuxBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous explorerez les fondamentaux de l'échange de clés Diffie-Hellman (DH), une pierre angulaire de la cryptographie moderne. Le protocole DH permet à deux parties, qui n'ont aucune connaissance préalable l'une de l'autre, d'établir conjointement une clé secrète partagée sur un canal de communication non sécurisé. Ce secret partagé peut ensuite être utilisé pour chiffrer les communications ultérieures à l'aide d'un chiffrement à clé symétrique.

Vous utiliserez l'outil puissant en ligne de commande openssl pour simuler l'intégralité du processus DH. Cela comprend la génération des paramètres publics, la création des clés privées et publiques pour deux parties distinctes, et enfin, la dérivation et la vérification du secret partagé. À la fin de ce laboratoire, vous aurez une compréhension pratique du fonctionnement de cette poignée de main cryptographique essentielle.

Principe de l'Échange de Clés Diffie-Hellman

Dans cette étape, nous allons couvrir le principe théorique de l'échange de clés Diffie-Hellman (DH). Il n'y a pas de commandes à exécuter dans cette étape ; l'objectif est de comprendre le concept avant de le mettre en œuvre.

Le processus fonctionne comme suit :

  1. Accord sur les Paramètres Publics : Deux parties, appelons-les Alice et Bob, se mettent d'accord sur deux nombres publics : un grand nombre premier p (le module) et une base g (le générateur). Ces nombres ne sont pas secrets et peuvent être transmis sur un canal non sécurisé.

  2. Génération des Clés Privées :

    • Alice choisit un entier privé secret a. Elle garde ce nombre pour elle.
    • Bob choisit un entier privé secret b. Il garde ce nombre pour lui.
  3. Calcul des Clés Publiques :

    • Alice calcule sa clé publique A en utilisant la formule : A = g^a \mod p. Elle envoie cette clé publique A à Bob.
    • Bob calcule sa clé publique B en utilisant la formule : B = g^b \mod p. Il envoie cette clé publique B à Alice.
  4. Dérivation du Secret Partagé :

    • Alice reçoit la clé publique B de Bob et calcule le secret partagé S en utilisant sa propre clé privée a : S = B^a \mod p.
    • Bob reçoit la clé publique A d'Alice et calcule le secret partagé S en utilisant sa propre clé privée b : S = A^b \mod p.

Grâce aux propriétés de l'arithmétique modulaire, Alice et Bob arriveront à la valeur exacte de S.

  • Calcul d'Alice : S = (g^b \mod p)^a \mod p = g^{ba} \mod p
  • Calcul de Bob : S = (g^a \mod p)^b \mod p = g^{ab} \mod p

Un espion sur le canal peut voir p, g, A et B, mais ne peut pas facilement calculer les clés privées a ou b. Cette difficulté est connue sous le nom de problème du logarithme discret, qui constitue la base de la sécurité de l'échange Diffie-Hellman.

Dans les étapes suivantes, vous utiliserez openssl pour effectuer ces actions.

Générer les Paramètres Diffie-Hellman

Dans cette étape, vous allez générer les paramètres DH publics (p et g) que les deux parties utiliseront. L'outil openssl peut gérer les mathématiques complexes nécessaires pour trouver un nombre premier et un générateur appropriés. Toutes les opérations de ce laboratoire seront effectuées dans le répertoire par défaut ~/project.

Utilisez la commande openssl dhparam pour générer les paramètres. Nous spécifierons une taille de clé de 2048 bits, ce qui est une longueur courante et sécurisée à cette fin.

Exécutez la commande suivante dans votre terminal :

openssl dhparam -out dhparam.pem 2048

Décortiquons cette commande :

  • openssl dhparam: Ceci invoque l'outil de gestion des paramètres DH dans OpenSSL.
  • -out dhparam.pem: Ce drapeau spécifie que la sortie doit être enregistrée dans un fichier nommé dhparam.pem.
  • 2048: C'est la longueur en bits souhaitée pour le module premier p.

Cette commande peut prendre une minute à s'exécuter car elle recherche un nombre premier fort. Vous verrez une sortie similaire à ce qui suit pendant son exécution :

Generating DH parameters, 2048 bit long safe prime

Une fois terminée, un fichier nommé dhparam.pem sera créé dans votre répertoire actuel. Ce fichier contient les paramètres publics que les deux parties utiliseront pour l'échange de clés.

Générer les Clés de la Partie A

Dans cette étape, vous allez simuler les actions de la première partie, la "Partie A". La Partie A utilisera les paramètres DH partagés de l'étape précédente pour générer sa propre clé privée, puis en dérivera une clé publique correspondante.

Tout d'abord, générez la clé privée de la Partie A. Cette clé correspond au nombre secret a de notre exemple théorique. Nous utiliserons la commande openssl genpkey, qui est un utilitaire de génération de clés à usage général.

Exécutez la commande suivante pour générer la clé privée de la Partie A :

openssl genpkey -paramfile dhparam.pem -out a_private_key.pem
  • genpkey: La commande pour générer une clé privée.
  • -paramfile dhparam.pem: Ceci indique à genpkey d'utiliser les paramètres de notre fichier dhparam.pem pour créer une clé DH.
  • -out a_private_key.pem: Ceci enregistre la clé privée générée dans le fichier a_private_key.pem.

Ensuite, la Partie A doit dériver sa clé publique à partir de la clé privée. La clé publique est ce qui sera partagé avec la Partie B.

Exécutez cette commande pour extraire la clé publique :

openssl pkey -in a_private_key.pem -pubout -out a_public_key.pem
  • pkey: Une commande pour gérer les clés publiques et privées.
  • -in a_private_key.pem: Spécifie la clé privée d'entrée.
  • -pubout: Ce drapeau demande à la commande de produire la partie publique de la clé.
  • -out a_public_key.pem: Enregistre la clé publique résultante dans a_public_key.pem.

Vous disposez maintenant de deux nouveaux fichiers : a_private_key.pem, que la Partie A doit garder secret, et a_public_key.pem, que la Partie A enverrait à la Partie B via le canal non sécurisé.

Générer les Clés de la Partie B

Dans cette étape, vous allez effectuer les mêmes actions pour la deuxième partie, la "Partie B". La Partie B opère indépendamment de la Partie A mais utilise les mêmes paramètres DH publics provenant de dhparam.pem.

Premièrement, générez la clé privée de la Partie B. Ceci correspond au nombre secret b dans notre exemple théorique.

Exécutez la commande suivante :

openssl genpkey -paramfile dhparam.pem -out b_private_key.pem

Cette commande est structurellement identique à celle utilisée pour la Partie A, mais nous enregistrons la sortie dans b_private_key.pem pour la distinguer.

Ensuite, tout comme la Partie A, la Partie B doit dériver sa clé publique à partir de sa nouvelle clé privée.

Exécutez cette commande pour extraire la clé publique de la Partie B :

openssl pkey -in b_private_key.pem -pubout -out b_public_key.pem

À ce stade dans un échange réel, la Partie A posséderait la clé publique de la Partie B (b_public_key.pem), et la Partie B posséderait la clé publique de la Partie A (a_public_key.pem). Les deux parties ont gardé leurs clés privées respectives secrètes. Vous avez maintenant simulé avec succès la partie génération et échange de clés du protocole.

Calculer le Secret Partagé

Ceci est l'étape finale et la plus importante. Ici, les deux parties utiliseront leur propre clé privée et la clé publique de l'autre partie pour calculer indépendamment le secret partagé. Si le protocole réussit, elles parviendront toutes deux à la valeur secrète exacte.

Premièrement, calculons le secret partagé du point de vue de la Partie A. La Partie A utilise sa clé privée (a_private_key.pem) et la clé publique de la Partie B (b_public_key.pem).

Exécutez la commande suivante :

openssl pkeyutl -derive -inkey a_private_key.pem -peerkey b_public_key.pem -out a_shared_secret.bin
  • pkeyutl: Un utilitaire pour effectuer des opérations de clé publique.
  • -derive: Cette action indique à l'utilitaire de dériver un secret partagé.
  • -inkey a_private_key.pem: Spécifie la clé privée propre à la Partie A.
  • -peerkey b_public_key.pem: Spécifie la clé publique de l'autre partie (le "pair").
  • -out a_shared_secret.bin: Enregistre le secret binaire résultant dans un fichier.

Ensuite, calculez le secret partagé du point de vue de la Partie B. La Partie B utilise sa clé privée (b_private_key.pem) et la clé publique de la Partie A (a_public_key.pem).

Exécutez la commande suivante :

openssl pkeyutl -derive -inkey b_private_key.pem -peerkey a_public_key.pem -out b_shared_secret.bin

Maintenant, vous avez deux fichiers, a_shared_secret.bin et b_shared_secret.bin. Pour vérifier le succès de l'échange de clés, ces deux fichiers doivent être identiques. Vous pouvez utiliser la commande cmp (compare) pour vérifier cela.

cmp a_shared_secret.bin b_shared_secret.bin

Si les fichiers sont identiques, cette commande ne produira aucune sortie et se terminera silencieusement. Ce silence signifie le succès !

Pour une confirmation plus visuelle, vous pouvez également calculer le hachage cryptographique des deux fichiers. Les hachages doivent correspondre.

sha256sum *.bin

Vous devriez voir une sortie où les deux fichiers ont exactement le même hachage SHA256. Les valeurs de hachage réelles varieront entre les exécutions, mais elles doivent être identiques pour les deux fichiers :

e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  a_shared_secret.bin
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  b_shared_secret.bin

(Note : Vos valeurs de hachage seront différentes de cet exemple, mais l'important est que les hachages pour a_shared_secret.bin et b_shared_secret.bin doivent être identiques, prouvant que les deux parties ont dérivé le même secret partagé.)

Félicitations, vous avez réussi à effectuer un échange de clés Diffie-Hellman !

Résumé

Dans ce laboratoire, vous avez réussi à simuler un échange de clés Diffie-Hellman complet en utilisant l'outil en ligne de commande openssl. Vous avez acquis une expérience pratique des étapes fondamentales de ce protocole cryptographique essentiel.

Vous avez appris à :

  • Générer des paramètres DH publics partagés (openssl dhparam).
  • Créer des paires de clés privée et publique pour deux parties distinctes basées sur ces paramètres (openssl genpkey et openssl pkey).
  • Dériver un secret partagé à partir de sa propre clé privée et de la clé publique d'un pair (openssl pkeyutl -derive).
  • Vérifier que les deux parties ont calculé indépendamment le secret exact, prouvant ainsi le succès de l'échange.

Ce processus est un élément fondamental pour les systèmes de communication sécurisés tels que TLS/SSL, qui protègent les données sur Internet. Vous avez maintenant une compréhension pratique de la manière dont deux parties peuvent établir un canal de communication sécurisé, même en partant d'un réseau non sécurisé.