TP 2 - Les Modes d’Opérations
Ce TP est issu des TPs de Pascal Lafourcarde, enseignant chercheur à l’Universtié Clermont-Auvergne.
Exerice 1 (OTP)
- Codez une fonction (
otp_encryption
) qui permet de chiffrer avec le chiffrement parfait (\(C = M \oplus K\)). Cette fonction prend en entrée une clé et un message, tous deux sous forme de binaire, et sa sortie est également une chaîne binaire.
Vous aurez peut-être l’usage de l’opérateur ∧
.
- Codez la fonction de déchiffrement correspondante (
otp_decryption
).
Exercice 2 (Openssl et Shell).
L’objectif de cet exercice est de chiffrer une image en ligne de commande (pas en Python
, donc) à l’aide des outils fournis par la librairie openssl
.
Prenez une image de votre choix et convertissez la dans le format ppm à l’aide de la commande
convert
.Avec la commande
head
, mettez les 3 premières lignes de votre fichierppm
dans un fichierheader.txt
.Avec la commande
tail
mettez tout le fichierppm
sauf les 3 premières lignes dans un fichierbody.bin
.Chiffrez avec openssl en
AES-ECB
le fichierbody.bin
.Remettez l’en-tête
header.txt
au début du fichier obtenu à la question précédente pour avoir une image chiffrée, et observez le résultat.
Exercice 3 (Modes ECB et CBC).
Dans cet exercice, vous allez utiliser la bibliothèque pycryptodome
(exécutez si nécessaire pip install pycryptodome
dans un terminal) et ses modes de chiffrement AES prédéfinis (voir https://pycryptodome.readthedocs.io/en/latest/index.html).
- Votre script pourra commencer par la ligne
from Crypto.Cipher import AES
. - Utilisez la clé
YELLOW SUBMARINE
, qui a le bon goût d’être composée de 16 caractères (= 16 octets), comme requis par AES. - Pour les trois premières questions, vous supposerez que la longueur du message clair est un multiple de 16 octets. Si ce n’est pas le cas, vous couperez les derniers caractères du message clair.
- Choisissez un message long, comportant plus de 16 caractères. Pour éviter les soucis d’encodage, limitez-vous aux caractères ASCII 7 bits (majuscules, minuscules, espaces, ponctuation, pas d’accents, etc.).
- La commande AES prend des bytes en entrée. Vous pouvez convertir un str en bytes en le faisant précéder d’un
b
(e.g.b"Hello"
). - Pour la lisibilité de l’affichage des chiffrés, vous voudrez peut-être les convertir en hexadécimal en utilisant la méthode
.hex()
.
Implémenter dans un premier temps quelques fonctions utilitaire que vous pourrez réutiliser ensuite comme par example la fonction truncated_windows
qui transforme une liste en sous-listes de taille n
.
Réalisez le mode de chiffrement AES-EBC et le déchiffrement.
Réalisez le mode de chiffrement AES-CBC et le déchiffrement. Attention à l’erreur
decrypt() cannot be called after encrypt()
.Réalisez à la main (à partir du mode ECB) le mode de chiffrement AES-CBC et le déchiffrement.
Si vous avez le temps, réalisez la fonction de padding PKCS#7 et la fonction qui ôte le padding. Le remplissage se fait par octets entiers. La valeur de chaque octet ajouté est le nombre d’octets qui sont ajoutés, c’est-à-dire que
N
octets, chacun de valeurN
, sont ajoutés. Le nombre d’octets ajoutés dépend de la limite de bloc à laquelle le message doit être étendu (pour AES, c’est 16). Autrement dit, le remplissage sera l’un des suivants :
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06 etc.