Schémas de Chiffrement Hybride en Cryptographie

LinuxBeginner
Pratiquer maintenant

Introduction

Dans le monde de la cryptographie, nous sommes souvent confrontés à un compromis entre la vitesse et la sécurité. Les algorithmes de chiffrement symétrique comme AES sont très rapides et idéaux pour chiffrer de grandes quantités de données, mais ils nécessitent une clé secrète partagée qui doit être distribuée de manière sécurisée à la fois à l'expéditeur et au destinataire. Les algorithmes de chiffrement asymétrique comme RSA sont excellents pour l'échange de clés sécurisé en utilisant une paire de clés publique/privée, mais ils sont coûteux en calcul et trop lents pour chiffrer des données en masse.

Le chiffrement hybride résout ce problème en combinant les forces des deux méthodes. Il utilise une approche du "meilleur des deux mondes" :

  1. Le chiffrement asymétrique est utilisé pour chiffrer et partager de manière sécurisée une clé symétrique temporaire et unique (souvent appelée "clé de session").
  2. Le chiffrement symétrique est ensuite utilisé avec cette clé de session pour chiffrer rapidement et efficacement les données du message réel, plus volumineux.

Dans ce laboratoire, vous implémenterez un schéma de chiffrement hybride complet à partir de zéro en utilisant l'outil en ligne de commande openssl. Vous générerez une paire de clés RSA, créerez une clé de session AES aléatoire, utiliserez RSA pour chiffrer la clé de session, utiliserez AES pour chiffrer un message, et enfin, inverserez le processus pour déchiffrer le message.

Aperçu du Chiffrement Hybride

Dans cette étape, nous allons brièvement revoir les concepts fondamentaux qui font du chiffrement hybride une technique puissante et largement utilisée. Aucune commande n'est à exécuter dans cette étape ; l'objectif est de construire une base conceptuelle solide avant de commencer le travail pratique.

Chiffrement Symétrique (ex. AES)

  • Fonctionnement : Utilise une seule clé secrète partagée pour le chiffrement et le déchiffrement.
  • Force : Très rapide et efficace, ce qui le rend parfait pour chiffrer de grands fichiers ou des flux de données.
  • Faiblesse : La distribution de la clé. Comment transmettre la clé secrète partagée au destinataire de manière sécurisée ? Si un attaquant intercepte la clé, il peut déchiffrer toutes les communications.

Chiffrement Asymétrique (ex. RSA)

  • Fonctionnement : Utilise une paire de clés : une clé publique pour le chiffrement et une clé privée pour le déchiffrement. La clé publique peut être partagée librement, tandis que la clé privée doit être gardée secrète par son propriétaire.
  • Force : Résout le problème de la distribution des clés. N'importe qui peut utiliser votre clé publique pour vous chiffrer un message, mais seul vous pouvez le déchiffrer avec votre clé privée.
  • Faiblesse : Il est mathématiquement complexe et donc beaucoup plus lent que le chiffrement symétrique. Il est peu pratique pour chiffrer de grandes quantités de données.

La Solution Hybride

Le chiffrement hybride combine ces deux méthodes pour obtenir la sécurité du chiffrement asymétrique et la vitesse du chiffrement symétrique. Voici le flux de travail typique :

  1. L'expéditeur (Alice) souhaite envoyer un message sécurisé au destinataire (Bob).
  2. Alice génère une nouvelle clé de session symétrique aléatoire.
  3. Alice chiffre son message réel en utilisant cette clé de session symétrique rapide.
  4. Alice obtient la clé publique de Bob. Elle l'utilise pour chiffrer uniquement la petite clé de session symétrique.
  5. Alice envoie à Bob à la fois le message chiffré symétriquement et la clé de session chiffrée asymétriquement.
  6. Bob reçoit les deux éléments. Il utilise d'abord sa clé privée pour déchiffrer la clé de session chiffrée.
  7. Maintenant que Bob possède la clé de session symétrique originale, il l'utilise pour déchiffrer rapidement le message réel.

Ce processus garantit que les données en masse sont chiffrées efficacement, et que la clé utilisée pour ce chiffrement est échangée avec une sécurité maximale. Dans les étapes suivantes, nous implémenterons exactement ce flux de travail.

Générer les Clés RSA et AES

Dans cette étape, nous allons générer les deux ensembles de clés requis pour notre schéma de chiffrement hybride : une paire de clés RSA (publique et privée) pour la partie asymétrique, et une clé de session aléatoire pour la partie symétrique (AES). Toutes les opérations seront effectuées dans le répertoire ~/project.

Tout d'abord, générons une clé privée RSA de 2048 bits. Cette clé doit être gardée secrète par le destinataire.

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

Vous verrez une sortie pendant la génération de la clé. Ensuite, nous devons extraire la clé publique correspondante de la clé privée que nous venons de créer. Cette clé publique peut être partagée avec toute personne souhaitant vous envoyer un message chiffré.

openssl rsa -pubout -in private_key.pem -out public_key.pem

La commande affichera writing RSA key.

Maintenant, créons une clé de session aléatoire de 256 bits (32 octets). Cette clé sera utilisée avec l'algorithme AES pour chiffrer nos données réelles. Nous utilisons openssl rand pour générer des données aléatoires cryptographiquement fortes et l'encodons en Base64 pour une manipulation plus facile.

openssl rand -base64 32 > session_key.key

Listons les fichiers dans notre répertoire pour voir les clés que nous avons créées.

ls -l

Vous devriez voir les trois fichiers de clés que vous venez de générer, ainsi que le fichier message.txt créé lors de la configuration.

-rw-rw-r-- 1 labex labex   57 Oct 20 15:12 message.txt
-rw------- 1 labex labex 1704 Oct 20 15:14 private_key.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 15:14 public_key.pem
-rw-rw-r-- 1 labex labex   45 Oct 20 15:14 session_key.key

Chiffrer la Clé de Session avec RSA

Dans cette étape, nous allons effectuer une partie critique du processus de chiffrement hybride : le chiffrement de la clé de session symétrique. Pour garantir que seule la personne destinataire prévue puisse utiliser la clé de session, nous allons la chiffrer à l'aide de sa clé publique RSA.

Nous utiliserons la commande openssl pkeyutl, qui est un utilitaire pour les opérations de clé publique. Nous l'utiliserons pour chiffrer le fichier session_key.key avec la clé public_key.pem.

Exécutez la commande suivante :

openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in session_key.key -out encrypted_session_key.bin

Décortiquons cette commande :

  • pkeyutl: L'outil d'utilité pour les clés publiques (public key utility tool).
  • -encrypt: Spécifie que nous souhaitons effectuer une opération de chiffrement.
  • -pubin: Indique que la clé d'entrée (-inkey) est une clé publique.
  • -inkey public_key.pem: Spécifie la clé publique à utiliser pour le chiffrement.
  • -in session_key.key: Le fichier d'entrée à chiffrer (notre clé de session AES).
  • -out encrypted_session_key.bin: Le fichier de sortie où la clé chiffrée sera stockée.

Cette commande crée un nouveau fichier, encrypted_session_key.bin, qui contient la clé de session sous une forme chiffrée. Ce fichier peut maintenant être transmis en toute sécurité, car seul le propriétaire de la clé privée correspondante peut le déchiffrer.

Vérifions le fichier nouvellement créé :

ls -l encrypted_session_key.bin

Vous verrez le fichier binaire contenant la clé chiffrée.

-rw-rw-r-- 1 labex labex 256 Oct 20 15:14 encrypted_session_key.bin

Chiffrer les Données avec AES

Maintenant que nous avons sécurisé notre clé de session, nous pouvons utiliser la clé de session originale, non chiffrée, pour chiffrer rapidement notre fichier de données principal, message.txt. Nous utiliserons le chiffrement symétrique AES-256-CBC pour cette tâche.

La commande openssl enc exige que la clé (key) et le Vecteur d'Initialisation (IV - Initialization Vector) soient fournis au format hexadécimal. Notre session_key.key est en Base64, nous devons donc d'abord le décoder et le convertir en hexadécimal. Nous allons également générer un IV aléatoire. Nous stockerons les deux dans des variables d'environnement pour plus de commodité.

Premièrement, convertissez la clé de session et stockez-la dans la variable AES_KEY :

export AES_KEY=$(cat session_key.key | base64 -d | xxd -p -c 32)

Ensuite, générez un IV aléatoire de 128 bits (16 octets) et stockez-le dans la variable AES_IV. Un IV est utilisé pour garantir que le chiffrement du même texte clair plusieurs fois produit des textes chiffrés différents.

export AES_IV=$(openssl rand -hex 16)

Avec la clé et l'IV prêts, nous pouvons maintenant chiffrer message.txt en utilisant openssl enc :

openssl enc -aes-256-cbc -in message.txt -out encrypted_message.dat -K $AES_KEY -iv $AES_IV

Examinons les options de la commande :

  • -aes-256-cbc: Spécifie le chiffrement AES-256 en mode CBC.
  • -in message.txt: Le fichier de données d'entrée.
  • -out encrypted_message.dat: Le fichier de sortie pour les données chiffrées.
  • -K $AES_KEY: La clé de chiffrement au format hexadécimal (K majuscule).
  • -iv $AES_IV: Le vecteur d'initialisation au format hexadécimal.

À ce stade, l'expéditeur empaquèterait encrypted_message.dat, encrypted_session_key.bin, et l'IV ($AES_IV) pour les envoyer au destinataire. Pour ce laboratoire, nous avons tous les fichiers dans notre répertoire, prêts pour l'étape de déchiffrement.

Vérifions que le fichier de données chiffré a été créé :

ls -l encrypted_message.dat
-rw-rw-r-- 1 labex labex 64 Oct 20 15:14 encrypted_message.dat

Déchiffrer le Message

Dans cette étape finale, nous allons simuler les actions du destinataire. Le destinataire a reçu les données chiffrées (encrypted_message.dat), la clé de session chiffrée (encrypted_session_key.bin), et l'IV. Il utilisera sa clé privée secrète pour inverser le processus et récupérer le message original.

Premièrement, le destinataire doit déchiffrer la clé de session en utilisant sa private_key.pem.

openssl pkeyutl -decrypt -inkey private_key.pem -in encrypted_session_key.bin -out decrypted_session_key.key

Cette commande utilise pkeyutl avec l'indicateur -decrypt et la clé privée pour récupérer la clé de session AES originale, en l'enregistrant dans decrypted_session_key.key.

Nous pouvons rapidement vérifier que la clé déchiffrée est identique à l'originale que nous avons créée à l'Étape 2. La commande diff ne devrait produire aucune sortie si les fichiers sont identiques.

diff session_key.key decrypted_session_key.key

Maintenant que nous avons la clé de session, nous pouvons déchiffrer le message principal. Tout comme lors de l'étape de chiffrement, nous devons d'abord convertir la clé au format hexadécimal.

export DECRYPTED_AES_KEY=$(cat decrypted_session_key.key | base64 -d | xxd -p -c 32)

Enfin, utilisez openssl enc avec l'indicateur -d (decrypt/déchiffrer), en fournissant la même clé et le même IV qui ont été utilisés pour le chiffrement. (La variable $AES_IV est toujours définie dans notre shell depuis l'étape précédente).

openssl enc -d -aes-256-cbc -in encrypted_message.dat -out decrypted_message.txt -K $DECRYPTED_AES_KEY -iv $AES_IV

Le processus est terminé ! Le message original a été récupéré et sauvegardé dans decrypted_message.txt. Visualisons son contenu pour confirmer notre succès.

cat decrypted_message.txt

Vous devriez voir le message secret original s'afficher dans votre terminal :

This is a secret message that needs to be sent securely.

Résumé

Dans ce laboratoire, vous avez réussi à mettre en œuvre un flux complet de chiffrement et de déchiffrement hybride à l'aide d'OpenSSL. Vous avez acquis une expérience pratique des concepts fondamentaux qui sécurisent une grande partie de nos communications numériques.

Vous avez appris à :

  • Générer une paire de clés RSA pour le chiffrement asymétrique.
  • Créer une clé de session AES aléatoire pour le chiffrement symétrique.
  • Sécuriser la clé de session en utilisant la clé publique RSA.
  • Chiffrer efficacement les données volumineuses en utilisant la clé de session AES.
  • Inverser le processus en déchiffrant la clé de session avec la clé privée RSA, puis en déchiffrant les données.

Cette approche qui combine le meilleur des deux mondes ("best of both worlds"), en alliant la sécurité de la cryptographie asymétrique pour l'échange de clés à la rapidité de la cryptographie symétrique pour le chiffrement des données, est une pierre angulaire des protocoles de sécurité modernes tels que TLS/SSL qui protègent vos données sur Internet tous les jours.