Solution de U03 pour Clair connu

intro crypto

10 janvier 2025

Il nous est demandé de déchiffrer le flag, pour ceci on nous fournit deux fichiers : clair-connu.py et output.txt. Nous présumons que le fichier .py est le programme ayant servi à chiffrer le flag.

Nous analysons le programme clair-connu.py :

import os
from Cryptodome.Util.number import long_to_bytes
from Cryptodome.Util.strxor import strxor

FLAG = open("flag.txt", "rb").read()

key = os.urandom(4) * 20
c = strxor(FLAG, key[:len(FLAG)])
print(c.hex())

Le chiffrement est réalisé comme ceci :

Le chiffrement par OU Exclusif (xor) a l’avantage d’être rapide, on note ici que la clé fait 4 octets, soit 32 bits, ce qui correspond à la taille de mot de la plupart des microcontrôleurs.

Si le chiffrement xor a l’avantage d’être rapide, il a l’inconvénient de ne pas être résistant à la cryptanalyse, tout particulièrement quand un texte en clair est connu. La clé fait 4 octets et nous connaissons justement les 4 premiers caractères du flag qui sont FCSC. À partir des 4 premiers caractères du flag chiffré, nous pouvons recalculer la clé et déchiffrer entièrement le flag.

Le programme est le suivant :

#!/usr/bin/python3

import os
from Cryptodome.Util.strxor import strxor

FLAG = bytes.fromhex(open("output.txt", "rb").read().decode())

key = strxor(FLAG[:4], b"FCSC")
print(f"Key: 0x{key.hex()}")

c = strxor(FLAG, (key*20)[:len(FLAG)])

print(c.decode())

Le script permettant récupérer le flag chiffré et de le déchiffrer :

#!/bin/bash

set -e

if [ ! -f output.txt ]; then
    wget https://hackropole.fr/challenges/fcsc2021-crypto-clair-connu/public/output.txt -O output.txt
fi

python3 012_Clair_connu.py

Le résultat est le suivant :

Key: 0x9f582360
FCSC{xxxxxxxx}