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 examina cómo generar billeteras deterministas describiendo 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 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 tiene 128 + 4 = 132 bits.
Separa la secuencia aleatoria del paso anterior en segmentos de 11 bits (división), de modo que para una secuencia de 128 bits de longitud de entropía, se generan 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 generado en el orden de 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 dificultar el descifrado y, en BIP-39, podemos introducir una contraseña como factor de seguridad adicional para proteger las semillas.
"PBKDF2 forma parte de la serie de 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 del Grupo de Trabajo de Ingeniería de Internet."
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 de texto 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 la Semilla Raíz de la billetera HD, y la Semilla Raíz de cualquier billetera HD puede recrear la billetera HD completa.
La introducción de la Semilla Raíz en el algoritmo HMAC-SHA512 produce un hash de 512 bits, cuyos 256 bits izquierdos se utilizan como Clave Privada Maestra y los 256 bits derechos como Código de Cadena Maestro. Después de eso, la Clave Pública Maestra (264 bits) puede ser generada por la Clave Privada Maestra m.
Como se puede ver en la figura anterior, la clave HD se genera con los siguientes parámetros.
Clave Privada Padre o Clave Pública Padre; (ambas son claves ECDSA de 256 bits no comprimidas).
Código de Cadena Padre de 256 bits.
Un número entero de índice de 32 bits.
Además, el proceso anterior es recursivo y la Clave Privada Hija en el diagrama puede ser utilizada como la Clave Privada Padre en el siguiente nivel.
Al introducir (Clave Pública Padre, Código de Cadena 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 la Clave Extendida
Debido a que esta función de derivación de claves es unidireccional, todas las subclaves no pueden ser utilizadas para derivar sus claves padre o hermanas en el 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 a nivel superior) se pueden utilizar para derivar todas las subclaves y sub-códigos de cadena, 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 ser utilizada 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 denomina Clave Privada Extendida y Clave Pública Extendida, respectivamente, y se denotan 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 viceversa; por lo tanto, 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 se puede almacenar en una billetera de papel o en 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:



