đ°ïž 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.
