La especificación BIP-39 describe principalmente el algoritmo y el proceso para generar billeteras deterministas basadas en mnemónicos (un conjunto de palabras fáciles de recordar).
La especificación consta de dos partes principales:
Cómo generar el mnemónico.
Cómo transformar el mnemónico generado en una semilla binaria.
A continuación, se describe cómo generar billeteras deterministas, explicando primero cada una de estas dos partes.
Generación de un mnemónico
El proceso algorítmico para generar un mnemónico es el siguiente:
El proceso es el siguiente:
Crea una secuencia aleatoria (entropía) de 128 a 256 bits (paso de 32 bits).
Realiza un SHA256 sobre la secuencia aleatoria generada en el paso anterior para generar un valor Hash, y toma los primeros N bits del valor Hash (longitud de la entropía / 32, por ejemplo, 128 bits, entonces N = 4) como la Suma de Verificación (Checksum) de la secuencia aleatoria.
Añade la Suma de Verificación al final de la secuencia aleatoria generada en el primer paso, de modo que para el ejemplo de la figura, la secuencia aleatoria con la Suma de Verificación sea de 128 + 4 = 132 bits.
Separa la secuencia aleatoria del paso anterior en segmentos de 11 bits (divide), de modo que para una secuencia de 128 bits de longitud de entropía, se generen 12 segmentos (132 / 11 = 12).
En este punto, mapea cada valor que contiene un segmento de 11 bits a un diccionario predefinido de 2048 palabras.
El grupo final de palabras generadas en el orden del corte es el mnemónico.
Generación de semilla a partir de mnemónicos
Después de la generación del mnemónico, podemos generar la semilla utilizando la función de generación de claves del algoritmo PBKDF2.
PBKDF2 requiere dos parámetros: un mnemónico y una sal (salt). El propósito de la sal es hacer más difícil la descodificación, y en BIP-39 podemos introducir una frase de contraseña (passphrase) como factor de seguridad adicional para proteger las semillas.
"PBKDF2 es parte de los Estándares de Criptografía de Clave Pública (PKCS) de RSA Laboratories,
específicamente PKCS #5 v2.0, también publicado como RFC 2898 de Internet Engineering Task Force."
Siguiendo la generación de mnemónicos anterior, el siguiente diagrama muestra el algoritmo para la generación de semillas.
El primer parámetro de PBKDF2 es el mnemónico generado anteriormente.
El segundo parámetro de PBKDF2 es la sal, que generalmente consiste en una cadena y una concatenación opcional de cadenas cifradas proporcionadas por el usuario.
PBKDF2 utiliza el algoritmo HMAC-SHA512, que emplea 2048 hashes para producir un valor de 512 bits como semilla.
Generación de billetera HD a partir de semilla
La semilla generada anteriormente se utilizará como Semilla Raíz de la billetera HD, y la Semilla Raíz de cualquier billetera HD puede recrear la billetera HD completa.
Al introducir la Semilla Raíz en el algoritmo HMAC-SHA512, se obtiene un hash de 512 bits, cuyos 256 bits izquierdos se utilizan como Clave Maestra Privada y los 256 bits derechos como Código de Cadena Maestro. Después de eso, la Clave Pública Maestra (264 bits) se puede generar a partir de la Clave Maestra Privada m.
Como se puede observar en la figura anterior, la clave HD se genera con los siguientes parámetros.
Clave Privada o Clave Pública del Padre; (ambas son claves ECDSA de 256 bits no comprimidas).
Código de Cadena del Padre de 256 bits.
Un número de índice entero de 32 bits.
Además, el proceso anterior es recursivo y la Clave Privada Hija en el diagrama puede usarse como la Clave Privada del Padre en el siguiente nivel.
Al introducir (Clave Pública del Padre, Código de Cadena del Padre, Número de Índice) en el algoritmo HMAC-SHA512, podemos generar sus subclaves, y podemos ajustar el Número de Índice para generar múltiples subclaves en el mismo nivel.
Sobre Clave Extendida
Debido a que esta función de derivación de claves es unidireccional, todas las subclaves no pueden usarse para derivar sus claves padre o hermanas del mismo nivel. Solo la clave padre y el código de cadena padre (que se generan a partir de la clave y el código de cadena del Padre de nivel superior) pueden usarse para derivar todas las subclaves y códigos de cadena hijos, y posteriormente generar las claves públicas y direcciones correspondientes para firmar transacciones.
La combinación de la Clave y el Código de Cadena se denomina clave extendida, y la clave extendida puede usarse para generar todas las ramas a partir de ahí.
La clave proporcionada en la clave extendida puede ser una clave privada o una clave pública, combinada con el código de cadena se denominan Clave Privada Extendida y Clave Pública Extendida, respectivamente, y se anotan como (k, c) y (K, c), respectivamente, donde la clave pública K = punto(k).
Podemos derivar la clave pública extendida a partir de la clave privada extendida y no al revés, por lo que para algunos escenarios de transacciones (por ejemplo, comercio electrónico), se puede generar una nueva clave pública y dirección para cada transacción para recibir pagos, mientras que la clave privada extendida puede almacenarse en una billetera de papel o una billetera de hardware para la firma segura de transacciones sin conexión. Como podemos ver, la seguridad de la clave pública extendida es relativamente alta, y el siguiente diagrama muestra el mecanismo de transmisión de la clave pública padre extendida para derivar la clave privada hija y generar la clave pública hija:



