FreeToGenerate.com

Tout se passe dans votre navigateur : rien de ce que vous collez n'est envoyé ailleurs.

Sens
Alphabet
Lire l'entrée comme

Il n'existe pas d'alphabet base58 standard. Ces deux-là emploient les mêmes 58 caractères dans des ordres différents : les mêmes octets donnent donc des textes différents, et un texte encodé avec l'un se décode avec l'autre sans la moindre erreur, en renvoyant de mauvais octets.

Les mêmes octets avec l'autre alphabet

Voilà ce qui rend les deux conventions dangereuses et pas seulement différentes :

Encodé avec l'alphabet que vous avez choisi
2NEpo7TZsLFA2wMeK
Encodé avec l'autre
p4NFofTZ1LEwpAMeK

Les deux chaînes ne contiennent que des caractères valides dans les deux alphabets. Rien dans l'une ni dans l'autre n'indique quelle convention l'a produite : un décodeur auquel on donne la mauvaise renvoie donc d'autres octets, sans signaler la moindre erreur.

Pourquoi 58 et non 62

Le base58 écarte quatre des soixante-deux lettres et chiffres : le zéro, le O majuscule, le I majuscule et le l minuscule. Ce sont les deux paires qu'une personne ne distingue pas de façon fiable dans la plupart des polices. Il n'a pas non plus de caractère de remplissage ni de retours à la ligne, car le format existe pour être recopié à la main, lu à voix haute et sélectionné d'un seul double-clic.

0 I O l

Aussi disponible en : English · Español · Português · العربية

Encoder et décoder du base58

Encodez et décodez du base58 avec l'un ou l'autre alphabet, et voyez ce qui se produit quand on les confond.

Qu'est-ce que le base58 ?

Le base58 est une façon d'écrire des données binaires sous forme de texte, comme le base64, mais conçue pour survivre à une lecture humaine. Il emploie 58 caractères au lieu de 64, et ceux qu'il écarte sont sa raison d'être : le zéro, le O majuscule, le I majuscule et le l minuscule — les deux paires que presque personne ne distingue dans une police ordinaire — ainsi que le plus et la barre oblique du base64, qui cassent dès qu'on double-clique une chaîne ou qu'on la met dans une URL.

Le résultat n'a ni remplissage, ni ponctuation, ni retours à la ligne. C'est une suite ininterrompue de lettres et de chiffres que l'on sélectionne d'un double-clic, que l'on dicte au téléphone ou que l'on recopie d'un écran sans se demander si c'était un I ou un l. C'est pourquoi les adresses Bitcoin, les empreintes IPFS et les identifiants de compte du XRP Ledger l'emploient tous.

Et c'est aussi, et voilà ce que presque aucun outil ne dit, tout sauf une norme.

Comment utiliser l'encodeur

  1. Choisissez un sens et un alphabet. Encoder transforme des octets en base58 ; décoder fait l'inverse. L'alphabet compte — voyez plus bas — et celui de Bitcoin est presque à coup sûr celui qu'il vous faut, sauf si vous travaillez avec le XRP Ledger.
  2. Saisissez ou collez votre entrée. À l'encodage vous pouvez fournir du texte ou de l'hexadécimal ; au décodage, collez la chaîne base58. Tout caractère étranger à l'alphabet choisi est refusé, et l'outil vous dit lequel c'était.
  3. Regardez le second panneau. Il montre les mêmes octets encodés avec l'autre alphabet, pour que vous constatiez vous-même à quel point les deux résultats diffèrent.

Il n'existe pas de base58 normalisé, et c'est un vrai danger

Ce qui se rapproche le plus d'une spécification est un Internet-Draft de l'IETF, draft-msporny-base58, au statut prévu « informatif ». Il a expiré le 2 octobre 2021 et n'a jamais été publié en RFC. Tout le reste relève de la convention, et les conventions divergent.

Les deux présentes ici viennent du code source des projets qui les définissent : base58.cpp de Bitcoin Core et tokens.cpp de rippled. Elles emploient exactement le même jeu de 58 caractères, et en ordonnent 23 différemment. Encodez « Hello, world » avec celui de Bitcoin et vous obtenez 2NEpo7TZsLFA2wMeK ; avec celui du XRP Ledger, p4NFofTZ1LEwpAMeK.

Cet écart est plus dangereux qu'une incompatibilité franche. Comme les deux alphabets contiennent exactement les mêmes caractères, une chaîne produite par l'un est toujours une chaîne syntaxiquement valide pour l'autre. Donnez-la à un décodeur réglé sur la mauvaise convention et vous n'obtenez pas d'erreur : vous obtenez d'autres octets, en silence. Rien dans une chaîne base58 n'indique quel alphabet l'a produite ; le format ne peut donc pas vous aider, et nous non plus : il faut le savoir.

Un symptôme visible concerne les zéros de tête. Un octet nul en début de données devient le premier caractère de l'alphabet, soit 1 pour Bitcoin et r pour le XRP Ledger. Les mêmes trois octets 00 00 01 s'écrivent donc 112 ou rrp, selon le cas.

La règle des zéros de tête, et pourquoi on la rate

Le base58, c'est de l'arithmétique : on traite l'entrée comme un unique très grand nombre et on divise à répétition par 58. Cela fonctionne parfaitement à un détail près — un nombre ne se souvient pas de ses zéros de tête. Les octets 00 AB et AB sont le même entier : un encodeur purement arithmétique produit donc la même sortie pour les deux, et la taille de vos données change au décodage.

La convention règle cela hors de l'arithmétique. Les octets nuls initiaux sont comptés avant que la division ne commence, puis rattachés ensuite à raison d'un caractère-zéro de l'alphabet chacun. C'est une règle greffée sur les mathématiques et non une conséquence de celles-ci, ce qui explique précisément qu'on l'oublie.

Bitcoin Core publie 21 vecteurs de test pour le base58, dont sept portent des octets nuls en tête — une proportion qui semble délibérée, car une implémentation ayant oublié la règle passe les quatorze autres et paraît correcte. Cet encodeur passe les 21 dans les deux sens.

Ce que cet outil ne fait pas

Il fait du base58, pas du Base58Check. Une adresse Bitcoin n'est pas du base58 brut : c'est un octet de version, la charge utile, et une somme de contrôle de quatre octets issue d'un double SHA-256, le tout encodé ensemble. C'est cette somme qui permet à un portefeuille de rejeter une adresse comportant une faute de frappe. Coller ici une adresse Bitcoin la décodera correctement en octets, mais l'outil ne vérifiera pas la somme et ne vous dira pas que l'adresse est valide : c'est un encodeur, pas un validateur d'adresses, et confondre les deux serait le choix le plus flatteur et le moins honnête.

Il n'a pas davantage d'avis sur ce que signifient vos octets. Le base58 est un transport : la sortie décodée est donc présentée en hexadécimal, et en texte seulement lorsque les octets se trouvent être de l'UTF-8 valide. Quand ils ne le sont pas, l'outil le dit plutôt que d'afficher des caractères de remplacement, car un écran de losanges à point d'interrogation laisse croire que c'était du texte abîmé, alors qu'en général ce n'était jamais du texte.

Pourquoi est-ce gratuit ?

Tout se passe dans votre navigateur. Rien de ce que vous collez n'est envoyé, journalisé ni stocké — ce qui compte ici plus qu'ailleurs, car les chaînes base58 sont souvent des clés, des adresses et des identifiants.

Pas de compte, pas d'inscription, aucune limite, et aucun filigrane sur ce que vous copiez.