TP – Chiffrer un fichier, vérifier une empreinte et constater les limites d'un mauvais mode
BTS SIO SISR 1re année – Bloc 3 – S10
Note
But. Situation : Comment garder un fichier secret, et comment être sûr qu'il n'a pas été modifié ?
Comment ce TP fonctionne. Avant de manipuler, tu écris ce que tu anticipes (« J'anticipe »). Puis tu testes et tu notes ce que tu constates. Tu comprends ce que fait chaque commande (« Je comprends »). Un bilan de compétences clôt la séance. Les manipulations se font sur des machines virtuelles de laboratoire, isolées du réseau de l'établissement. Les identifiants communs d'un TP sont des identifiants de laboratoire : ils ne se réutilisent jamais ailleurs.
Objectif
Calculer et vérifier des empreintes, chiffrer et déchiffrer un fichier avec OpenSSL et GnuPG, constater pourquoi le mode ECB est à proscrire, puis montrer qu'un chiffrement sans contrôle d'intégrité n'empêche pas la falsification.
Contraintes
- Binôme, durée : 3 h 20.
- Travaille dans la VM Debian de laboratoire, dans un dossier dédié :
mkdir -p ~/crypto && cd ~/crypto. - Les mots de passe de ce TP (
LabPass-2026) sont des identifiants de laboratoire : ils ne se réutilisent jamais ailleurs.
Partie A. Empreintes et intégrité (40 min)
Crée un fichier et calcule son empreinte :
cd ~/crypto
echo "Rapport confidentiel : budget 2027" > rapport.txt
sha256sum rapport.txt
openssl dgst -sha256 rapport.txt
md5sum rapport.txt
J'anticipe. Si tu remplaces « 2027 » par « 2028 », l'empreinte sera-t-elle presque la même ou totalement différente ? ______________________
Éléments de réponse
Totalement différente : c'est l'effet d'avalanche. Un seul caractère modifié change l'empreinte en entier.
echo "Rapport confidentiel : budget 2028" | sha256sum
sha256sum rapport.txt > SHA256SUMS
cat SHA256SUMS
sha256sum -c SHA256SUMS
echo "ajout" >> rapport.txt
sha256sum -c SHA256SUMS
Je comprends.
| Commande | Rôle |
|---|---|
sha256sum fichier |
Calcule l'empreinte SHA-256 |
sha256sum fichier > SHA256SUMS |
Enregistre l'empreinte dans un fichier de référence |
sha256sum -c SHA256SUMS |
Vérifie que chaque fichier de la liste a toujours la même empreinte |
md5sum |
Même principe avec MD5 (à ne plus utiliser pour la sécurité) |
Questions.
- Combien de caractères hexadécimaux fait une empreinte SHA-256 ? MD5 ? Combien de bits cela représente-t-il ? ______________________
- Que dit
sha256sum -cavant et après l'ajout d'une ligne ? ______________________ - Un attaquant qui remplace
rapport.txtetSHA256SUMSsera-t-il détecté ? Que faut-il changer pour que la vérification ait une valeur ? ______________________ - Où trouve-t-on l'empreinte d'une image d'installation (ISO) pour la vérifier ? Pourquoi est-ce important qu'elle vienne d'un site sûr ? ______________________
Partie B. Chiffrer un fichier avec OpenSSL et GnuPG (50 min)
B1. OpenSSL
cd ~/crypto
openssl enc -aes-256-cbc -pbkdf2 -iter 600000 -salt -in rapport.txt -out rapport.enc -pass pass:LabPass-2026
file rapport.enc
head -c 16 rapport.enc | od -c
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -in rapport.enc -pass pass:LabPass-2026
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -in rapport.enc -pass pass:mauvais
Je comprends.
| Élément | Rôle |
|---|---|
enc -aes-256-cbc |
Chiffrement AES avec une clé de 256 bits, mode CBC |
-pbkdf2 -iter 600000 |
Dérive la clé du mot de passe avec PBKDF2, 600 000 itérations (lent exprès) |
-salt |
Ajoute un sel aléatoire (la sortie commence par Salted__) |
-pass pass:… |
Mot de passe donné en ligne (à éviter hors laboratoire : il reste dans l'historique et la liste des processus) |
-d |
Déchiffre |
Questions.
- Que contiennent les 16 premiers octets du fichier chiffré ? Pourquoi le sel n'est-il pas secret ? ______________________
- Que se passe-t-il avec un mauvais mot de passe ? ______________________
- Chiffre deux fois le même fichier avec le même mot de passe et compare les deux fichiers (
cmp,sha256sum). Sont-ils identiques ? Pourquoi ? ______________________ - Pourquoi ne faut-il pas écrire un mot de passe réel avec
-pass pass:? Quelle option utiliser à la place ? ______________________
B2. GnuPG
gpg --batch --yes --pinentry-mode loopback --passphrase 'LabPass-2026' --symmetric --cipher-algo AES256 -o rapport.gpg rapport.txt
gpg --batch --list-packets rapport.gpg
gpg --batch --pinentry-mode loopback --passphrase 'LabPass-2026' -d rapport.gpg
Note
Un message d'erreur de l'agent peut apparaître avec --list-packets : il est sans importance, tu lis seulement la description des paquets (algorithme, dérivation de clé).
- Quel algorithme GnuPG a-t-il utilisé ? Quel mode de dérivation de clé ? (indice :
--list-packets) ______________________ - Compare OpenSSL et GnuPG : quel format est le plus répandu pour échanger un fichier chiffré avec un tiers ? ______________________
Partie C. Pourquoi le mode ECB est à proscrire (40 min)
On chiffre un texte fait de blocs identiques avec les modes ECB et CBC (clé et IV de laboratoire).
cd ~/crypto
python3 -c "print('A'*16*4 + 'B'*16*2, end='')" > blocs.txt
wc -c blocs.txt
K=00112233445566778899aabbccddeeff
IV=000102030405060708090a0b0c0d0e0f
openssl enc -aes-128-ecb -K $K -in blocs.txt -out ecb.bin
openssl enc -aes-128-cbc -K $K -iv $IV -in blocs.txt -out cbc.bin
od -v -An -tx1 -w16 ecb.bin
echo
od -v -An -tx1 -w16 cbc.bin
J'anticipe. Le fichier contient 4 blocs de « A » puis 2 blocs de « B » (16 octets chacun). Que verras-tu dans les sorties ECB et CBC ? ______________________
Éléments de réponse
En ECB, les quatre premiers blocs chiffrés sont identiques et les deux suivants aussi : la structure du clair est visible. En CBC, chaque bloc chiffré est différent, car il dépend du précédent.
Je comprends.
| Élément | Rôle |
|---|---|
-K |
Clé en hexadécimal (ici 128 bits) ; on la donne directement, sans dérivation |
-iv |
Vecteur d'initialisation de 128 bits (CBC) |
od -v -An -tx1 -w16 |
Affiche les octets en hexadécimal, 16 par ligne (un bloc par ligne), sans abréger les lignes répétées |
Questions.
- Combien de blocs identiques observes-tu en ECB ? En CBC ? ______________________
- Pourquoi cette fuite d'information est-elle grave pour un fichier réel (une image, une base de données) ? ______________________
- Pourquoi le IV doit-il être différent à chaque chiffrement alors qu'il n'est pas secret ? ______________________
Partie D. Falsifier un fichier chiffré, puis le protéger (50 min)
D1. Un attaquant modifie le fichier chiffré
On modifie un seul bit du fichier rapport.enc (octet 20, dans le premier bloc) :
cd ~/crypto
cp rapport.enc falsifie.enc
python3 - <<'PY'
b = bytearray(open('falsifie.enc', 'rb').read())
b[20] ^= 1
open('falsifie.enc', 'wb').write(b)
PY
openssl enc -d -aes-256-cbc -pbkdf2 -iter 600000 -in falsifie.enc -pass pass:LabPass-2026 | od -c
J'anticipe. OpenSSL va-t-il signaler une erreur ? Le texte déchiffré sera-t-il identique, illisible, ou en partie modifié ? ______________________
Éléments de réponse
Pas d'erreur (le remplissage final reste valide). Le premier bloc est devenu illisible, et le bloc suivant est identique au clair sauf un bit : un caractère est changé de façon prévisible. Le déchiffrement ne détecte rien : CBC ne contrôle pas l'intégrité.
- Quel caractère du texte a changé dans le deuxième bloc ? Quel est le danger si le fichier est un virement ou un fichier de configuration ? ______________________
D2. Ajouter un HMAC
On calcule un HMAC du fichier chiffré avec une clé secrète différente de celle du chiffrement :
cd ~/crypto
CLE_HMAC=LabHmac-2026
openssl dgst -sha256 -hmac "$CLE_HMAC" rapport.enc | tee rapport.hmac
openssl dgst -sha256 -hmac "$CLE_HMAC" rapport.enc
openssl dgst -sha256 -hmac "$CLE_HMAC" falsifie.enc
openssl dgst -sha256 rapport.enc
- Les HMAC de
rapport.encet defalsifie.encsont-ils identiques ? Que conclut le destinataire ? ______________________ - Un attaquant qui modifie le fichier peut-il recalculer un HMAC valide ? Pourquoi ? ______________________
- Pourquoi utilise-t-on deux clés différentes (chiffrement et HMAC) ? ______________________
- Quel mode d'AES réalise le chiffrement et l'authentification en une seule opération ? Où est-il utilisé ? ______________________
Synthèse
Complète le tableau :
| Besoin | Outil du TP | Limite constatée |
|---|---|---|
| Confidentialité | ||
| Intégrité simple | ||
| Intégrité + authenticité (clé partagée) |
Retour en entreprise
Si ta situation le permet : observe comment ton entreprise traite ce sujet, note en quelques lignes l'écart avec le TP, et, avec l'accord de ton tuteur, réalise une partie sur une situation réelle. Anonymise tes captures. Voir Transfert en entreprise.
Bilan de la séance
Remplis ce bilan seul, honnêtement : il sert à décider ce qu'il faut reprendre. Niveau : Non maîtrisé, Maîtrise partielle, Bonne maîtrise ou Excellente maîtrise (le vocabulaire des grilles nationales d'évaluation) ; Non évalué si tu n'as pas travaillé la compétence aujourd'hui.
| Compétence du référentiel | Ce que j'ai fait dans cette séance | Niveau |
|---|---|---|
| B3.2 – Préserver l'identité numérique de l'organisation | ||
| B3.4 – Garantir la disponibilité, l'intégrité et la confidentialité des services informatiques et des données de l'organisation face à des cyberattaques | ||
| B3.5A – Assurer la cybersécurité d'une infrastructure réseau, d'un système, d'un service |
Note
Les codes sont ceux du référentiel (l'arrêté numérote des activités : les codes « B… » sont un usage courant).
Je sais faire, sans aide :
- Calculer et comparer des empreintes SHA-256 ;
- Chiffrer et déchiffrer un fichier avec OpenSSL et GnuPG ;
- Expliquer pourquoi le mode ECB est à proscrire ;
- Expliquer pourquoi un chiffrement seul ne garantit pas l'intégrité ;
- Calculer un HMAC et dire ce qu'il apporte.
Ce que je dois reprendre : ______________________
Ma question à poser à l'enseignant : ______________________