📾 ECB vs CBC : motifs qui fuient

đŸ•°ïž 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}^n

qui, 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 :

C_i = E_k(M_i), \quad C_j = E_k(M_j) = E_k(M_i) = C_i

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 :

  1. TĂ©lĂ©chargez une image simple (ex. Tux 🐧).
  2. 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())
  1. Reconstituez et affichez les deux images chiffrées.
  2. 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.
📾 ECB vs CBC : motifs qui fuient
Partager cet article : Twitter LinkedIn WhatsApp

đŸ–‹ïž PubliĂ© sur SecuSlice.com

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut