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 ?