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 mnemotécnico.
Cómo transformar el mnemotécnico generado en una semilla binaria.
A continuación se muestra cómo generar billeteras deterministas describiendo primero cada una de estas dos partes.
Generando un mnemotécnico
El proceso algorítmico para generar un mnemotécnico es el siguiente:
El proceso es el siguiente:
Cree una secuencia aleatoria (entropía) de 128 a 256 bits (tamaño de paso 32 bits)
Realice SHA256 en la secuencia aleatoria generada en el paso anterior para generar un valor Hash y tome los primeros N bits del valor Hash (longitud de entropía/32, por ejemplo, 128 bits, luego N = 4) como suma de comprobación de la secuencia aleatoria.
Agregue Checksum al final de la secuencia aleatoria generada en el primer paso, de modo que para el ejemplo de la figura la secuencia aleatoria con Checksum sea 128 + 4 = 132 bits.
Separe la secuencia aleatoria del paso anterior en segmentos de 11 bits (división), de modo que para una secuencia de longitud de entropía de 128 bits, se generen 12 segmentos (132/11 = 12).
En este punto, se asigna cada valor que contiene un segmento de 11 bits a un diccionario predefinido de 2048 palabras.
El último grupo de palabras generado en el orden de corte es el mnemotécnico.
Generación de semillas a partir de mnemónicos
Después de la generación mnemotécnica, podemos generar la semilla utilizando el algoritmo de función de generación de clave PBKDF2.
PBKDF2 requiere dos parámetros: un mnemónico y una sal. El propósito de la sal es dificultar el descifrado y en BIP-39 podemos introducir una frase de contraseña como factor de seguridad adicional para proteger las semillas.
“PBKDF2 es 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 de Internet Engineering Task Force”.
Siguiendo la generación mnemotécnica 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 el salt, que generalmente consta de una cadena y una concatenación opcional de cadenas de cifrado proporcionadas por el usuario.
PBKDF2 utiliza el algoritmo HMAC-SHA512, que utiliza 2048 hashes para producir un valor de 512 bits como semilla.
Generando 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 ingresar la semilla raíz en el algoritmo HMAC-SHA512 se obtiene un hash de 512 bits, los 256 bits izquierdos se utilizan como clave privada maestra y los 256 bits derechos como código de cadena maestra. Después de eso, la clave pública maestra (264 bits) puede generarse mediante la clave privada maestra m.
Como puede ver en la figura anterior, la clave HD se genera con los siguientes parámetros.
Clave privada principal o clave pública principal; (ambas son claves ECDSA de 256 bits sin comprimir).
Código de cadena principal de 256 bits.
Un número de índice entero de 32 bits.
Además, el proceso anterior es recursivo y la Clave privada secundaria del diagrama se puede utilizar como la Clave privada principal en el siguiente nivel.
Al ingresar (Clave pública principal, Código de cadena principal, 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.
Acerca de la clave extendida
Debido a que esta función de derivación de claves es unidireccional, no todas las subclaves se pueden usar para derivar sus claves principales o claves hermanas en el mismo nivel, solo la clave principal y el código de la cadena principal (que se generan a partir de la clave y el código de cadena del nivel principal de los padres) se pueden usar para derivar todas las subclaves y códigos de subcadena, y posteriormente generar las claves subpúblicas y direcciones correspondientes para firmar transacciones.
La combinación de clave y código de cadena se denomina clave extendida, y la clave extendida se puede usar para generar todas las ramas de ahí en adelante.
La clave proporcionada en la clave extendida puede ser una clave privada o una clave pública, combinada con el código de cadena denominado Clave privada extendida y Clave pública extendida, respectivamente, y anotados como (k, c) y (K, c), respectivamente, donde la clave pública K = punto (k).
Podemos derivar la clave pública extendida 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 el pago, mientras que la clave privada extendida se puede almacenar en una billetera de papel o una billetera de hardware para la firma segura de transacciones fuera de línea. 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 principal extendida para derivar la clave privada secundaria y generar la clave pública secundaria:




