Aller au contenu

🖥️ TP — CHIFFREMENT AVEC OPENSSL ET GPG⚓︎

Durée : 50 minutes — Individuel


Prérequis — Vérification des Outils (5 min)⚓︎

Bash
# Vérifier OpenSSL
openssl version
# Attendu : OpenSSL 3.x.x (ou 1.1.x)

# Vérifier GPG
gpg --version
# Attendu : gpg (GnuPG) 2.x.x

# Si non installés :
# Linux (Debian/Ubuntu) :
sudo apt install openssl gnupg2

# Windows (Git Bash ou WSL) :
# OpenSSL : inclus dans Git for Windows
# GPG : Télécharger Gpg4win https://gpg4win.org

ÉTAPE 1 — Créer le Fichier de Test (5 min)⚓︎

Bash
# Créer un répertoire de travail
mkdir ~/tp_crypto && cd ~/tp_crypto

# Créer un fichier texte de test (données sensibles fictives)
cat > secret.txt << 'EOF'
=== DONNÉES CONFIDENTIELLES — ENTREPRISE INNOTECH ===
Date : 2024-03-15
Auteur : Jean Dupont

PROJET ALPHA — CONFIDENTIEL
Budget alloué : 2 500 000 €
Partenaires : Société X, Société Y
Lancement prévu : Q4 2024

DONNÉES CLIENTS PRIORITAIRES
- Client A : 850 000 €/an — Contact : alice@clientA.fr
- Client B : 1 200 000 €/an — Contact : bob@clientB.fr

MOT DE PASSE SERVEUR DE PROD : (à ne jamais stocker ici en vrai !)
srv-prod-01 : admin / R4nd0mP@ss!2024

NOTE : Ce document est destiné à la direction uniquement.
EOF

# Vérifier le contenu
cat secret.txt

# Vérifier la taille
ls -lh secret.txt

ÉTAPE 2 — Hachage SHA-256 (Intégrité) (5 min)⚓︎

Bash
# Calculer l'empreinte SHA-256 du fichier original
sha256sum secret.txt
# Résultat : [hash en hexadécimal 64 chars]  secret.txt

# Stocker l'empreinte pour vérification ultérieure
sha256sum secret.txt > secret.txt.sha256
cat secret.txt.sha256

# ─── COMPRENDRE ───────────────────────────────────────────────
# SHA-256 génère TOUJOURS une empreinte de 256 bits (64 caractères hex)
# Quelle que soit la taille du fichier en entrée.
# Si 1 seul bit du fichier change → Empreinte COMPLÈTEMENT différente.
# IRRÉVERSIBLE : Impossible de retrouver le fichier depuis l'empreinte.

# Simulation de modification et détection d'altération :
cp secret.txt secret_modifie.txt
echo "Modification malveillante" >> secret_modifie.txt

sha256sum secret.txt
sha256sum secret_modifie.txt
# → Les 2 hashes sont complètement différents !

# Vérification d'intégrité automatique :
sha256sum -c secret.txt.sha256
# Si OK : secret.txt: OK
# Si altéré : secret.txt: FAILED

ÉTAPE 3 — Chiffrement avec OpenSSL (AES-256-CBC) (15 min)⚓︎

3a — Chiffrer le fichier⚓︎

Bash
# CHIFFREMENT AES-256-CBC avec dérivation de clé PBKDF2
openssl enc -aes-256-cbc \
  -salt \
  -pbkdf2 \
  -iter 100000 \
  -in secret.txt \
  -out secret.enc \
  -pass pass:MonMotDePasseSecret2024!

# Explication des options :
# -aes-256-cbc    : Algorithme AES-256 en mode CBC
# -salt           : Ajoute un sel aléatoire (évite attaques par dictionnaire)
# -pbkdf2         : Dérivation de clé PBKDF2 (Password-Based Key Derivation)
# -iter 100000    : 100 000 itérations (ralentit le brute force)
# -in secret.txt  : Fichier source (clair)
# -out secret.enc : Fichier destination (chiffré)
# -pass pass:xxx  : Mot de passe (EN PROD : utiliser -pass file: ou prompt)

# Comparer les tailles
ls -lh secret.txt secret.enc
echo ""
echo "Contenu chiffré (données brutes en base64 pour visualisation) :"
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
  -in secret.txt -pass pass:MonMotDePasseSecret2024! | base64 | head -5

# Tenter de lire le fichier chiffré
cat secret.enc
# → Données binaires illisibles ✅

3b — Vérifier qu'on ne peut pas lire sans la clé⚓︎

Bash
# Tenter de déchiffrer avec le MAUVAIS mot de passe
openssl enc -aes-256-cbc -d \
  -pbkdf2 \
  -iter 100000 \
  -in secret.enc \
  -out secret_mauvais.txt \
  -pass pass:MauvaisMotDePasse
# → Erreur : "bad decrypt" ou fichier illisible/corrompu ✅

cat secret_mauvais.txt 2>/dev/null || echo "Fichier illisible — Mauvais mot de passe ✅"

3c — Déchiffrer avec le bon mot de passe⚓︎

Bash
# DÉCHIFFREMENT
openssl enc -aes-256-cbc -d \
  -pbkdf2 \
  -iter 100000 \
  -in secret.enc \
  -out secret_restaure.txt \
  -pass pass:MonMotDePasseSecret2024!

# Vérifier que le fichier restauré est identique à l'original
cat secret_restaure.txt

# Comparaison automatique (diff)
diff secret.txt secret_restaure.txt
echo "diff retourne : $? (0 = identiques ✅, autre = différences ❌)"

# Vérification par hash
sha256sum secret.txt secret_restaure.txt
# Les 2 hashes doivent être IDENTIQUES

3d — Analyser ce qui s'est passé "sous le capot"⚓︎

Bash
# Afficher les informations sur le fichier chiffré
openssl enc -aes-256-cbc -d \
  -pbkdf2 \
  -iter 100000 \
  -in secret.enc \
  -pass pass:MonMotDePasseSecret2024! \
  -P 2>&1 | grep -E "salt|key|iv" || true

# Avec le flag -v (verbose) pour voir les détails
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
  -in secret.txt -out secret2.enc \
  -pass pass:MonMotDePasseSecret2024! -v 2>&1

# Remarquer que :
# → salt : aléatoire à chaque chiffrement (même mot de passe → fichiers différents)
# → key : 256 bits dérivés du mot de passe via PBKDF2
# → iv : Initialization Vector, aléatoire

# Preuve : Chiffrer 2 fois le même fichier avec le même MDP
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
  -in secret.txt -out secret_copy1.enc \
  -pass pass:MonMotDePasseSecret2024!
openssl enc -aes-256-cbc -salt -pbkdf2 -iter 100000 \
  -in secret.txt -out secret_copy2.enc \
  -pass pass:MonMotDePasseSecret2024!

sha256sum secret_copy1.enc secret_copy2.enc
# → Les 2 hashes sont DIFFÉRENTS (grâce au salt aléatoire) ✅

ÉTAPE 4 — Chiffrement avec GPG (Symétrique) (15 min)⚓︎

4a — Chiffrer avec GPG⚓︎

Bash
# CHIFFREMENT SYMÉTRIQUE GPG (AES-256 par défaut)
gpg --symmetric \
    --cipher-algo AES256 \
    --batch \
    --passphrase "AutreMotDePasseGPG!2024" \
    --output secret.gpg \
    secret.txt

# Options :
# --symmetric      : Chiffrement symétrique (pas de clé publique)
# --cipher-algo    : Algorithme de chiffrement
# --batch          : Mode non-interactif (pas de prompt)
# --passphrase     : Mot de passe
# --output         : Fichier de sortie

# Voir les informations du fichier chiffré
gpg --list-packets secret.gpg 2>/dev/null || gpg --dry-run --decrypt secret.gpg 2>&1 | head -10

# Comparer les tailles
ls -lh secret.txt secret.gpg secret.enc

4b — Déchiffrer avec GPG⚓︎

Bash
# DÉCHIFFREMENT
gpg --decrypt \
    --batch \
    --passphrase "AutreMotDePasseGPG!2024" \
    --output secret_gpg_restaure.txt \
    secret.gpg

# Vérifier le résultat
cat secret_gpg_restaure.txt
diff secret.txt secret_gpg_restaure.txt
echo "Résultat diff : $? (0 = identique ✅)"

4c — Chiffrer un dossier entier avec GPG (tar + gpg)⚓︎

Bash
# En pratique : on chiffre souvent une archive tar
mkdir -p ~/tp_crypto/dossier_confidentiel
echo "Fichier 1 confidentiel" > ~/tp_crypto/dossier_confidentiel/fichier1.txt
echo "Fichier 2 confidentiel" > ~/tp_crypto/dossier_confidentiel/fichier2.txt

# Créer l'archive tar puis chiffrer en une commande
tar -czf - ~/tp_crypto/dossier_confidentiel/ | \
  gpg --symmetric \
      --cipher-algo AES256 \
      --batch \
      --passphrase "MotDePasseArchive!2024" \
      --output archive_confidentielle.tar.gz.gpg

# Déchiffrer et extraire
gpg --decrypt \
    --batch \
    --passphrase "MotDePasseArchive!2024" \
    archive_confidentielle.tar.gz.gpg | \
  tar -xzf - -C /tmp/

ls /tmp/root/tp_crypto/dossier_confidentiel/ 2>/dev/null || \
ls /tmp/*/tp_crypto/dossier_confidentiel/ 2>/dev/null

ÉTAPE 5 — Comparaison et Réflexion (10 min)⚓︎

Bash
# TABLEAU DE COMPARAISON FINAL
echo "====== COMPARAISON OPENSSL vs GPG ======"
echo ""
echo "Fichier original :"
ls -lh secret.txt

echo ""
echo "Chiffrements :"
ls -lh secret.enc secret.gpg

echo ""
echo "Vérification intégrité des restaurations :"
sha256sum secret.txt secret_restaure.txt secret_gpg_restaure.txt

Répondre aux questions suivantes (sur papier ou dans un fichier notes.txt) :

📋 Texte
QUESTIONS DE RÉFLEXION — À RENDRE
═══════════════════════════════════════════════════════════════

Q1. Observez les tailles des fichiers :
    secret.txt   : ______ octets
    secret.enc   : ______ octets
    secret.gpg   : ______ octets

    a) Pourquoi le fichier chiffré est-il légèrement PLUS GRAND ?
    _______________________________________________________________
    (Indice : padding, salt, IV, en-tête)

    b) Peut-on deviner le contenu d'un fichier
       à partir de sa taille chiffrée ?
    _______________________________________________________________

Q2. Vous avez chiffré 2 fois le même fichier avec le même
    mot de passe OpenSSL. Les 2 fichiers chiffrés sont différents.
    Pourquoi ?
    _______________________________________________________________
    (Indice : salt aléatoire, PBKDF2)

Q3. Quel est le maillon FAIBLE dans tout ce système ?
    _______________________________________________________________
    (Indice : Ce n'est pas l'algorithme AES...)

Q4. En entreprise, pour chiffrer une sauvegarde de 500 Go
    stockée sur un NAS externe, quelle commande utiliseriez-vous ?
    Rédigez-la (openssl ou gpg) :
    _______________________________________________________________

Q5. Votre collègue vous envoie un fichier chiffré avec OpenSSL.
    Comment peut-il vous communiquer le mot de passe de façon
    sécurisée ? (Listez 3 méthodes)
    1. ___________________________________________________________
    2. ___________________________________________________________
    3. ___________________________________________________________

---

## ÉTAPE 6 — Nettoyage Sécurisé (5 min)

```bash
# Supprimer de façon sécurisée les fichiers sensibles
# (simple rm ne supprime pas réellement les données sur le disque)

# Linux — Suppression sécurisée avec shred
shred -vuz secret.txt secret_restaure.txt secret_gpg_restaure.txt secret_mauvais.txt 2>/dev/null
# -v : verbose
# -u : supprimer le fichier après écrasement
# -z : écrire des zéros en dernier passage

# Alternative sans shred :
# srm (secure-delete) : apt install secure-delete
# wipe : apt install wipe

# Garder les fichiers chiffrés (c'est le but !)
ls -lh ~/tp_crypto/
echo ""
echo "Fichiers restants (chiffrés uniquement) :"
ls *.enc *.gpg *.sha256 2>/dev/null

# ─── POURQUOI shred ET PAS rm ? ───────────────────────────────
# rm supprime juste la référence (l'entrée dans la table FAT/inode)
# Les données sont TOUJOURS sur le disque jusqu'à être écrasées
# Un outil forensique (Autopsy, Sleuth Kit) peut les récupérer
# shred écrase les données avec des motifs aléatoires (3 passes par défaut)