Sup3r S3cr3t

Flag: StarHack{H4H4H4_Supp333r_S33cr333333t_A3S_CTR}

Challenge

Description


Montre-moi ce que tu peux faire sans le nonce!

Solution

Voici le fonctionnement du mode CTR :

Prenons le bloc 1, on connaît le ciphertext (ce sont les 16 premiers octets du fichier flag.png.enc). On connaît également le plaintext, puisque le fichier chiffré est un PNG, il suffit de prendre un autre fichier PNG valide et récupérer ses 16 premiers octets (c'est-à-dire son entête) parce que ça ne change jamais.

De là, on peut faire un XOR entre les deux pour obtenir le résultat de l'AES sur le nonce. Comme on a le secret, on peut donc le déchiffrer et connaître le nonce utilisé.

Il suffit maintenant de lancer un déchiffrement en mode CTR avec le nonce obtenu !

from Crypto.Cipher import AES
from PIL import Image
from io import BytesIO

# Fichier chiffré
with open('flag.png.enc', 'rb') as f:
  encrypted_flag = f.read()

# Fichier sample, un random png
with open('sample.png', 'rb') as f:
  sample = f.read()

# XOR des 16 premiers octets des deux fichiers
encrypted_nonce = bytes([sample[i] ^ encrypted_flag[i] for i in range(16)])

# Déchiffrement du nonce (il fait 8 octets)
nonce = AES.new(b'sup3rrr s3cr3ttt', AES.MODE_ECB).decrypt(encrypted_nonce)[:8]

# Déchiffrement CTR avec le nonce
raw_img = AES.new(b'sup3rrr s3cr3ttt', AES.MODE_CTR, nonce=nonce).decrypt(encrypted_flag)

# Affichage du flag déchiffré
Image.open(BytesIO(raw_img)).show()

Dernière mise à jour

Cet article vous a-t-il été utile ?