- Python 100%
| aes_cbc.py | ||
| aes_ecb.py | ||
| pinguin.py | ||
| Readme.md | ||
TD2 — AES en pratique — Réponses complètes
TD2 — AES en pratique (réponses)
Exercices sur papier
Exercice 1 — Conversions décimal / hexadécimal
A) Conversions : 65 = 41 200 = C8 255 = FF 16 = 10 4A = 74 FF = 255 1F = 31 B0 = 176 B) Encodage ASCII : AES = 41 45 53 Crypto = 43 72 79 70 74 6F Hello! = 48 65 6C 6C 6F 21 C) XOR sur octets : FF ⊕ 0F = F0 A5 ⊕ A5 = 00 41 ⊕ 20 = 61 42 ⊕ 0F = 4D A XOR espace donne a car XOR avec 0x20 change le bit qui fait passer une lettre majuscule en minuscule en ASCII.
Exercice 2 — Un round AES à la main sur "BONJOUR LES AMIS"
Message en ASCII : BONJOUR LES AMIS = 42 4F 4E 4A 4F 55 52 20 4C 45 53 20 41 4D 49 53
- Matrice d’état initiale (column-major) col0 : 42 4F 4E 4A col1 : 4F 55 52 20 col2 : 4C 45 53 20 col3 : 41 4D 49 53
- Après AddRoundKey (XOR avec 0F partout) col0 : 4D 40 41 45 col1 : 40 5A 5D 2F col2 : 43 4A 5C 2F col3 : 4E 42 46 5C Exemple : 42 ⊕ 0F = 4D.
- Après SubBytes (S-Box AES) col0 : E3 09 83 6E col1 : 09 BE 4C 15 col2 : 1A D6 4A 15 col3 : 2F 2C 5A 4A Exemples : 4D → E3 40 → 09 5A → BE 2F → 15
- Après ShiftRows Ligne 0 : décalage 0 Ligne 1 : décalage 1 Ligne 2 : décalage 2 Ligne 3 : décalage 3 Résultat final : col0 : E3 BE 4A 4A col1 : 09 D6 5A 6E col2 : 1A 2C 83 15 col3 : 2F 09 4C 15
- MixColumns MixColumns mélange les 4 octets de chaque colonne dans GF(2⁸) avec une matrice fixe. Chaque octet en sortie dépend des 4 octets de la colonne, ce qui donne une forte diffusion.
- Pourquoi 10 rounds ? Au début, un changement de bit dans le message ne modifie que peu d’octets. Mais à chaque round, les opérations SubBytes, ShiftRows et MixColumns propagent les changements dans tout l’état. Après 10 rounds, on obtient l’effet avalanche : changer 1 bit du clair modifie environ la moitié des bits du chiffré.
Exercice 3 — Padding PKCS7
Question 1 — Calcul du padding Si la taille du message est 13, on ajoute 3 octets de valeur 0x03. Si la taille est 5, on ajoute 11 octets de valeur 0x0B. Si la taille est 1, on ajoute 15 octets de valeur 0x0F. Si la taille est 16, on ajoute 16 octets de valeur 0x10. Si la taille est 31, on ajoute 1 octet de valeur 0x01.
Question 2 — Retirer le padding a) 48 65 6C 6C 6F 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B 0B Le dernier octet vaut 0x0B = 11, donc on retire 11 octets. Message original : Hello. b) 54 65 73 74 21 21 21 21 21 21 21 21 04 04 04 04 Le dernier octet vaut 0x04 = 4, donc on retire 4 octets. Message original : Test!!!!!!!! (12 caractères).
Question 3 — Pourquoi toujours padder même si c’est déjà un multiple de 16 ? Si on ne padde pas les messages de taille multiple de 16, on ne peut pas savoir si la fin du message correspond à un padding ou juste à des données normales. Donc on ajoute toujours un bloc complet de 0x10 pour que le dépaddage soit toujours clair et sans ambiguïté.
Exercice 4 — Le mode ECB est dangereux
Question 1 En ECB, chaque bloc est chiffré indépendamment avec la même clé. Donc deux blocs identiques en clair donnent forcément deux blocs identiques en chiffré. Cela permet de repérer des répétitions dans le message sans connaître la clé.
Question 2 — Salaire de Jane Réponse : candidat 1 (TO AV 6R FP Y5 VX C9). On retrouve les blocs FP, VX et C9 comme dans le salaire de Jack, donc cela correspond aux mêmes morceaux du texte (00, 0 , EU). Le salaire du candidat 1 est plus long, donc plus élevé, ce qui est logique puisque Jane est la patronne. Question 3 — ECB et images Dans une image, les zones uniformes produisent beaucoup de blocs identiques. En ECB, blocs identiques en clair donnent blocs identiques chiffrés, donc la forme générale de l’image reste visible. C’est pour ça que l’image chiffrée garde des contours.
Exercice 5 — Mode CBC
Question 1 — Schema P1 ──⊕──[AES_K]──> C1 ↑ ↓ IV | ↓ P2 ──⊕──[AES_K]──> C2 ↑ ↓ C1 | ↓ P3 ──⊕──[AES_K]──> C3 ↑ C2
Question 2 — Chiffrement CBC à la main K = 5A, IV = 3C, blocs : A1 B2 C3 D4 Chiffrement simplifié : AES_K(x) = x ⊕ K C1 : (A1 ⊕ 3C) = 9D puis 9D ⊕ 5A = C7 C2 : (B2 ⊕ C7) = 75 puis 75 ⊕ 5A = 2F C3 : (C3 ⊕ 2F) = EC puis EC ⊕ 5A = B6 C4 : (D4 ⊕ B6) = 62 puis 62 ⊕ 5A = 38 Chiffré final : C7 2F B6 38.
Question 3 — Déchiffrement CBC Déchiffrement simplifié : AES⁻¹_K(x) = x ⊕ K P1 : dec(C7) = C7 ⊕ 5A = 9D puis 9D ⊕ 3C = A1 P2 : dec(2F) = 2F ⊕ 5A = 75 puis 75 ⊕ C7 = B2 P3 : dec(B6) = B6 ⊕ 5A = EC puis EC ⊕ 2F = C3 P4 : dec(38) = 38 ⊕ 5A = 62 puis 62 ⊕ B6 = D4 Message récupéré : A1 B2 C3 D4.
Question 4 — Réflexion a) Non, avec un IV différent, le premier bloc change et cela change aussi tous les suivants. b) Si on réutilise le même IV avec la même clé, deux messages qui commencent pareil auront le même premier bloc chiffré. Cela révèle une partie d’information. c) En CBC, même si deux blocs clairs sont identiques, ils ne donnent pas le même chiffré car ils sont XORés avec des valeurs différentes (IV ou bloc précédent).
Exercice 6 — Attaque par clair connu sur XOR
Question 1 — Retrouver la clé M = 48 45 4C 4C 4F (HELLO) C = 68 65 6C 6C 6F K = M ⊕ C = 20 20 20 20 20 Donc la clé est 0x20. Question 2 — Déchiffrement avec K = 0x20 C' = 77 6F 72 6C 64 (world) M' = C' ⊕ 20 = 57 4F 52 4C 44 Message obtenu : WORLD.
Question 3 — Attaque avec clair partiellement connu Chiffré : 03 2D 2D 2B 2D 36 33 62 02 2D 2B 20 24 Clair connu : Bonjour = 42 6F 6E 6A 6F 75 72 a) Les 7 premiers octets de la clé sont : 03 ⊕ 42 = 41 2D ⊕ 6F = 42 2D ⊕ 6E = 43 2B ⊕ 6A = 41 2D ⊕ 6F = 42 36 ⊕ 75 = 43 33 ⊕ 72 = 41 Donc clé partielle = ABCABCA. b) On voit que ABC se répète, donc la clé fait 3 octets : ABC. c) En déchiffrant tout avec la clé ABC répétée, on obtient : Bonjour Alice.
Question 4 — Discussion a) XOR avec une clé courte est faible car la clé se répète. Dès qu’on connaît une partie du clair, on récupère la clé correspondante. Ensuite on peut retrouver la période et casser tout le message. b) Le One-Time Pad est incassable si la clé est aussi longue que le message et utilisée une seule fois. Le problème c’est que c’est impossible en pratique de partager une clé aussi longue, et surtout il ne faut jamais la réutiliser.
Exercices Python
Partie 7 — ECB et blocs identiques
Oui, les blocs chiffrés sont identiques. En ECB, deux blocs identiques en clair donnent exactement le même résultat, car le chiffrement est indépendant bloc par bloc.
Partie 8 — Effet pingouin
Dans tux_ecb.bmp, on voit encore le pingouin car les blocs identiques restent identiques après chiffrement. Dans tux_cbc.bmp, l’image ressemble à du bruit car chaque bloc dépend du précédent, donc même les zones identiques ne produisent pas les mêmes blocs chiffrés.
Partie 9 — CBC et blocs identiques
Non, en CBC les blocs chiffrés ne sont pas identiques.Le premier bloc dépend de l’IV et les suivants dépendent du bloc précédent, donc le résultat change à chaque position.
Difficultés rencontrées
La S-Box de l’exercice 2 était incomplète dans l’énoncé donc j’ai dû chercher le reste. L’exercice 4 sur le salaire de Jane était long et m’a demandé beaucoup de réflexion pour comprendre quels blocs correspondaient à quelles parties du texte. La bibliothèque cryptography était un peu compliquée au début, surtout pour comprendre le padder/unpadder et le fonctionnement encryptor/decryptor, donc j’ai dû lire la documentation.