Contraseña "perdida" para clave privada encriptada BIP38, el encriptador puede estar defectuoso (Bippy)

Hace unos años, cifré mi clave privada de Bitcoin para almacenamiento en frío con una aplicación fuera de línea llamada Bippy. Recientemente traté de acceder a mi billetera descifrando la clave privada, pero mi contraseña fue rechazada.

Revisé este programa de Bippy nuevamente y empiezo a sospechar que tiene alguna falla. Parece que las claves privadas que comienzan con un '5', cifradas con Bippy, no se descifrarán con la misma contraseña. Otros prefijos parecen funcionar bien.

Ahora, esta aplicación de Bippy es de código abierto y está escrita en Python, y la obtuve de aquí . Intenté, como prueba, cifrar la clave privada 5Ka1Bv4RpKayZygPhZbBcREejqeYwq2iSRzWPKsg49SPgVRTnpW con la contraseña testingOneTwo (es un pk nuevo, no hay bitcoins allí;)). En Bippy, esto se cifra en 6PYMN8WT4CW7xLYczLvYfXZCtQWND7XEesk32QbXujMgKhf2v5A2ZQANpL , sin embargo, el uso de la contraseña anterior no logra descifrarlo a su original... Probé varias otras claves y contraseñas privadas de '5', y siempre sucede lo mismo.

Afortunadamente, el programa es de código abierto; lamentablemente, el proyecto parece abandonado hace unos años y mi conocimiento de Python y el cifrado no está en un nivel lo suficientemente bueno como para identificar el error en juego aquí, y espero alguna ayuda aquí :)

¿Qué usó para intentar descifrar la clave privada cifrada? ¿Bippy?
Cabe señalar que esto se preguntó originalmente en reddit y alguien incluso publicó un código.

Respuestas (2)

Resulta que Bippy tiene un error en el algoritmo de cifrado donde confunde el indicador de compresión de clave pública. Como se señaló, también publiqué este problema en reddit , y allí se publicó una solución:

Bippy definitivamente está haciendo algo mal.

Explicación técnica

Las claves encriptadas BIP38 tienen 4 componentes (en el caso más simple).

Las dos primeras letras de la clave, 6P, son un marcador que dice que se trata de una clave cifrada BIP38.

La siguiente letra, Y en este caso, especifica algunos atributos de la clave. En este caso, dice "Esta es una clave BIP38 simple y la clave pública debe comprimirse".

Las siguientes letras (4 bytes en la representación hexadecimal) especifican una "suma de comprobación". Volveremos a esto.

El resto de la clave es la verdadera carne de la misma. Es la clave privada encriptada. Eso es lo que más nos importa.

Ahora volvamos a esa suma de comprobación. La suma de comprobación es de 4 bytes derivados de la dirección de Bitcoin asociada con la clave privada original. Una gran advertencia aquí es que en realidad hay dos direcciones de Bitcoin asociadas con una clave privada de Bitcoin simple. Uno se basa en la clave pública comprimida y el otro en la clave pública sin comprimir.

Es por eso que las claves encriptadas BIP38 especifican si están usando la dirección comprimida o sin comprimir.

En este caso, Bippy escupió una Y, lo que significa que usó la dirección comprimida. En sus capturas de pantalla incluso dice tanto. PERO aquí es donde está el problema.

Cuando verificamos la suma de verificación que Bippy escupió, no coincide con una dirección comprimida. Pero si usamos la dirección sin comprimir, ¡coincide! Entonces Bippy dice que está usando la dirección comprimida, pero en realidad está usando la dirección sin comprimir.

Entonces, Bippy definitivamente tiene un error en el que usa la dirección sin comprimir, pero dice en la clave BIP38 resultante que usó la dirección comprimida.

Esto no es gran cosa. Discutiré esto después de la explicación no técnica.

Explicación no técnica

Bippy está cifrando correctamente, pero está arruinando la codificación de la clave cifrada. Está diciendo que usó compresión de clave pública cuando en realidad no lo hizo. Esto no es gran cosa.

Solución

Entonces, la buena noticia es que parece que, además de ese error menor, Bippy está encriptando las cosas importantes correctamente. Debería ser posible tomar su clave Bippy "perdida" y recuperar la clave privada de ella. Asumiendo que su contraseña es correcta.

Debería poder hackear mi script para encargarme de eso por ti. Trabajaré en eso y te responderé. (Necesito doblar algo de codificación/descodificación Base58 en el script y hacerlo un poco fácil de usar para ti;)). El código será un código de Python bastante simple, por lo que puede echar un vistazo superficial para asegurarse de que no hace nada malo.

También se proporcionó un script de recuperación de python, disponible en github : todos los créditos para fpgaminer

Si hay un error en Bippy y está generando claves privadas cifradas incorrectas, eso haría que su clave privada no cifrada fuera irrecuperable, a menos que el error en Bippy fuera algo tan simple como cambiar la frase de contraseña antes de pasarla por el algoritmo de cifrado.

No he podido hacer que Bippy construya en mi máquina, así que no he podido probar. Pero usé bitcoinpaperwallet.com para probar sus claves anteriores, y cuando uso la frase de contraseña testingOneTwopara cifrar 5Ka1Bv4RpKayZygPhZbBcREejqeYwq2iSRzWPKsg49SPgVRTnpW, el resultado es la clave privada cifrada de 6PRLKpRdHRsMJcjuMYoE4wpKYUZEX11oB9LejdU8JuDLxynpDZFZWMNkDv.

No he podido encontrar a nadie más con este problema. Sugeriría intentar descifrar su clave privada utilizando otra herramienta BIP38, como la sección "Validar o descifrar" en bitcoinpaperwallet.com.

Si eso no funciona, podría ser útil que nos explicara paso a paso (con capturas de pantalla) cómo genera la clave privada cifrada y cómo la descifra.