Descifrar la exportación de la billetera Blockchain.info

El formato de billetera encriptada de Blockchain.info se describe como:

AES cifra toda la carga útil de JSON con la contraseña de los usuarios, que luego se codifica como base64. No se utiliza sal para el cifrado de un solo paso. Las especificaciones exactas de AES son 10 rondas de relleno PBKDF2, Modo Bloque CBC ISO10126.

Sin embargo, al tratar de verificar mis propias exportaciones cifradas, parece que esa no es toda la información (o es correcta). Creo que parte del problema está en cómo la contraseña del usuario se expande a una clave de entrada para el cifrado AES/Rijndael.

  • La clave de entrada para AES puede ser de 128, 192 o 256 bits; cual se esta usando?
  • AES tiene su propio programa clave , pero parece que Blockchain está usando algo separado, ya que "PBKDF2" es otra función clave de expansión.
  • PBKDF2 es una metodología que se puede utilizar con muchos tipos de hash; ¿Qué hash se está utilizando?

Respuestas (2)

Bien, luego de investigar la herramienta de restauración provista (¡gracias Lohoris por señalarla!), llegué a las siguientes respuestas a mis preguntas:

  • La clave de entrada para el descifrado AES es de 32 bytes (256 bits)
  • El tamaño de bloque utilizado es de 16 bytes ( MCRYPT_RIJNDAEL_128para funciones PHP mcrypt )
  • El vector de inicialización (IV) para el descifrado AES son los primeros 16 bytes (tamaño de un bloque) de la cadena cifrada. La cadena cifrada restante es el mensaje cifrado.
  • La contraseña del usuario se expande usando 10 rondas de hash PBKDF2, usando hash SHA1 y el IV como sal (la nota "No salt is used for single passcryption" parece significar simplemente que no hay sal para el cifrado AES. Para el hash PBKDF2 , hay una sal).

Tenga en cuenta que si usa las funciones de extensión de PHP mcrypt(como lo estaba intentando), debe usar el mdecrypt_generic()método en lugar de mcrypt_decrypt(), ya que Blockchain usa el relleno ISO10126, y la mcryptextensión solo usará "relleno cero". A continuación, debe deshacer el relleno del resultado por separado.

Si bien no tengo una respuesta directa a sus preguntas, supongo que puede encontrarlas buscando la fuente del script de restauración .

Gracias Lohoris; eso me puso en el camino correcto! Descubrí que ese script de restauración en particular está desactualizado (el método de cifrado cambió en marzo de 2012). Aunque me señaló este script de trabajo y la herramienta de restauración que me ayudó a resolverlo.