- Python 100%
| images | ||
| aes_cbc.py | ||
| aes_ecb.py | ||
| pinguin.py | ||
| README.md | ||
TD2 — AES en pratique
Nom : Mathieu Cortes
Sujet : Chiffrement symétrique — AES, ECB, CBC, padding PKCS7 et XOR
Exercices sur papier
Exercice 1 — Conversions décimal / hexadécimal
Sous-partie A — Conversions
Conversion décimal vers hexadécimal
| Décimal | Hexadécimal |
|---|---|
| 65 | 41 |
| 200 | C8 |
| 255 | FF |
| 16 | 10 |
Conversion hexadécimal vers décimal
| Hexadécimal | Décimal |
|---|---|
4A |
74 |
FF |
255 |
1F |
31 |
B0 |
176 |
Sous-partie B — Encodage ASCII
| Mot | Encodage hexadécimal ASCII |
|---|---|
AES |
41 45 53 |
Crypto |
43 72 79 70 74 6F |
Hello! |
48 65 6C 6C 6F 21 |
Sous-partie C — XOR sur octets
| Calcul | Résultat | Remarque |
|---|---|---|
FF ⊕ 0F |
F0 |
11111111 ⊕ 00001111 = 11110000 |
A5 ⊕ A5 |
00 |
Un octet XOR lui-même donne toujours 00. |
41 ⊕ 20 |
61 |
41 vaut A, 20 vaut espace, et 61 représente a en ASCII. |
42 ⊕ 0F |
4D |
4D représente M en ASCII. |
Exercice 2 — Sentir AES : un round complet à la main
Texte utilisé : BONJOUR LES AMIS.
Question 1 — Construire la matrice d’état
Encodage ASCII hexadécimal du texte :
text : 42 4F 4E 4A 4F 55 52 20 4C 45 53 20 41 4D 49 53
AES remplit la matrice colonne par colonne :
| col 0 | col 1 | col 2 | col 3 |
|---|---|---|---|
42 |
4F |
4C |
41 |
4F |
55 |
45 |
4D |
4E |
52 |
53 |
49 |
4A |
20 |
20 |
53 |
Question 2 — AddRoundKey
La sous-clé est composée de 0F partout. On effectue donc un XOR position par position.
| col 0 | col 1 | col 2 | col 3 |
|---|---|---|---|
4D |
40 |
43 |
4E |
40 |
5A |
4A |
42 |
41 |
5D |
5C |
46 |
45 |
2F |
2F |
5C |
Question 3 — SubBytes
Chaque octet est remplacé par sa valeur dans la S-Box AES.
| col 0 | col 1 | col 2 | col 3 |
| E3 | 09 | 1A | 2F |
| 09 | BE | D6 | 2C |
| 83 | 4C | 4A | 5A |
| 6E | 15 | 15 | 4A |
Question 4 — ShiftRows
On décale les lignes vers la gauche : ligne 0 pas de décalage, ligne 1 décalage de 1, ligne 2 décalage de 2, ligne 3 décalage de 3.
| col 0 | col 1 | col 2 | col 3 |
| E3 | 09 | 1A | 2F |
| BE | D6 | 2C | 09 |
| 4A | 5A | 83 | 4C |
| 4A | 6E | 15 | 15 |
Question 5 — MixColumns
MixColumns sert à diffuser l’information à l’intérieur de chaque colonne. Après cette étape, chaque octet de sortie dépend des 4 octets de la colonne d’entrée. Cela permet d’éviter qu’une petite modification reste localisée dans un seul octet.
Question 6 — Pourquoi 10 rounds ?
Après un seul round, si on change un bit du message d’entrée, seuls quelques octets de sortie sont affectés. Après deux rounds, grâce à ShiftRows et MixColumns, la modification commence à se propager dans toute la matrice. Après 10 rounds, l’effet d’avalanche est beaucoup plus fort : une petite modification du message clair produit un résultat chiffré très différent.
Exercice 3 — Padding PKCS7
Question 1 — Calculer le padding
| Taille message (octets) | Octets ajoutés | Valeur des octets |
| 13 | 3 | 03 |
| 5 | 11 | 0B |
| 1 | 15 | 0F |
| 16 | 16 | 10 |
| 31 | 1 | 01 |
Question 2 — Retirer le padding
a)
text : 48 65 6C 6C 6F 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B
Le dernier octet vaut 0B, donc on retire les 11 octets de padding.
Message original : Hello.
b)
54 65 73 74 21 21 21 21 21 21 21 21 04 04 04 04
Le dernier octet vaut 04, donc on retire les 4 octets de padding.
Message original : Test!!!!!!!!.
Question 3 — Pourquoi toujours padder, même un message multiple de 16 ?
On ajoute toujours un padding afin que le déchiffrement puisse savoir sans ambiguïté quels octets doivent être retirés. Si un message faisait déjà 16 octets et qu’on n’ajoutait rien, le dernier octet du message pourrait être confondu avec une valeur de padding. Pour éviter cette ambiguïté, PKCS7 ajoute un bloc complet de 10 lorsque le message est déjà un multiple de 16 octets.
Exercice 4 — Le mode ECB est dangereux
Question 1
Si deux blocs du message clair sont identiques, alors les deux blocs chiffrés correspondants seront aussi identiques en mode ECB, car chaque bloc est chiffré indépendamment avec la même clé.
Question 2 — Le salaire de Jane
Jack gagne 105000 euros par an. Son entrée chiffrée est :
text : Q9 2D FP VX C9 IO
Avec des blocs de 2 caractères, on peut faire la correspondance suivante :
text : Ja | ck | ?? | 10 | 50 | 00 Q9 | 2D | FP | VX | C9 | IO
Le bloc FP correspond au séparateur ou à une partie commune de la structure de l’entrée. Jane a aussi un prénom de 4 lettres qui commence par Ja, donc son entrée doit commencer par Q9 ?? FP.
Parmi les candidats, l’entrée qui correspond est :
text : Q9 AX FP C9 IO IO
Le salaire de Jane est donc :
text : C9 IO IO = 50 | 00 | 00
Jane gagne donc 500000 euros par an. Le candidat correspondant est le candidat n°3.
Question 3 — Pourquoi ECB est déplorable pour les images ?
Dans une image, il existe beaucoup de zones répétitives : fond uni, contours, couleurs identiques, pixels voisins similaires. En ECB, deux blocs de pixels identiques donnent deux blocs chiffrés identiques. Le chiffrement modifie donc les couleurs, mais il conserve une partie de la structure visuelle de l’image. On peut encore reconnaître des formes ou des motifs.
Exercice 5 — Le mode CBC corrige ECB
Question 1 — Schéma CBC
text : Bloc 1 : M1 ⊕ IV ──E_K──> C1 Bloc 2 : M2 ⊕ C1 ──E_K──> C2 Bloc 3 : M3 ⊕ C2 ──E_K──> C3
Chaque bloc clair est XOR avec le bloc chiffré précédent avant d’être chiffré. Pour le premier bloc, on utilise l’IV.
Question 2 — Chiffrement CBC à la main
Données :
text : K = 5A IV = 3C Message clair = A1 B2 C3 D4
Le chiffrement simplifié est :
text : E_K(bloc) = bloc ⊕ K
Calculs :
text : C1 = A1 ⊕ 3C ⊕ 5A = C7 C2 = B2 ⊕ C7 ⊕ 5A = 2F C3 = C3 ⊕ 2F ⊕ 5A = B6 C4 = D4 ⊕ B6 ⊕ 5A = 38
Résultat :
text : C1 C2 C3 C4 = C7 2F B6 38
Question 3 — Déchiffrement CBC
Message chiffré :
text : C7 2F B6 38
On applique d’abord le déchiffrement simplifié :
text : D_K(C) = C ⊕ K
Puis on applique l’inverse de CBC :
text : M1 = D_K(C1) ⊕ IV = A1 M2 = D_K(C2) ⊕ C1 = B2 M3 = D_K(C3) ⊕ C2 = C3 M4 = D_K(C4) ⊕ C3 = D4
Message clair retrouvé :
text : A1 B2 C3 D4
Question 4 — Réflexion
Si on chiffre deux fois le même message avec la même clé mais avec des IV différents, les chiffrés obtenus ne sont pas identiques. L’IV rend le premier bloc différent, puis cette différence se propage aux blocs suivants.
Si on réutilise le même IV avec la même clé pour deux messages qui commencent par le même premier bloc, alors le premier bloc chiffré sera identique. Cela révèle une information sur les messages.
CBC corrige le problème d’ECB car les blocs ne sont plus chiffrés indépendamment : chaque bloc dépend du bloc chiffré précédent et de l’IV.
Exercice 6 — Attaque par clair connu sur XOR
Question 1 — Retrouver la clé à partir d’un clair connu
Message clair :
text : M = HELLO = 48 45 4C 4C 4F
Message chiffré :
text : C = 68 65 6C 6C 6F
Comme C = M ⊕ K, alors K = M ⊕ C.
text : 48 ⊕ 68 = 20 45 ⊕ 65 = 20 4C ⊕ 6C = 20 4C ⊕ 6C = 20 4F ⊕ 6F = 20
La clé est donc :
text : K = 20
Question 2 — Déchiffrer un nouveau message
Message intercepté :
text : 77 6F 72 6C 64
Avec la clé 20, on obtient :
text : 77 ⊕ 20 = 57 = W 6F ⊕ 20 = 4F = O 72 ⊕ 20 = 52 = R 6C ⊕ 20 = 4C = L 64 ⊕ 20 = 44 = D
Message déchiffré : WORLD.
Question 3 — Attaque à clair partiellement connu
Message chiffré :
text : 03 2D 2D 2B 2D 36 33 62 02 2D 2B 20 24
On sait que le message clair commence par Bonjour.
text : Bonjour = 42 6F 6E 6A 6F 75 72
On calcule les premiers octets de clé avec K = M ⊕ C :
text : 03 ⊕ 42 = 41 2D ⊕ 6F = 42 2D ⊕ 6E = 43 2B ⊕ 6A = 41 2D ⊕ 6F = 42 36 ⊕ 75 = 43 33 ⊕ 72 = 41
On observe la périodicité :
text : 41 42 43 41 42 43 41
La clé probable est donc :
text : 41 42 43
La longueur probable de la clé est 3 octets.
En déchiffrant tout le message avec cette clé répétée, on obtient :
text : Bonjour Alice
Question 4 — Discussion
Le chiffrement XOR avec une clé courte répétée est vulnérable, car si une partie du message clair est connue, on peut retrouver une partie de la clé. Si la clé est répétée, cette partie suffit souvent à déchiffrer tout le message.
Avec un One-Time Pad, la clé doit être aussi longue que le message, parfaitement aléatoire et utilisée une seule fois. En théorie, c’est très sûr. En pratique, c’est difficile à utiliser, car il faut générer, transmettre et protéger une clé aussi longue que chaque message.
Exercices Python
Partie 7 — AES-ECB : chiffrement texte
Les deux blocs chiffrés sont-ils identiques ? Oui.
En mode ECB, deux blocs de texte clair identiques chiffrés avec la même clé donnent deux blocs chiffrés identiques. Cela implique que le chiffrement conserve des motifs visibles dans les données : un attaquant ne peut pas lire directement le message, mais il peut repérer des répétitions, des structures ou des formes. ECB n’est donc pas adapté pour chiffrer des données structurées ou répétitives.
Partie 8 — L’effet pingouin
Ce qu’on voit sur tux_ecb.bmp
L’image est chiffrée, donc les couleurs et les pixels sont modifiés, mais on distingue encore la structure générale du pingouin. Les zones répétitives de l’image originale produisent des motifs répétitifs dans l’image chiffrée.
Ce qu’on voit sur tux_cbc.bmp
L’image paraît beaucoup plus aléatoire. On ne reconnaît plus la forme du pingouin, car les blocs identiques ne produisent plus les mêmes blocs chiffrés.
Pourquoi ECB révèle des informations
ECB chiffre chaque bloc indépendamment des autres. Ainsi, si deux blocs de pixels sont identiques dans l’image de départ, ils donnent exactement le même bloc chiffré. Les répétitions et les contours peuvent donc rester visibles.
Pourquoi CBC ne le fait pas
CBC mélange chaque bloc clair avec le bloc chiffré précédent avant le chiffrement. Même si deux blocs de départ sont identiques, leur contexte est différent, donc les blocs chiffrés obtenus sont différents. L’IV sert aussi à rendre le premier bloc non déterministe.
Partie 9 — AES-CBC : chiffrement texte
Les deux blocs chiffrés sont-ils identiques en CBC ? Non.
Avec ECB, deux blocs clairs identiques donnent deux blocs chiffrés identiques, ce qui révèle les répétitions. Avec CBC, chaque bloc dépend du bloc précédent et de l’IV : deux blocs clairs identiques peuvent donc donner deux résultats différents. CBC est donc plus sûr que ECB dans ce cas, car il masque beaucoup mieux les motifs du message.
Difficultés rencontrées
La principale difficulté était de bien distinguer le rôle des modes ECB et CBC. ECB chiffre chaque bloc séparément, ce qui explique les blocs identiques et l’effet pingouin. CBC ajoute un chaînage avec l’IV et le bloc précédent, ce qui rend le résultat moins prévisible.
Une autre difficulté était de bien appliquer le padding PKCS7 avant le chiffrement, puis de le retirer après le déchiffrement. Pour l’image BMP, il fallait aussi conserver le header original de 54 octets afin que le fichier reste ouvrable, tout en ne chiffrant que les données des pixels.