sábado, 9 de junio de 2018

Semillas, claves y direcciones

Podríamos definir una semilla como una sucesión aleatoria de 12 palabras, fáciles de apuntar y resguardar, que permiten restaurar completamente un monedero y las direcciones que éste contiene.

Por ejemplo, en el monedero Electrum podemos ver estas 12 palabras de nuestro wallet desde el menú “Cartera / Semilla”.



En este artículo trataremos de explicar de forma resumida cómo se generan estas semillas y su relación con los estándares BIP32 y BIP39.

Es importante señalar que cada monedero tiene su propia semilla y sirve para crear un monedero por primera vez o para volver a regenerarlo tantas veces como sea necesario. Si alguien consigue hacerse con nuestra semilla no tendrá mayor problema en regenerar el monedero y mover los fondos que éste contenga.

Por tanto, una semilla debe almacenarse en un lugar seguro, en papel o en un pendrive USB, fuera del ordenador en el que estemos operando (el cual se podría estropear, nos lo podrían robar…) y no debe transmitirse por Internet (ni webs, ni emails, ni chats…). 

Muchas wallets también nos pedirá que introduzcamos una contraseña pero no hay que confundir entre la semilla de un monedero y la contraseña de dicho monedero. La contraseña se usa para cifrar el monedero mientras que la semilla, tal y como se explicó antes, sirve para reconstruir el monedero en otro dispositivo.

¿Qué son las claves y direcciones?

Para asegurar que los bitcoins registrados en la blockchain solo puedan ser utilizados por su dueño, la red de Bitcoin exige que cualquier movimiento de fondos o transferencia sea firmada dígitalmente por aquel para ser considerada válida.

Bitcoin utiliza un algoritmo llamado ECDSA (Elliptic Curve Digital Signature Algorithm o Criptografía de Curva Elíptica) para derivar de una clave privada, la clave pública correspondiente y así poder validar las firmas digitales hechas con esa clave privada.

En este esquema, cualquier número de 256 bits o 32 bytes puede ser una clave privada válida. Por lo tanto, solo basta con calcular el SHA256 de cualquier cadena de caracteres para obtener una clave privada válida.

Las claves públicas, a su vez, pueden tener 256 o 512 bits dependiendo si están o no comprimidas, a los cuales se les suma un byte adicional como prefijo indicativo del tipo de clave pública en cuestión. Por lo tanto, las claves públicas son siempre de 33 o 65 bytes.

Quizá para ahorrar espacio en la blockchain y facilitarle la vida a los usuarios, existe una alternativa adicional a utilizar una clave pública de ese tamaño: crear una “dirección” al reducir esa clave pública a 160 bits a partir de aplicar SHA256 y luego RIPEMD-160 sobre la clave pública. Estas direcciones usualmente son cadenas de texto de alrededor de 34 caracteres (pueden tener entre 26 y 35 caracteres en total) y comienzan con “1” (direcciones relacionadas con una clave pública de la red principal o MAINNET).

Es importante destacar que si bien de la clave privada se deriva la pública, y de ésta la dirección, no es posible realizar el camino inverso. De ahí la seguridad de que haciendo pública la clave pública o la dirección, no es posible para un tercero conocer o encontrar la clave privada que las generó.


¿Qué es BIP32?

BIP32 definen un estándar para generar las direcciones de los monederos a partir de una semilla (o seed en inglés) lo que se denomina "derivación de claves privadas". Una semilla es una palabra de 128 bits que permiten restaurar completamente un monedero y las direcciones que éste contiene.


Hay que tener en cuenta que. aprovechando que el espacio de direcciones es inmensamente grande (entre 2^160 y 2^256) y con el objetivo de disminuir riesgos y aumentar la privacidad de los usuarios, se recomienda no reutilizar direcciones sino ir creando direcciones nuevas para cada nueva transacción.

Esto supondría un serio problema para el usuario o las billeteras, que tendría que guardar y asegurar un número creciente de claves privadas.

Para mitigar este inconveniente, y aprovechando bondades de la criptografía, se diseñó un esquema seguro de derivación de claves privadas (BIP32). En este esquema, se parte de una única semilla o seed de 128 bits, la cual se introduce en un generador de números pseudoaleatorios para ir obteniendo distintas claves privadas de 256 bits de forma determinísta*. A su vez, a partir de esas claves privadas se derivarán las correspondientes claves públicas y direcciones a medida que vayan siendo necesarias. La mayoría de las billeteras utilizan este esquema, cuidando la privacidad de los usuarios.

Tal y como se explicó anteriormente, si un usuario perdiera su billetera o deseara utilizar sus bitcoins en otro dispositivo, solo debería volver a introducir la semilla para regenerar las mismas claves y las mismas direcciones. De ahí la importancia del determinismo en el algoritmo de derivación.

En esos casos, esta “clave maestra” o semilla de 128 bits es la que debe ser guardada con el mayor cuidado. Si esa clave estuviera comprometida, todas las claves privadas derivadas estarían comprometidas también. Evidentemente las claves privadas derivadas también deben mantenerse secretas pero el riesgo de que una fuera conocida por un tercero solo afectaría a los bitcoins relacionados con esa única clave privada.

*: En matemáticas y física, se denomina sistema determinista a aquel en que el azar no está involucrado en el desarrollo de los futuros estados del sistema.Un modelo determinista producirá siempre la misma salida a partir de las mismas condiciones de partida o el estado inicial.

¿Qué es BIP39?

Recordar una palabra de 128 bits para cualquier humano que no sea Sheldon Cooper es una tarea complicada así que gracias a otro estándar muy inteligente llamado BIP39, los humanos tenemos una forma sencilla de recordar o almacenar de manera segura esas semillas de 128 bits: a través de 12 palabras.

Este esquema define un diccionario de 2048 palabras. Cada palabra tiene asignados 11 bits (del 0x000 al 0x7FF) y fue seleccionadas de forma tal que sea sencillas y que sus 4 primeras letras sean distintas de cualquier otra palabra del diccionario, evitando confusiones entre palabras similares. Sumando 12 de estas palabras se obtienen entonces 132 bits, de los cuales 4 son utilizados para detección de errores, quedando los 128 bits restantes para formar la semilla.


De forma sencilla podemos determinar que el número de combinaciones posibles es de 204812 palabras o, lo que es lo mismo, 2132.

Es por ese motivo que la mayoría de las billeteras nos exigen hacer una copia de seguridad de esas famosas 12 palabras aleatorias antes de comenzar a operar. ¡Más vale hacerlo y mantener nuestras criptomonedas bajo control!

Para más información: