Aléatoire
Catégorie: Crypto Difficulté: - Flag: CTFREI{R4nd0M_15_S0meT1mE5_DaNG3RouS}
Challenge
Description
Après quelques cours de cryptographie, j'ai construit mon propre outil de chiffrement !
Il est très robuste, puisqu'il utilise de l'aléatoire. Impossible à casser !
Créé le 17/09/2024 à 14h08 et 40sec, ce flag est introuvable sans ma clé : f56198966a0baf45fb4a5d9e823d831604363e0d04ce8d9b5e697dce571beddbb7e9cf486a6b881a018065a82a46735ee388dc0e0525f7767036e0acfcc2b65d
Solution
Dans le fichier app.py
à la ligne 8
, on voit que la seed de l'aléatoire est l'heure du lancement du script.
random.seed(int(datetime.now().timestamp()))
Or, on connaît cette information, il suffit donc de relancer le script avec la bonne seed. Il ne faut cependant pas oublier que la date donnée dans la description est à GMT, sauf que par défaut, datetime
utilise la timezone locale. De mon côté mon PC est en GMT+2, j'ai donc simplement à soustraire 2H.
created_at = datetime(2024, 9, 17, 14, 8, 40, 0) - timedelta(hours=-2)
seed = int(created_at.timestamp())
Voici le script complet
import random
from datetime import datetime, timedelta
from Crypto.Cipher import AES # PyCryptodome
from Crypto.Util.Padding import pad, unpad
BLOCK_SIZE = 32
def get_random_bytes(size):
bytes_array = bytearray(random.getrandbits(8) for _ in range(size))
return bytes_array
def decrypt(key, to_decrypt):
aes = AES.new(key, AES.MODE_ECB)
decipher = aes.decrypt(bytes.fromhex(to_decrypt))
return unpad(decipher, BLOCK_SIZE)
encrypted = 'f56198966a0baf45fb4a5d9e823d831604363e0d04ce8d9b5e697dce571beddbb7e9cf486a6b881a018065a82a46735ee388dc0e0525f7767036e0acfcc2b65d'
created_at = datetime(2024, 9, 17, 14, 8, 40, 0) - timedelta(hours=-2)
seed = int(created_at.timestamp())
random.seed(seed)
key = get_random_bytes(16)
print(decrypt(key, encrypted).decode())
# CTFREI{R4nd0M_15_S0meT1mE5_DaNG3RouS}
Dernière mise à jour
Cet article vous a-t-il été utile ?