openssl

Nous allons faire les meme étapes que le protocole openPGP avec la suite d'outils de chiffrement donné par openSSL pour bien séparer les différentes étapes. Si vous voulez utiliser pleinement le protocole openPGP, utilisez cependant plutôt un outil dédié gomme Gnupg, ci-après.

Placez vous dans un dossier où vous pourrez placer tous les fichiers nécessaires

Installation

On utilise la version 3 d'openssl :

❯ openssl --version
OpenSSL 3.6.0 1 Oct 2025 (Library: OpenSSL 3.6.0 1 Oct 2025)

Linux

sudo apt install openssl

Macos

❯ brew install openssl

Windows

On utilise winget, le gestionnaire de paquet de Windows 11.

  1. recherche de openssl dans la liste des paquets disponibles : https://winget.run/
  2. on utilise le paquet OpenSSL.Light

Une fois le parquet installé, il faut encore ajouter le chemin d'exécution. Pour cela :

  1. commencez par trouver l'endroit où est installé openssl (qui moi c'estC:\Program Files\OpenSSL-Win64\bin\)
  2. utilisez ce tutoriel pour l'ajouter aux chemins d'exécution

Clés du chiffrement asymétrique

openssl genpkey -help

On commence par générer un couple de clés publique/privée avec RSA :

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

Cette commande va produire un fichier private_key.pem au format PEM. Ce fichier va faire office de clé privée mais il contient bien le couple des clés publique et privée :

openssl rsa -in private_key.pem -text

Extrayons la clé publique du fichier private_key.pem et stockons là dans le fichier public_key.pem :

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

La taille du fichier public_key.pem ne contient que la clé publique (il est bien plus petit que le fichier private_key.pem)

openssl rsa -pubin -in public_key.pem -text

Pour bien faire, changez les droits du fichier private_key.pem pour qu'il ne soit lisible que par vous.

solution

chmod go-r private_key.pem 

On peut distribuer notre clé publique pour pouvoir recevoir des messages privés.

Envoyez par mail votre clé publique à la personne avec laquelle vous voulez échanger un message privé. Vous devrez chacun avoir la clé publique de l'autres :

  • vous devrez avoir la clé publique de l'autre personne pour chiffrer la clé symétrique
  • l'autre personne devra avoir votre clé publique pour vérifier la signature du message chiffré

Clé du chiffrement symétrique

Créons une clé de 32B = 256b pour être utilisée par chacha20.

openssl rand -hex -out symmetric_key 32

Le fichier symmetric_key.pem contient la clé.

Vérifiez que la taille du fichier symmetric_key.pem est bien compatible avec une clé de 256b.

solution

wc -c symmetric_key

Donne 65. C'est cohérent :

  • 1 caractère pour le retour à la ligne final
  • un byte est codée sur 2 digit hexadécimaux. Il y a donc $(65-1) / 2 = 32B$
  • un Byte vaut 8b, on a bien $32 \cdot 8 = 256b$

Chiffrement symétrique

On écrit un petit message à envoyer :

echo "Un coucou chiffré." > msg.txt

On commence par compresser ce fichier (on utilise ici zip, mais vous pouvez utiliser ce que vous voulez) :

zip -u msg.txt.zip msg.txt

OpenSSL permet le chiffrement symétrique avec plein d'algorithmes différents :

openssl enc -ciphers

Chiffrons avec chacha20 :

openssl enc -p -chacha20 -in msg.txt.zip -out msg.txt.zip.encrypted -kfile symmetric_key -pbkdf2

On utilise ici un passphrase qui va dériver les paramètres de chacha : une clé de chiffrement et un IV. On a utilisé ici des clés explicites. On peut aussi passer via des passphrases dont sont dérivées les clés et IV :

openssl enc -p -chacha20 -in msg.txt.zip -out msg.txt.zip.encrypted -K $(openssl rand -hex -out symmetric_key 32) -iv $(openssl rand -hex 16)

TBD faire avec K et IV sans -p

Chiffrement asymétrique de la clé symétrique

TBD faire avec sign then encrypt. Comme ça on cache l'expéditeur puis zip les trois fichiers à envoyer.

Signature

On signe un hash. OpenSSL propose plein de fonction de hash différente :

 openssl dgst -list

On va utiliser sha256 pour signer le message chiffré avec notre clé privée :

openssl dgst -sha256 -sign private_key.pem -out msg.txt.zip.encrypted.sign.sha256 msg.txt.zip.encrypted

Chiffrement de la clé

Chiffrons la clé symétrique avec la clé publique de notre interlocuteur :

openssl pkeyutl -encrypt -in symmetric_key -pubin -inkey public_key.pem -out symmetric_key.encrypted

Envoi du message

Il faut envoyer :

  1. le message chiffré : msg.txt.zip.encrypted
  2. la signature du message chiffré : msg.txt.zip.encrypted.sign.sha256
  3. la clé symétrique chiffrée avec la clé publique de l'interlocuteur : symmetric_key.encrypted

Déchiffrement

Vous devez avoir :

  1. la clé publique de l'envoyeur
  2. votre clé privée

Vérification de la signature

openssl dgst -verify public_key.pem -signature msg.txt.zip.encrypted.sign.sha256 msg.txt.zip.encrypted    

Si tout s'est bien passé vous devriez voir Verified OK comme réponse (sinons vous auriez eu Verification failure comme réponse).

Déchiffrement de la clé symétrique

openssl pkeyutl -decrypt -inkey private_key.pem -in symmetric_key.encrypted -out symmetric_key

Déchiffrement du message

openssl enc -d -p -chacha20 -in msg.txt.zip.encrypted -kfile symmetric_key -pbkdf2 -out msg.txt.zip

Dézippage du message

unzip msg.txt.zip

Et normalement, vous devriez avoir le fichier initial !