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 flag est lu et placé dans la variable
FLAG
- Une clé
key
est tirée, elle est composée de 4 octets répétés 20 fois - Un OU Exclusif est réalisé octet par octet entre le
FLAG
etkey
- Le résultat est affiché à l’écran
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}