Décodeur de chaînes d’encodage

Un texte qui a traversé plusieurs encodeurs est le cas normal, pas le cas exotique : un corps JSON dans un jeton Base64, une URL dans une ligne de journal, une valeur de formulaire encodée en pourcentage puis en Base64 pour pouvoir voyager dans un en-tête. Cette page dépouille ces couches une à une, nomme la technique utilisée à chaque étape, indique son degré de confiance et ses raisons, et liste les techniques qu’elle a écartées à cette étape afin que vous puissiez la contredire. Elle s’arrête lorsque le texte ne ressemble plus à un encodage, lorsqu’elle atteint la limite d’étapes, ou lorsque l’étape suivante ramènerait un texte déjà vu. Rien n’est deviné en silence : une technique dont l’alphabet recouvre des mots ordinaires n’est jamais appliquée seule, elle est seulement proposée.
Tout le traitement se fait localement dans votre navigateur — vos données ne sont jamais envoyées à un serveur.

Vous débutez ? Les chaînes d’encodage expliquées simplement — ce qu’est une couche, pourquoi l’encodage n’est pas le chiffrement, et pourquoi l’ordre des étapes compte.
N’appliquer une couche seule que si la confiance est d’au moins :
Arrêter après
Applique la limite de couches ci-dessus d’un seul coup. Le même tableau est construit dans les deux cas, si bien que vous pouvez passer en mode étape par étape à tout moment.
Ou choisissez une technique à la main :
Cette liste est ce que la page voit dans le texte à l’instant. Les chiffrements par rotation y figurent toujours, car ils ne peuvent pas du tout être détectés ; y figure aussi tout ce qui ne devient reconnaissable qu’une fois les espaces retirés d’un texte enveloppé, marqué comme tel et jamais appliqué seul.
Cette entrée est plus longue que ce que cette page accepte d’exécuter sans demander, et l’estimation ci-dessus indique qu’elle peut prendre . Cliquez de nouveau sur Dépouiller toute la chaîne pour continuer quand même, ou raccourcissez d’abord le texte.
(saisissez ou collez d’abord quelque chose)
(la chaîne apparaîtra ici)
Qu’est-ce qu’une chaîne d’encodage, et pourquoi lui faut-il son propre décodeur ?

Une couche est un encodeur appliqué à un texte. Une chaîne en comporte deux ou plus, appliqués l’un après l’autre. Presque tous les exemples du quotidien ressemblent à ceci : quelqu’un doit placer un morceau de données binaires — une image, un jeton signé — dans un endroit qui ne transporte que du texte, il l’encode donc en Base64. Ce résultat Base64 doit ensuite voyager dans une URL, il est donc encodé en pourcentage. Cette URL entière est ensuite placée dans une ligne de journal ou un fichier de configuration, si bien que les antislashs ou les guillemets sont à leur tour échappés. Ce que vous voyez lorsque vous rencontrez le problème, c’est la couche la plus externe, et elle est illisible pour la raison simple que les couches internes sont toujours là.

Les décodeurs à usage unique ne servent pas à grand-chose ici. Un décodeur Base64 à qui l’on donne JTI2bHQlM0JiJTI2Z3QlM0JoaSUyNmx0JTNCJTJGYiUyNmd0JTNC produira une réponse parfaitement correcte, mais toujours illisible, car les échappements en pourcentage et les références de caractères sont encore par-dessus le texte que vous vouliez. Ce qu’il faut vraiment, c’est quelque chose qui décide, à chaque étape, quel encodeur retirer — et cette page rend cette décision visible.

L’encodage n’est pas le chiffrement, et cette page ne casse rien. Chaque technique de cette page est une façon publique et réversible de noter la même information. Le Base64 n’a pas de clé. L’échappement en pourcentage n’a pas de clé. Si la couche la plus interne est chiffrée, cette page décodera les couches externes et vous remettra un texte chiffré, qu’elle désignera clairement plutôt que de prétendre que c’est un résultat. Il n’y a rien ici à exécuter et rien à cacher.
Les exemples commentés de cette page

Chaque ligne ci-dessous est une entrée réelle issue du fichier de données de cette page, et la colonne centrale est ce que le dépouilleur de la page y trouve. La dernière colonne est le texte qui reste lorsqu’il s’arrête.

Ce qu’est l’entrée Couches trouvées Entrée, citée telle qu’elle arrive Restant à l’arrêt

Ces lignes sont générées par la page à partir de sa propre liste de cas et rejouées à chaque visite, si bien qu’elles ne peuvent pas diverger de ce que fait le code. L’autotest ci-dessous vérifie chacune d’elles.

Comment la page décide quelle couche retirer
  1. Regardez la forme, pas le sens. Chaque technique a une signature — un échappement en pourcentage, une suite paire de chiffres hexadécimaux, un alphabet et une longueur compatibles avec le Base64. La page liste chaque technique dont la signature correspond au texte, avec une confiance entre 0 et 1.
  2. Décodez, puis vérifiez si le résultat est du texte. Une technique ne vaut la peine d’être appliquée que si elle produit quelque chose de lisible. Chaque candidat est effectivement exécuté, et sa sortie est notée selon la proportion de caractères imprimables.
  3. N’appliquez que ce qui franchit le seuil, par ordre de confiance. Le candidat le plus confiant au-dessus de votre seuil est appliqué, et le processus recommence sur le résultat. Sous le seuil, les techniques sont listées mais non appliquées.
  4. Une règle supplémentaire ajoutée par cette page. Même lorsqu’une technique franchit le seuil, cette page ne l’appliquera pas seule à moins que le résultat soit réellement du texte lisible — les caractères de remplacement et les caractères de contrôle comptent contre elle. Sans cette règle, le mot ordinaire cafe serait décodé validement en trois octets qui ne sont imprimables qu’en Latin-1, et getUserName en huit octets de bruit. Le détecteur a raison de dire que ces chaînes correspondent à l’alphabet ; cette page décide que cette correspondance ne suffit pas. Vous pouvez encore les appliquer à la main, et la liste des candidats indique qu’elle les a écartés et pourquoi.
  5. S’arrêter, délibérément. Lorsqu’aucune technique ne franchit le seuil, lorsque le texte ne change plus, lorsque la limite d’étapes est atteinte, ou lorsque l’étape suivante ramènerait un texte déjà apparu dans cette chaîne. Ce dernier point est important : ROT13 est sa propre réciproque, donc une chaîne autorisée à le réappliquer deux fois ne se terminerait jamais.
  6. Un texte coupé est proposé, jamais appliqué. Si le texte est coupé sur plusieurs lignes, le détecteur voit des espaces, lit une prose ordinaire et ne trouve rien. La page retire donc les espaces d’une copie du texte, interroge à nouveau le détecteur, et propose ce qu’il trouve comme étape à choisir à la main. Retirer les espaces de votre texte revient à le réécrire, et cette page ne réécrit rien que vous ne lui ayez demandé de réécrire.
Ce que cette page ne fera pas
Il décode, et rien d’autre. Le texte que vous collez n’est jamais exécuté : pas d’eval, pas de new Function, pas d’injection de script, pas d’ouverture de document. Il n’est jamais envoyé nulle part : ni envoi, ni requête, ni statistique. Hormis l’emplacement publicitaire en bas de page et la rangée de boutons de partage (les deux seuls widgets tiers chargés par cette page), aucune police ni aucun script n’est récupéré d’un autre hôte. La sortie décodée est écrite dans la page sous forme de texte, si bien qu’une balise HTML issue d’une couche s’affiche comme une balise et n’est pas transformée en balise. Vous pouvez vérifier tout cela : appuyez sur Autotest, qui contrôle le code source de cette page à la recherche de ces constructions et échoue si elle en trouve une.
Ce qu’elle peut reconnaître, et ce qu’elle ne peut pas
Technique Degré de certitude, seul Le piège

Le texte cité sur cette page est rédigé pour ce site. Les alphabets Base64, Base32, Base58, Base91 et quoted-printable, ainsi que le format de bloc uuencode, sont les formats publiés ; le décodage suit ces définitions plutôt que les particularités d’un outil donné. Les vecteurs de référence des alphabets figurent sur les pages voisines, qui comportent les vecteurs de test de la RFC 4648.

Un texte coupé sur plusieurs lignes

Un bloc passé par un message électronique, un fichier PEM, un jeton dans un en-tête ou un hachage copié depuis un terminal est en général enveloppé : l’encodeur l’a coupé à une colonne fixe — 76 caractères est la convention MIME — et a inséré un saut de ligne à la fin de cette colonne. Ces sauts de ligne ne font pas partie des données. Ils existent pour qu’une longue ligne survive au transport, et tout décodeur qui lit un tel bloc est censé les ignorer.

Cette page ne les ignore pas d’elle-même, et la raison tient à la règle qu’elle applique partout ailleurs. Les espaces sont le signe unique le plus fort qu’une chaîne est de la prose et non des données — et c’est ce test qui empêche The quick brown fox jumps over the lazy dog. d’être lu comme quoi que ce soit. Un bloc enveloppé ressemble exactement à de la prose pour ce test, la page n’y trouve donc rien — et fait alors la moitié honnête du travail : elle calcule ce qu’elle trouverait si les espaces étaient retirés, liste cela dans le sélecteur manuel marqué espaces à retirer d’abord, et s’arrête là. Il est listé plutôt qu’appliqué, car retirer des espaces modifie votre texte, et cette page ne modifie le texte que lorsqu’elle peut prouver la nature de la modification. Ici elle peut prouver la nature de la modification, et refuse pourtant de la faire à votre place, car un texte avec un saut de ligne au milieu d’une valeur et un texte avec un saut de ligne entre deux champs se ressemblent de l’intérieur.

Les deux étapes lorsque la page s’arrête sur un texte coupé. Passez en Étape par étape manuelle, appuyez une fois sur Appliquer la couche suivante (cela donne à la page une chaîne à compléter, et ne change rien), puis choisissez l’entrée marquée espaces à retirer d’abord et appuyez sur Appliquer. La ligne qui en résulte indique combien de caractères d’espacement ont été retirés, et donne sa taille d’entrée comme le texte que vous avez collé ; la différence entre les deux comptages de cette ligne correspond donc exactement aux espaces retirés.

Le même raisonnement vaut pour les cas inverses. Un bloc uuencode porte une ligne begin et un caractère de longueur sur chaque ligne ; il est donc reconnaissable tel quel et est appliqué seul. Un corps quoted-printable conserve ses propres sauts de ligne souples et est décodé par son propre décodeur, qui sait qu’un = isolé en fin de ligne est une continuation et non une donnée. Lorsqu’un test de forme ne peut pas distinguer la prose des données, la page s’abstient et vous montre l’alternative au lieu de choisir à votre place.

Ce que cette page exécute, et ce qu’elle refuse

Le tableau ci-dessous est construit à partir des mêmes constantes que celles qu’applique la page, si bien qu’une ligne et un avertissement de cette page ne peuvent pas se contredire. Les deux chiffres qui surprennent les gens concernent les lignes Base58 et Base62 : ces deux techniques se convertissent par une division longue dont le coût croît avec le carré de la longueur, donc cette page ne les exécute que sur une chaîne courte et l’indique dans l’étape au lieu de paraître bloquée.

Les estimations sont volontairement pessimistes. Elles proviennent d’un banc de mesure et non de votre machine, et un navigateur de bureau est en général plusieurs fois plus rapide que le chiffre affiché.