Table des matières
Mise en contexte
Une image JPG flag.jpg a été chiffrée à l’aide de l’algorithme de chiffrement AES en mode CTR.
L’article Wikipedia en anglais des modes de chiffrements est plutôt complet :
https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_(CTR)
On apprend que le mode de chiffrement CTR utilise :
- Une clé afin de chiffrer à l’aide de l’algorithme de chiffrement (AES ici)
- Un IV (ou nonce) qui est une valeur aléatoire choisie au début du chiffrement et incrémentée à chaque block qui est chiffré par l’algorithme de chiffrement puis XOR avec le block de clair.
Solution
On dispose de l’IV qui est nul et de la clé 00112233445566778899aabbccddeeff.
On se réfère à https://pycryptodome.readthedocs.io/en/latest/src/cipher/classic.html#ctr-mode pour déchiffrer l’image.
from Crypto.Cipher import AES
from Crypto.Util.number import *
IV = long_to_bytes(0)
clef = bytes.fromhex("00112233445566778899aabbccddeeff")
with open('flag.jpg.enc', 'rb') as imagechiffree:
image_bytes = imagechiffree.read()
try:
chiffrement = AES.new(clef, AES.MODE_CTR, nonce=IV)
pt = chiffrement.decrypt(image_bytes)
with open('flag.jpg', 'wb') as flag:
flag.write(pt)
except (ValueError, KeyError):
print("Erreur lors du déchiffrement.")
Une superbe image de Yoda nous attend !