Proceso de derivar una dirección Bitcoin desde la clave privada mediante curva elíptica y funciones hash
|

De la clave privada a tu dirección Bitcoin: hash, Base58Check, Bech32 y frase semilla

Artículo 6 de 9 de la serie «Las Matemáticas Invisibles en Bitcoin». En el artículo anterior vimos cómo se firma una transacción. Hoy contamos de dónde sale la dirección a la que se envían los fondos y cómo una lista de palabras se convierte en todas tus claves.

Una dirección Bitcoin parece una matrícula: una cadena de letras y números que alguien te da para que le envíes fondos. Pero detrás hay una cadena de transformaciones matemáticas que ya conoces, la curva elíptica y la función hash, encadenadas con un objetivo preciso: que la dirección sea corta, difícil de copiar mal y no revele más de lo necesario.

El camino completo, de un vistazo 🟢

Una dirección clásica se construye así:

  1. Clave privada d: un número aleatorio de 256 bits.
  2. Clave pública Q = d·G: un punto de la curva secp256k1 (artículos 2 y 3).
  3. SHA-256 de la clave pública, y después RIPEMD-160 del resultado. Obtenemos 20 bytes, lo que se conoce como hash160.
  4. Se añade un prefijo de versión y un código de comprobación, y se codifica en un alfabeto legible: Base58Check (direcciones que empiezan por 1) o Bech32 (direcciones que empiezan por bc1).

Cada paso es en un solo sentido. De d a Q es fácil; de Q a d, inviable. De Q al hash160 es fácil; del hash160 a Q, inviable. Es una cadena de puertas giratorias que solo se cruzan hacia delante.

Un ejemplo con números reales

En el artículo anterior usamos una curva de juguete. Aquí usamos la curva real, con un caso conocido en las especificaciones de Bitcoin. Elegimos como clave privada d = 1, por lo que la clave pública es el propio punto generador G. Advertencia importante: d = 1 es un valor de prueba conocido por todo el mundo: cualquier fondo enviado a esa dirección se lo llevaría quien lo vigile, porque su clave es de dominio público. Nunca uses claves de ejemplo para guardar dinero.

Hemos calculado cada paso con código y los resultados son estos:

PasoResultado
Clave pública comprimida0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
SHA-256 de la clave pública0f715baf5d4c2ed329785cef29e562f73488c8a2bb9dbc5700b361d54b9b0554
RIPEMD-160 de ese hash (hash160)751e76e8199196d454941c45d1b3a323f1433bd6
Código de comprobación (4 bytes)510d1634
Dirección Base58Check1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH
Dirección Bech32bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4

Observa algo: las dos direcciones contienen exactamente el mismo hash160, solo escrito de dos maneras distintas.

¿Por qué comprimida?

La clave pública es un punto (x, y), pero dada la coordenada x solo hay dos posibles y: una par y otra impar. Basta guardar x (32 bytes) y un byte que indica la paridad de y, el 02 o 03 inicial. Son 33 bytes en lugar de 65.

¿Por qué hacer un hash de la clave pública?

Podría parecer más simple publicar directamente Q. Hay dos razones para no hacerlo.

Más corta. El hash160 ocupa 20 bytes, frente a los 33 de la clave pública comprimida. Eso reduce la dirección y el tamaño de la transacción.

Más privada y, hasta cierto punto, más resistente. Mientras no gastas desde una dirección, la clave pública no está en la cadena: solo su hash. La propia descripción original de Bitcoin propone mantener anónimas las claves públicas como vía de privacidad (Nakamoto, 2008). Esto tiene una consecuencia importante que retomaremos en el artículo 8: un atacante que quisiera calcular la clave privada a partir de la pública necesitaría conocer primero esa clave pública, y esta solo se revela al gastar. Es una capa de protección que desaparece si reutilizas direcciones, y por eso no se recomienda hacerlo.

Base58Check: legibilidad y protección contra errores

El hash160 son 20 bytes, es decir, 160 bits, algo inmanejable para copiarlo a mano. Base58Check lo convierte en texto con tres decisiones de diseño:

  • Un alfabeto de 58 caracteres que elimina los símbolos fáciles de confundir: el cero (0) y la o mayúscula (O), la i mayúscula (I) y la ele minúscula (l).
  • Un prefijo de versión (el byte 00 en direcciones clásicas), que indica el tipo de dato. Es lo que hace que casi todas empiecen por 1.
  • Un código de comprobación de 4 bytes, calculado como los primeros 4 bytes del doble SHA-256 de los datos. En nuestro ejemplo es 510d1634.

Si te equivocas al copiar una letra, la comprobación falla y la cartera rechaza la dirección. La probabilidad de que un error aleatorio pase desapercibido es de 1 entre 2³², unos cuatro mil millones.

Bech32: un paso más

Con SegWit llegó un formato nuevo, definido en el BIP-173 (Wuille y Maxwell, 2017). Sus ventajas, según la especificación, son un alfabeto de 32 caracteres sin distinguir mayúsculas de minúsculas y un código detector de errores más potente que el de Base58Check. Por eso las direcciones son más cómodas de dictar o de codificar en un código QR.

Más tarde se descubrió una debilidad rara: en ciertos casos, insertar o borrar letras q antes de una p final no invalidaba la comprobación. El BIP-350 corrige el problema con Bech32m, que cambia una constante del código y se usa en las direcciones de Taproot, las que empiezan por bc1p (Wuille, 2020). Las direcciones bc1q siguen usando Bech32.

De 12 palabras a todas tus claves

Hasta aquí hemos hablado de una clave. Pero una cartera moderna gestiona cientos. ¿Cómo se respalda todo eso con un papel?

Paso 1: la frase semilla (BIP-39)

El BIP-39 (Palatinus, Rusnak, Voisine y Bowe, 2013) define cómo convertir entropía aleatoria en palabras:

  1. Se parte de entre 128 y 256 bits de entropía. Con 128 bits obtenemos 12 palabras.
  2. Se añade un checksum: los primeros ENT/32 bits del SHA-256 de la entropía. Para 128 bits son 4 bits.
  3. Se obtienen 132 bits (128 + 4), que se cortan en 12 grupos de 11 bits. Cada grupo es un número entre 0 y 2047 que elige una palabra de una lista de 2048 palabras (2¹¹).

Cuenta con calma: 12 palabras × 11 bits = 132 bits = 128 de entropía + 4 de comprobación. La última palabra incluye parte de ese checksum, por lo que no vale cualquier combinación de palabras.

Paso 2: de las palabras a la semilla

Las palabras no son la clave. Se estiran con la función PBKDF2 usando HMAC-SHA512 y 2048 rondas, con la sal «mnemonic» más una contraseña opcional. El resultado son 64 bytes: la semilla. Las 2048 rondas encarecen cada intento de fuerza bruta contra frases débiles.

Paso 3: del árbol a las claves (BIP-32)

El BIP-32 (Wuille, 2012) describe las carteras jerárquicas deterministas. A la semilla se le aplica HMAC-SHA512 con la clave «Bitcoin seed», lo que da 64 bytes: la mitad izquierda es la clave privada maestra y la derecha el código de cadena. A partir de ahí se derivan claves «hijas», «nietas» y siguientes, formando un árbol. La clave de cada nodo se obtiene con operaciones de hash y de curva que ya conoces.

Probado con el vector de prueba público de BIP-39, la frase de doce palabras abandon abandon … about da una semilla que empieza por 5eb00bbd… y una clave maestra que empieza por 1837c1be…. Como en el caso de d = 1, es un ejemplo de prueba: nunca uses esa frase para guardar fondos.

Lo que esto significa en la práctica

Toda tu cartera, con todas sus direcciones pasadas y futuras, se reconstruye a partir de esas palabras. Quien las tenga controla los fondos, y quien las pierda sin copia los pierde. La seguridad del esquema es la de los 128 bits de entropía: probar todas las combinaciones es inviable, siempre que las palabras se hayan generado de forma realmente aleatoria y no las hayas elegido tú.

Tres errores frecuentes

Elegir las palabras a mano. Una frase «memorable» tiene mucha menos entropía que una aleatoria. La cartera debe generarla.

Guardar la frase en un archivo, una foto o la nube. Cualquiera que acceda a ese archivo tiene todos tus fondos. El respaldo vive sin conexión.

Creer que la dirección es la clave. La dirección es un hash público y se puede compartir. Lo que debe protegerse es la clave privada, o la frase que la genera.

Compruébalo tú mismo

Las cifras de este artículo (la clave pública, el hash160, las direcciones Base58Check y Bech32, y la semilla de la frase de prueba) se han calculado con un pequeño programa en Python. Puedes descargarlo y ejecutarlo en tu ordenador para obtener los mismos números. No necesita instalar nada ni toca dinero real.

Descargar el código (.zip)  Programa de este artículo: direccion_bitcoin.py

Falsadores de este artículo

  • F1. Si se publica un algoritmo que obtenga una clave pública a partir de su hash160 con un coste muy inferior a la fuerza bruta (del orden de 2¹⁶⁰ operaciones), la protección del hash queda en entredicho.
  • F2. Si el ejemplo de este artículo no se reproduce, el artículo es incorrecto.
  • F3. Si se demuestra una forma de recuperar la entropía de una frase BIP-39 de 12 palabras generada aleatoriamente con menos trabajo que 2¹²⁸ (salvo la contraseña opcional), la afirmación sobre su seguridad cae.
De la frase semilla de 12 palabras a las claves de una cartera jerárquica

Conclusión

Una dirección Bitcoin es el final de una cadena de funciones de un solo sentido: clave privada, punto de curva, doble hash, comprobación de errores y codificación legible. Y una frase de doce palabras es el principio de otra cadena que genera todo el árbol de claves. En el próximo artículo dejamos a las personas y miramos a la red: cómo la prueba de trabajo y los árboles de Merkle ponen a todos de acuerdo sobre qué transacciones valen.

Si quieres profundizar con lecturas en español, en nuestra librería Bitcoin hay una selección curada de libros sobre Bitcoin y criptografía, pensada como educación Bitcoin y contenido para bitcoiners. (Los enlaces a libros de Amazon se indicarán como enlaces de afiliado.)

Preguntas frecuentes

¿Cómo se genera una dirección Bitcoin?

A partir de una clave privada se calcula la clave pública en la curva secp256k1; se le aplica SHA-256 y RIPEMD-160 para obtener 20 bytes (hash160) y se codifica con Base58Check o Bech32, que añaden un código de comprobación de errores.

¿Por qué se hace un hash de la clave pública?

Acorta la dirección y mantiene la clave pública fuera de la cadena hasta que se gasta desde ella, lo que añade una capa de privacidad y de protección.

¿Qué es una frase semilla de 12 palabras?

Es una representación legible de 128 bits de entropía más 4 de checksum (BIP-39). Se transforma con PBKDF2 en una semilla de 64 bytes de la que se derivan todas las claves de la cartera (BIP-32).

¿Cuál es la diferencia entre Bech32 y Base58Check?

Base58Check usa 58 caracteres y comprobación con doble SHA-256 (direcciones que empiezan por 1). Bech32 (BIP-173) usa 32 caracteres sin distinguir mayúsculas y un código detector de errores más potente (direcciones bc1q). Bech32m (BIP-350) se usa para Taproot (bc1p).

Referencias

Nota de transparencia: este artículo ha sido elaborado con la asistencia de un asistente de escritura (Claude). Los valores del ejemplo han sido calculados con código; las citas y enlaces deben ser validados por Kiko Tsuki antes de publicar.

Siguiente: Prueba de trabajo y árboles de Merkle: la matemática que pone de acuerdo a la red Bitcoin

Ver la serie completa

Valor por valor: ¿te ha servido esta serie?

En Nakamotobook el contenido es de acceso libre, sin muros de pago. Si lo que has leído te ha aportado valor, puedes devolverlo como creas justo con unos sats por Lightning. Es voluntario y sin contrapartida: no desbloquea contenido ni es una compra.

Dirección Lightning: Tomyy@coinos.io

Escanea el código QR con tu cartera Lightning o copia la dirección. Comprueba siempre que coincide con la de arriba antes de enviar.

Código QR de la dirección Lightning Tomyy@coinos.io para donar valor por valor a Nakamotobook

Compartir el artículo, comentarlo o corregirnos un error también es valor. Las donaciones no constituyen asesoramiento financiero ni una inversión.

Kiko Tsuki es escritor de ciencia ficción y editor de una revista digital centrada en Bitcoin y la cultura libertaria. En sus textos explora cómo la tecnología descentralizada transforma la vida cotidiana y la relación de las personas con el poder. Cree en una futura Holocracia.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Información básica sobre protección de datos
ResponsableNakamotobook +info...
FinalidadManage and moderate your comments. +info...
LegitimaciónConsentimiento del interesado. +info...
DestinatariosAutomattic Inc., EEUU para filtrar el spam. +info...
DerechosAcceder, rectificar y cancelar los datos, así como otros derechos. +info...
Información adicionalPuedes consultar la información adicional y detallada sobre protección de datos en nuestra página de política de privacidad.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.