Todo esto viene del análisis que estoy realizando al código fuente del Bitcoin Core.
Hoy hablaré sobre la función BytesToKeySHA512AES la cual es una de las primeras que se utilizan cuando intentas desbloquear una cartera bitcoin protegida con un passphrase.
BytesToKeySHA512AES básicamente toma las passphrase ingresada + un salt proporcionado por el mismo archivo wallet.dat y los transforma en un (key, iv) para posteriormente utilizarlos como material para descifrar la llave cifrada.
El código fuente de BytesToKeySHA512AES, lo pueden encontrar en
Código:
https://github.com/bitcoin/bitcoin/blob/master/src/wallet/crypter.cpp
Tiene 3 parámetros de entrada y 2 de salida
Entrada:
Salt
Passphrase
Count
Salida:
Key
IV
La parte interesante del código es la siguiente:
Código
for(int i = 0; i != count - 1; i++) di.Reset().Write(buf, sizeof(buf)).Finalize(buf);
Básicamente obtiene el hash sha512 de si mismo (count -1) veces ya la que primera vez fue el hash sha512 de (passphrase + IV) como muestra el siguiente código:
Código
di.Write((const unsigned char*)strKeyData.data(), strKeyData.size()); di.Write(chSalt.data(), chSalt.size()); di.Finalize(buf);
Posteriormente copia los primeros 32 bytes al Key y los siguientes 16 bytes al Vector IV
Si no están familiarizados con la sintaxis del codigo anterior dejare un código en PHP ejemplificando lo que hace la función:
Código
<?php $salt = "BBBBBBBBBBBBBBBB"; $passphrase = "AAAAA"; $key_ =""; $iv_ = ""; BytesToKeySHA512AES($salt ,$passphrase,2,$key_, $iv_ ); echo "Key:\n"; echo "IV:\n"; function BytesToKeySHA512AES($chSalt,$strKeyData,$count,&$key,&$iv) { $i = 0; while($i != $count -1) { /* //Estas tres líneas básicamente se transforman en una simple llamada a hash $ctx = hash_init('sha512'); hash_update($ctx,$buf); $buf = hash_final($ctx,true); */ $i++; } echo "hash:\n"; } ?>
Lo escribí en PHP ya que es mas fácil darle seguimiento a las funciones hash, solo que no estoy 100% seguro de como manejar las copia de los bytes del hash resultante al key y al IV respectivamente.
Saludos