Le but de ce TP est de mettre en oeuvre une attaque par oracle de bourrage (padding oracle) simplifiée.
1. Oracle de bourrage
NB: vous pouvez choisir le langage de programmation de votre choix pour les preuves de concepts. Les exemples et les fichiers fournis seront en python.
1.1. Chiffrement AES-CBC
Le script aescbc.py
vous est fourni. Celui-ci est paramétré par un fichier compagnon
params.py
. Il admet les paramètres d’appel suivants
aescbc.py <message> affiche le chiffrement du message (en hexadécimal) aescbc.py -d <hexa> déchiffre le message donné en hexadécimal
- Ubuntu 20.04
-
Pour utiliser le script
aescbc.py
, il faut installerpython3-crypto
si cette dépendance n’est pas déjà satisfaite; avec ces paramètres d’exemple. - Ubuntu 22.04
-
Pour utiliser le script
aescbc.2204.py
, il faut installerpython3-cryptography
si cette dépendance n’est pas déjà satisfaite; avec ces paramètres d’exemple.
1.2. Utilisation et Oracle
Créer, ou générer, votre propre fichier params.py
et utiliser le script pour chiffrer et déchiffrer des messages.
Ecrire
- une fonction
bourrage_ok(data)
qui détermine si le message (en binaire)data
respecte le bourrage PKCS7. - une fonction
oracle(chiffré)
qui détermine sichiffré
correspond à des données chiffrées valides du point de vue bourrage PKCS7.
1.3. Preuve de Concept
Ecrire le code poc-aescbc.py
qui permet de déchiffrer un message
passé en paramètre, en ayant accès uniquement à l’oracle de
bourrage. Cela signifie que vous pouvez utiliser, en boîte noire,
aescbc.py
via l’appel oracle(chiffré)
, mais pas en appelant
directement la fonction dechiffre(..)
.
Appliquer (avec le fichier params.py
fourni) au message
50a1c50e3e770aa0daede3b009f0b0f066f6ff3f9c0097375d1e72a53bab7a50c08515cb25bf68f75c7a3ac2a1f1a6c0e52dff7685f467a5ce61e33afee3f445
et (avec le fichier params2204.py
fourni)
674141414141426a665066436a74505158484c4664624774476a30737a744d42556a6e4f3467765756613674784a7a2d3752436c48414f4378463651584e74734a4d62525a62353367507a33455737554572666c436841484b46484a6379594d52587452493168654e44305052345f4266356965745157496434343641645f56795f5364745069425958613566566c506e5f5474534f306a5875704f416e67446a4f4f33613178574853307367646564637a4a7a784e773d
Indication pour trouver le dernier octet du dernier bloc
On va chercher P sous la forme ??...?1
. Montrer qu’alors on peut chercher le X correspondant sous la forme 00...0?
.
Expliquer pourquoi il existe un (et un seul) X de cette forme qui fera répondre oui à l’oracle.
En déduire une méthode qui utilisera la recherche exhaustive pour X pour en déduire le dernier octet du dernier bloc.