Derivación de la clave privada principal de un hijo no reforzado

Cita de BIP 32 :

Una debilidad que puede no ser obvia de inmediato es que el conocimiento de una clave pública extendida principal más cualquier clave privada no reforzada que descienda de ella es equivalente a conocer la clave privada extendida principal (y, por lo tanto, todas las claves públicas y privadas que descienden de ella).

¿Cómo se hace esto?

Respuestas (1)

Primero debemos entender cómo BIP 32 deriva claves públicas y privadas no protegidas.

Del BIP 32, derivación de una clave privada secundaria a partir de una clave privada principal ampliada:

sea ​​I = HMAC-SHA512(Clave = c par , Datos = ser P (punto(k par ))) || ser32(i)).

Dividir I en dos secuencias de 32 bytes, I L e I R .

La clave secundaria devuelta Ki es parse 256 (I L ) + k par (mod n).

La clave privada es, por tanto, la clave privada principal más los primeros 256 bits de la función HMAC-SHA512, donde la clave es el código de cadena de la clave privada principal y los datos hash son la concatenación de la serialización de la clave pública que corresponde a la clave extendida. clave privada y el índice de clave secundaria. Lo importante a tener en cuenta aquí es que el hash HMAC-SHA512 es un hash de la clave pública, no de la clave privada.

Del BIP 32, derivación de una clave pública secundaria a partir de una clave pública principal extendida:

sea ​​I = HMAC-SHA512(Clave = c par , Datos = ser P (K par ) || ser32(i)).

Dividir I en dos secuencias de 32 bytes, I L e I R .

La clave secundaria devuelta K i es point(parse 256 (I L )) + K par .

La clave pública secundaria es la clave pública principal añadida con la clave pública generada a partir de los primeros 256 bits de la función HMAC-SHA512, donde la clave es el código de cadena de la clave principal y los datos son la concatenación de la clave pública principal con el índice de la clave pública infantil.

¿Observa cómo al derivar la clave privada secundaria y la clave pública secundaria, en realidad está codificando lo mismo? Está realizando la función HMAC-SHA512 con la misma clave (el código de cadena de las claves principales) y los mismos datos (la concatenación de la clave pública principal y el índice de la clave secundaria). Los primeros 256 bits de ese hash se convierten en una especie de clave privada, y esa clave privada se agrega a la clave privada maestra para convertirse en la clave privada secundaria real. Su clave pública se calcula y se agrega con la clave pública principal para convertirse en la clave pública secundaria.

Entonces, para obtener la clave privada maestra, todo lo que tenemos que hacer es tomar la clave privada secundaria que ahora tenemos y restarle la clave privada producida por la función HMAC-SHA512. Para hacer eso, necesitamos tres cosas, el código de cadena, la clave pública principal y el índice de clave secundaria.

El código de cadena y la clave pública principal provienen de la clave pública principal extendida ( xpub), ya que codifica tanto el código de cadena como la clave pública.

El índice de la clave secundaria se puede encontrar de forma trivial derivando las claves públicas secundarias de la clave pública principal hasta que obtengamos la clave pública que corresponde a la clave privada secundaria que tenemos y guardemos el índice de la clave.

Con estas tres cosas, podemos realizar la función HMAC-SHA512 y obtener el hash de 512 bits. Ahora podemos tomar la clave privada secundaria y restarle el número entero que son los primeros 256 bits del hash que acabamos de generar. Nuestro resultado es la clave privada principal. Combine eso con el código de cadena que recuperamos de la clave pública principal extendida y tenemos la clave privada principal extendida.


Esta técnica solo se aplica a la derivación no endurecida. La derivación reforzada protege contra esto porque genera la clave privada secundaria mediante el hash de la clave privada principal. Sin embargo, esto también significa que no puede generar la clave pública secundaria a partir de la clave pública principal.

¿Puede aclarar cómo este tema es un duplicado de mi pregunta aquí: bitcoin.stackexchange.com/questions/57023/… El tema es similar pero su respuesta, aunque excelente aquí, no sería adecuada para mi pregunta.
Está preguntando cómo obtener la clave privada maestra extendida de la clave pública maestra y la clave privada secundaria. Los pasos para hacerlo se explican aquí. La única otra adición a su pregunta es sobre el formato WIF y xpub. Esas son solo codificaciones de datos binarios, así que simplemente decodifíquelos para obtener los valores sin procesar y realizar las operaciones descritas en esta respuesta.
Gracias, cómo pasar de una semilla BIP32 a una dirección xpub usando Python es precisamente mi pregunta (lo siento si esto le parece trivial), ya que pybitcointools ya tiene una función conveniente para realizar la derivación clave que describe en su respuesta (pero requiere claves en formato xpub). Según tengo entendido, al menos en Stackoverflow, una pregunta debe marcarse como duplicada solo si puede satisfacerse por completo con la respuesta de otra pregunta, lo que no parece ser el caso aquí.
Esa puede haber sido la pregunta que pretendías hacer, pero esa no fue la pregunta que realmente se hizo. Su pregunta fue "Recuperar la clave privada maestra BIP32 extendida ..." no "Cómo obtener el xprv de una clave wif". Su pregunta realmente no debería mencionar "recuperar la clave privada maestra extendida" en absoluto, ya que eso no está relacionado con lo que realmente desea saber.