Solution de Themask149 pour La PIN

intro crypto symétrique

18 décembre 2023

Tout d’abord, regardons ce que fait le fichier lapin.py:

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import scrypt
from Crypto.Util.number import long_to_bytes

while True:
	pin = int(input(">>> PIN code (4 digits): "))
	if 0 < pin < 9999:
		break

flag = open("flag.txt", "rb").read()
k = scrypt(long_to_bytes(pin), b"FCSC", 32, N = 2 ** 10, r = 8, p = 1)
aes = AES.new(k, AES.MODE_GCM)
c, tag = aes.encrypt_and_digest(flag)
enc = aes.nonce + c + tag
print(enc.hex())

Il prend un pin à 4 chiffres pour construire une clé. Cette clé sert à chiffrer flag.txt avec AES en mode Galois Counter Mode. Pas besoin de connaître ce mode dans les moindres détails, on peut essayer de bruteforcer la clé car il n’y a que 10000 possibilités.

N’oublions pas d’extraire correctement le nonce, le cipher text et le tag du fichier.txt et c’est parti !

from Crypto.Cipher import AES
from Crypto.Protocol.KDF import scrypt
from Crypto.Util.number import long_to_bytes

with open("output.txt", "rb") as f:
    hex_output= bytes.fromhex(f.readline().decode("utf-8")) #Attention à bien convertir notre output en bytes !
    nonce = hex_output[:16] # 16 bytes de nonce
    c= hex_output[16:-16]
    tag = hex_output[-16:] # 16 bytes de tag
    for i in range(1,10000):
        print("Pin: ",i)
        pin = i
        k = scrypt(long_to_bytes(pin), b"FCSC", 32, N = 2 ** 10, r = 8, p = 1)
        aes = AES.new(k, AES.MODE_GCM, nonce=nonce) # N'oublions pas le nonce ici !
        flag = aes.decrypt(c)
        if b"FCSC" in flag:
            print(flag)
            break

Comme on sait que le flag contient toujours FCSC, on s’arrête lorsqu’il est présent dans un de nos déchiffrements. Le programme s’arrête au PIN 6273 et nous donne le flag !