Attaque à texte clair connu : déduire une clé XOR répétée à partir d'un mot probable
Le défi
Un client VPN stocke son bloc de provisionnement en hexadécimal et le XOR avec une courte phrase secrète répétée qui n'est écrite nulle part. Vous ne pouvez pas déchiffrer le bloc tant que vous ne connaissez pas cette phrase, vous devez donc la déduire plutôt que la chercher. Ce dont vous disposez est un mot probable : le bloc est du JSON, et la documentation du fournisseur montre que chaque charge de provisionnement commence exactement par les douze caractères {\"vpn_user\": vous connaissez donc déjà les douze premiers octets du texte clair. XOR est sa propre réciproque et c'est là toute l'astuce. Décodez l'hexadécimal, faites un XOR des octets contre le texte que vous connaissez déjà, et lisez ce qui apparaît au début du résultat. Soumettez la phrase secrète, pas le bloc déchiffré.
Ce que tu vas apprendre
- Utiliser la propriété d'auto-inversion du XOR pour retrouver une clé plutôt qu'un texte clair
- Appliquer un mot probable à un chiffré XOR à clé répétée
- Déduire la longueur de la clé à partir de la période de la répétition retrouvée
- Repérer la limite où le mot probable s'arrête et où la sortie redevient du bruit
- Vérifier une clé retrouvée en déchiffrant le message entier
Compétences testées
Prérequis
- Comprendre que XOR est sa propre réciproque
- Être à l'aise avec l'encodage hexadécimal comme couche de transport
Comment ça marche
Tous les autres exercices XOR vous donnent la clé et vous demandent de l'appliquer. Celui-ci vous prive de la clé, ce qui transforme la question du décodage en cryptanalyse. Le point d'entrée est l'identité la plus utile de toute la cryptographie symétrique : XOR s'annule lui-même, donc si ciphertext = plaintext XOR key, alors ciphertext XOR plaintext = key.
C'est ce réarrangement qui rend le texte clair connu si dangereux. Vous n'avez pas besoin du message entier, seulement d'un fragment. Les formats structurés vous offrent ce fragment gratuitement : les charges JSON, les en-têtes de fichiers, les bannières de protocole et le texte type des e-mails commencent tous de façon prévisible. Ici, le fournisseur indique dans sa documentation que chaque bloc de provisionnement s'ouvre par {\"vpn_user\":, soit douze octets connus.
Décodez l'hexadécimal en octets bruts, puis faites un XOR avec ces douze caractères. Sur la zone connue, le texte clair s'annule et la clé apparaît. La sortie affiche Gl4c13rGl4c1 : la clé Gl4c13r, suivie de ses cinq premiers caractères répétés. Cette répétition n'est pas du bruit, c'est la mesure elle-même. Le motif recommence après sept caractères, donc la clé fait sept octets de long, et c'est précisément parce que le mot probable est plus long que la clé que celle-ci peut être retrouvée en entier plutôt qu'en partie.
Au-delà du douzième octet, la sortie se dégrade en bruit, car l'atelier continue d'appliquer votre mot probable en boucle contre du chiffré réel dont vous ne connaissiez pas le texte clair. Cette transition marque la limite de ce que vous saviez réellement. Remplacer la clé par Gl4c13r déchiffre alors le bloc entier, ce qui constitue l'étape de vérification.
Erreurs fréquentes
- Essayer de forcer la clé par force brute. Une phrase secrète alphanumérique de sept caractères représente un espace bien trop grand à deviner, et le mot probable rend cette approche inutile.
- Faire un XOR sur le texte hexadécimal au lieu des octets. From Hex doit venir en premier, sinon vous faites un XOR sur les caractères ASCII des chiffres hexadécimaux.
- Lire au-delà du mot probable. Seuls les douze premiers caractères de la sortie XOR avec le mot probable ont un sens, tout ce qui suit est du bruit par construction.
- Soumettre la répétition entière.
Gl4c13rGl4c1est la clé répétée. La clé elle-même est l'unité de sept caractèresGl4c13r. - Soumettre le bloc déchiffré. La question demande la phrase secrète, pas le JSON qu'elle déverrouille.
- Se tourner vers Vigenère. Celui-ci ne transforme que les lettres et laisserait intacts la ponctuation et les chiffres du JSON.
Comment s'en protéger
Le XOR à clé répétée est de l'obfuscation, pas du chiffrement, et un texte clair connu le démonte en une seule étape. Tout élément prévisible dans le format de vos messages devient un oracle de récupération de clé.
- Ne protégez jamais des secrets avec un XOR contre une phrase secrète statique. Utilisez un chiffrement authentifié comme AES-GCM ou ChaCha20-Poly1305.
- Dérivez les clés avec une KDF adaptée et n'intégrez jamais de phrase secrète dans un logiciel client, où elle est récupérable par définition.
- Gardez à l'esprit qu'une clé plus courte qu'un préfixe prévisible est entièrement récupérable, la longueur de la clé et la structure du message sont donc des problèmes liés.
- Pour le provisionnement en particulier, délivrez des identifiants de courte durée depuis un serveur plutôt que d'embarquer une graine longue durée dans un bloc côté client.
- Traitez une graine OTP comme équivalente au second facteur lui-même. Récupérer ce bloc met en échec le MFA qu'il était censé renforcer.