🕰️ Un peu d’histoire
Dans les années 1970, quand DES (Data Encryption Standard) a été standardisé, il fallait aussi décider comment utiliser un chiffrement par blocs pour protéger de longues séquences de données. En effet, DES (comme AES aujourd’hui) ne sait traiter qu’un bloc fixe de taille donnée (64 bits pour DES, 128 bits pour AES).
👉 Problème : nos fichiers, images ou messages sont souvent bien plus longs. On a donc inventé des modes opératoires pour “enchaîner” les blocs.
Deux approches ont marqué l’histoire :
- ECB (Electronic Code Book) : le mode naïf, simple, mais truffé de fuites.
- CBC (Cipher Block Chaining) : le mode amélioré, plus robuste, qui masque les motifs.
Le célèbre “🐧 pingouin de la honte” (image de Tux, le logo Linux, chiffrée avec ECB) est devenu l’illustration ultime de ce problème : les contours de l’animal restent visibles, preuve que la confidentialité s’évapore.
🔑 Rappel : chiffrement par bloc
Un chiffrement par bloc est une fonction :
E_k : {0,1}^n \rightarrow {0,1}^nqui, pour une clé k, prend un bloc clair de taille fixe n et produit un bloc chiffré de même taille.
Exemple : AES-128 avec n = 128 bits.
Pour un message plus long M = M_1 | M_2 | \dots | M_t découpé en blocs :
- M_i = le i-ème bloc de clair,
- C_i = le i-ème bloc de chiffré.
📒 Mode ECB : Electronic Code Book
En ECB, la règle est :
C_i = E_k(M_i)Chaque bloc est chiffré séparément, sans dépendance entre eux.
👉 Conséquences :
- Si deux blocs clairs sont identiques (M_i = M_j), leurs blocs chiffrés seront identiques (C_i = C_j).
- Donc les motifs d’une image (zones répétées de pixels) ou les structures répétitives d’un texte sont préservés.
Exemple visuel :
- Texte avec “AAAAAAA…” en clair → donnera toujours la même séquence chiffrée répétée.
- Une image chiffrée garde ses contours visibles.
⚠️ Résultat : ECB n’offre aucune confidentialité sémantique. On peut détecter la structure d’un message, même sans clé.
🔗 Mode CBC : Cipher Block Chaining
En CBC, chaque bloc est enchaîné au précédent via un XOR :
C_i = E_k(M_i \oplus C_{i-1})Avec C_0 = IV, un vecteur d’initialisation aléatoire.
👉 Conséquences :
- Chaque bloc chiffré dépend non seulement du clair M_i, mais aussi de tout l’historique des blocs précédents.
- Si deux blocs clairs sont identiques, leur chiffrement diffère à cause du lien avec C_{i-1}.
- Les motifs disparaissent : une image chiffrée en CBC devient méconnaissable.
Exemple :
- Texte “AAAAAAA…” ne produira pas une séquence répétée → les chiffrés sont différents.
🧮 Démonstration mathématique
ECB
On considère deux blocs clairs identiques M_i = M_j.
Alors :
Conclusion : motifs révélés.
CBC
Toujours avec M_i = M_j, mais cette fois :
C_i = E_k(M_i \oplus C_{i-1})
C_j = E_k(M_j \oplus C_{j-1}) = E_k(M_i \oplus C_{j-1})
Si C_{i-1} \neq C_{j-1}, alors les deux blocs chiffrés sont différents.
Conclusion : motifs brisés.
🛠️ Propriétés et sécurité
- ECB :
- ✅ Simple et rapide.
- ❌ Pas de confidentialité sémantique.
- ❌ Vulnérable aux analyses de structure.
- CBC :
- ✅ Brise les motifs, assure une meilleure confidentialité.
- ❌ Chiffrement séquentiel → pas de parallélisation facile.
- ❌ Sensible aux attaques par manipulation de blocs (padding oracle).
🧑💻 Exercice pratique
👉 Objectif : comparer visuellement ECB et CBC.
Étapes :
- Téléchargez une image simple (ex. Tux 🐧).
- Utilisez Python avec la librairie
PyCryptodome
.
from Crypto.Cipher import AES from Crypto.Random import get_random_bytes from PIL import Image import numpy as np # Chargement image img = Image.open("tux.png").convert("L") # gris data = np.array(img) # Mise en forme en blocs AES (128 bits) key = get_random_bytes(16) iv = get_random_bytes(16) # ECB cipher_ecb = AES.new(key, AES.MODE_ECB) ciphered_ecb = cipher_ecb.encrypt(data.tobytes()) # CBC cipher_cbc = AES.new(key, AES.MODE_CBC, iv=iv) ciphered_cbc = cipher_cbc.encrypt(data.tobytes())
- Reconstituez et affichez les deux images chiffrées.
- Comparez : ECB laisse voir le pingouin, CBC non.
🎯 Conclusion
- ECB = pingouin de la honte 🐧 → à bannir dans toute application sérieuse.
- CBC = un progrès, mais aujourd’hui remplacé par des modes modernes (CTR, GCM) qui offrent parallélisation et authentification.
- Leçon : le choix du mode est aussi crucial que l’algorithme lui-même.