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 !