Cómo convertir una clave privada WIF en una clave privada extendida BIP32

Estoy tratando de recuperar la clave privada maestra BIP32 extendida de su clave pública BIP32 extendida (que ya conozco) y una clave privada WIF (que obtuve al descifrar una semilla BIP38 con una frase de contraseña).

Seguí los pasos descritos en este artículo de Vitalik Buterin, pero para usar la crack_bip32_privkeyfunción en pybitcointools, necesito tener una clave privada en formato BIP32 (no WIF). Puedo ver cómo obtener una clave maestra privada BIP32 de una semilla BIP32 (con bip32_master_key), pero no cómo hacer lo mismo desde una clave privada en formato WIF.

¿Cómo puedo convertir la clave privada WIF en una clave privada BIP 32 (con Python, .NET o Javascript)?

Ya hizo esta pregunta y se cerró como un duplicado de bitcoin.stackexchange.com/questions/56916/… .
Edité la pregunta con lo que realmente quería preguntar: bitcoin.stackexchange.com/questions/56916/…

Respuestas (1)

no puedes El formato de clave privada extendida BIP 32 contiene información que no está presente en la clave privada WIF. El formato de clave privada extendida contiene el código de cadena de la clave privada, el índice y la huella digital principal. Esa información proviene de la derivación de la clave privada en sí y no se puede encontrar en ningún otro lugar.


Para obtener la clave pública principal, la única información que necesita de la clave pública extendida es el índice del elemento secundario. Esto se puede encontrar de manera trivial simplemente aplicando fuerza bruta a través de todos los índices secundarios posibles (2 ^ 31 - 1 índices) hasta que obtenga una clave privada maestra que tenga una clave pública que coincida con la clave pública principal, o hasta que haya obtenido la clave pública secundaria correcta. clave de la clave pública principal.

Aquí hay un código que le encontrará la clave privada principal. Esto hace la primera técnica de recorrer las posibles claves privadas principales hasta encontrar una que tenga una clave pública que coincida con la clave pública principal. Tenga en cuenta que esto puede ser completamente ineficiente y puede llevar mucho tiempo encontrar una clave. También tenga en cuenta que esto solo funciona si la clave secundaria se deriva directamente de la clave principal, no a cierta profundidad en el árbol de derivación.

from pybitcointools.deterministic import raw_crack_bip32_privkey, bip32_deserialize, bip32_serialize, bip32_privtopub
from pybitcointools.main import decode_privkey, encode_privkey

parent_pub = 'xpub661MyMwAqRbcEnKbXcCqD2GT1di5zQxVqoHPAgHNe8dv5JP8gWmDproS6kFHJnLZd23tWevhdn4urGJ6b264DfTGKr8zjmYDjyDTi9U7iyT'
wif_key = encode_privkey(decode_privkey('KyqcQVzcp7cHEMEDHQaz5eaE5azsRHaE4ukkeqwM2vdiQwBYtxeb'), 'bin_compressed')
for i in xrange(2**31 -1):
    priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)
    pkey =  raw_crack_bip32_privkey(bip32_deserialize(parent_pub), priv)
    final_key = bip32_serialize(pkey)
    if bip32_privtopub(final_key) == parent_pub:
        print final_key
        break
Excelente, esto es exactamente lo que necesitaba. ¿Alguna idea sobre cómo hacer que se complete más rápido (por ejemplo, días)? En este momento va a llevar años :(. Investigué Cython pero tendría que citonizar todas las dependencias en las que se gasta el tiempo. Si supieras cómo hacer esto directamente con la biblioteca estándar de Bitcoin C++ en lugar de Python, sería increíble. .
No debería tomar más de un par de segundos a menos que su clave tenga un índice muy alto. Sin embargo, si la clave tiene una profundidad de más de 1 (es decir, la clave se deriva de una clave pública que se deriva de la clave pública principal, etc.) o está protegida, el proceso se repetirá hasta que se agoten todos los índices posibles y sale sin encontrar ninguna llave. Sospecho que ese es el caso aquí. Para lidiar con eso, debe asegurarse de que la clave no esté endurecida y asegurarse de estar en la profundidad correcta. De lo contrario, tendrá que derivar claves públicas hasta que lo esté.
Vale, muchas gracias por el consejo. De hecho, estoy usando las dos semillas y claves públicas (con profundidad 0 y "Clave pública maestra de Bitcoin" según bip32.org proporcionada por Coinbase al generar una bóveda multi-sig. Para cada semilla, he podido recuperar la clave privada WIF , pero su dirección asociada no es la misma que la dirección derivada de la clave pública (con la ruta de derivación "Simple: m/i" y el índice i correcto que conozco). Así que parece que la clave privada que tengo no es la clave privada principal. key", que necesitaría para derivar la clave privada que tiene exactamente la misma dirección que pubKey.
Sin la clave privada correcta, no puedo firmar un mensaje que demuestre que soy el propietario de la dirección asociada con la clave pública.
¿De qué estás hablando y cómo se relaciona con esta pregunta?
Perdón por la confusion. Solo estoy tratando de proporcionar información básica sobre cómo se generaron las claves inicialmente. El objetivo de mi pregunta es obtener una clave privada cuya dirección sea la misma que la dirección de la clave pública derivada en index m/14.
En este momento tengo: (1) una clave pública maestra en formato extendido BIP32 (proporcionada por Coinbase), (2) una clave pública derivada en el índice m/14que corresponde a la dirección para la que necesito probar la propiedad, (3) una clave privada en WIF formato (proporcionado por Coinbase al generar la bóveda, desconozco si está endurecido, ni la profundidad).
No estoy seguro de cómo ingresarlos en su secuencia de comandos y qué parámetros cambiar en la línea priv = (b'\x04\x88\xAD\xE4', 1, 0, i, b'', wif_key)para obtener la clave privada BIP32 que tendrá la misma dirección que la clave pública derivada.
Esto parece un caso de un problema XY: xyproblem.info . Tener las dos claves públicas y la clave privada de usuario de coinbase aún debería permitirle obtener la información que necesita, solo que no con el método que desea usar. Dado que esto está un poco fuera de tema ahora, le sugiero que haga una nueva pregunta preguntando exactamente qué quiere hacer, no qué pensó que funcionaría para obtener lo que quería hacer.
De todos modos, supongo (no estoy seguro porque no tengo acceso a mi cuenta de coinbase en este momento para verificar) que la clave de usuario que te dan es una clave privada que luego se usa para derivar la clave privada que corresponde al maestro clave pública que te dieron. Esa derivación es probablemente una derivación endurecida y probablemente usa la ruta de derivación BIP 44. Por lo tanto, debería poder derivar la clave privada que corresponde a la clave pública utilizando la ruta de derivación BIP 44 y, a partir de ahí, derivar la clave privada que necesita.
Tienes toda la razón. Traté de generalizar mi problema, pero probablemente no debería haberlo hecho. He publicado la pregunta más apropiada aquí: bitcoin.stackexchange.com/questions/57207/… . Muchas gracias por tu ayuda.