Updated Modifié

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 installer python3-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 installer python3-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 si chiffré 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.