FreeToGenerate.com

Funciona por completo en tu navegador: nada de lo que pegues se sube a ningún sitio.

Dirección
Alfabeto
Leer la entrada como

No existe un alfabeto base58 estándar. Estos dos usan los mismos 58 caracteres en órdenes distintos, así que los mismos bytes dan textos distintos, y un texto codificado con uno se descodifica con el otro sin error alguno y devuelve bytes equivocados.

Los mismos bytes con el otro alfabeto

Esto es lo que hace que las dos convenciones sean peligrosas y no solo distintas:

Codificado con el alfabeto que elegiste
2NEpo7TZsLFA2wMeK
Codificado con el otro
p4NFofTZ1LEwpAMeK

Ambas cadenas están formadas solo por caracteres válidos en los dos alfabetos. Nada en ninguna de las dos indica qué convención la produjo, así que un descodificador al que le des la equivocada devuelve otros bytes y no informa de ningún error.

Por qué 58 y no 62

Base58 deja fuera cuatro de las sesenta y dos letras y cifras: el cero, la O mayúscula, la I mayúscula y la ele minúscula. Son las dos parejas que una persona no distingue con fiabilidad en la mayoría de las tipografías. Tampoco tiene carácter de relleno ni saltos de línea, porque el formato existe para copiarse a mano, leerse en voz alta y seleccionarse de una sola vez con doble clic.

0 I O l

También disponible en: English · Português · Français · العربية

Codificar y descodificar base58

Codifica y descodifica base58 con cualquiera de los dos alfabetos, y mira qué pasa cuando se confunden.

¿Qué es base58?

Base58 es una forma de escribir datos binarios como texto, igual que base64, pero pensada para sobrevivir a que la lea una persona. Usa 58 caracteres en vez de 64, y los que descarta son la razón de que exista: el cero, la O mayúscula, la I mayúscula y la ele minúscula —las dos parejas que casi nadie distingue en una tipografía corriente— junto con el más y la barra que usa base64 y que se rompen al hacer doble clic o al meter la cadena en una URL.

El resultado no tiene relleno, ni puntuación, ni saltos de línea. Es una tirada ininterrumpida de letras y cifras que puedes seleccionar con un doble clic, leer por teléfono o copiar de una pantalla sin preguntarte si aquello era una I o una ele. Por eso las direcciones de Bitcoin, los hashes de IPFS y los identificadores de cuenta del XRP Ledger lo usan todos.

Y también, y esto es lo que casi ninguna herramienta te cuenta, no es un estándar.

Cómo usar el codificador

  1. Elige dirección y alfabeto. Codificar convierte bytes en base58; descodificar hace lo contrario. El alfabeto importa —mira más abajo— y el de Bitcoin es casi con toda seguridad el que quieres, salvo que trabajes con el XRP Ledger.
  2. Escribe o pega tu entrada. Al codificar puedes meter texto normal o hex; al descodificar, pega la cadena base58. Cualquier carácter fuera del alfabeto elegido se rechaza, y la herramienta te dice cuál era.
  3. Mira el segundo panel. Muestra los mismos bytes codificados con el otro alfabeto, para que veas por ti mismo lo distintos que salen los dos resultados.

No hay un base58 estándar, y eso es un peligro real

Lo más parecido a una especificación es un borrador de internet del IETF, draft-msporny-base58, con estado previsto «informativo». Caducó el 2 de octubre de 2021 y nunca llegó a publicarse como RFC. Todo lo demás es convención, y las convenciones no coinciden.

Las dos de esta herramienta salen del código fuente de los proyectos que las definen: base58.cpp de Bitcoin Core y tokens.cpp de rippled. Usan exactamente el mismo conjunto de 58 caracteres, y ordenan 23 de esos 58 de otra manera. Codifica «Hello, world» con el de Bitcoin y obtienes 2NEpo7TZsLFA2wMeK; con el del XRP Ledger, p4NFofTZ1LEwpAMeK.

Esa diferencia es más peligrosa que una incompatibilidad declarada. Como ambos alfabetos contienen exactamente los mismos caracteres, una cadena producida por uno siempre es una cadena sintácticamente válida para el otro. Dásela a un descodificador puesto en la convención equivocada y no obtienes un error: obtienes otros bytes, en silencio. Nada dentro de una cadena base58 indica qué alfabeto la creó, así que el formato no puede ayudarte y nosotros tampoco; tienes que saberlo.

Un síntoma visible es lo que pasa con los ceros iniciales. Un byte cero al principio se convierte en el primer carácter del alfabeto, que es el 1 en Bitcoin y la r en el XRP Ledger. Así que los mismos tres bytes 00 00 01 se escriben 112 o rrp, según cuál uses.

La regla de los ceros iniciales, y por qué se falla

Base58 es aritmética: trata la entrada como un único número enorme y divide repetidamente entre 58. Eso funciona perfectamente salvo por una cosa: un número no recuerda sus ceros a la izquierda. Los bytes 00 AB y AB son el mismo entero, así que un codificador puramente aritmético produce la misma salida para ambos, y el tamaño de tus datos cambia al descodificar.

La convención resuelve esto fuera de la aritmética. Los bytes cero iniciales se cuentan antes de empezar a dividir y se vuelven a pegar después, uno por cada carácter-cero del alfabeto. Es una regla añadida a las matemáticas, no una consecuencia de ellas, y por eso mismo se olvida.

Bitcoin Core publica 21 vectores de prueba para base58, y siete de ellos llevan bytes cero iniciales: una proporción que parece deliberada, porque una implementación que olvide la regla pasa los otros catorce y aparenta estar bien. Este codificador pasa los 21 en ambos sentidos.

Lo que esta herramienta no hace

Hace base58, no Base58Check. Las direcciones de Bitcoin no son base58 en crudo: son un byte de versión, la carga útil y una suma de comprobación de cuatro bytes hecha con un doble SHA-256, todo codificado junto. Esa suma es lo que permite a una cartera rechazar una dirección con una errata. Si pegas aquí una dirección de Bitcoin se descodificará correctamente a bytes, pero la herramienta no verificará la suma ni te dirá que la dirección es válida: es un codificador, no un validador de direcciones, y confundir ambas cosas sería la opción más vistosa y menos honesta.

Tampoco opina sobre lo que significan tus bytes. Base58 es un transporte, así que la salida descodificada se muestra en hex, y como texto solo cuando los bytes resultan ser UTF-8 válido. Cuando no lo son, la herramienta lo dice en vez de enseñar caracteres de reemplazo, porque una pantalla llena de rombos con interrogación da a entender que aquello era texto y se estropeó, cuando normalmente nunca fue texto.

¿Por qué es gratis?

Todo ocurre en tu navegador. Nada de lo que pegas se sube, se registra ni se guarda, algo que aquí importa más que en la mayoría de las páginas, porque las cadenas base58 suelen ser claves, direcciones e identificadores.

Sin cuenta, sin registro, sin límite y sin marca de agua en nada de lo que copies.