Estaba revisando un archivo de billetera Electrum (de Electrum 1.9.6 para Windows, si es importante) tratando de entender qué información contenía, e inicialmente no pude averiguar exactamente dónde estaban almacenadas las claves privadas (o incluso si eran tal vez se almacenaron en algún otro archivo). Supongo que el campo "semilla" en el archivo default_wallet contiene suficiente información para que se generen las claves privadas, las claves públicas y el mnemotécnico de 12 palabras. ¿Tengo razón hasta ahora?
Para experimentar un poco más, quería ver si 2 archivos de billetera que usan el mismo mnemotécnico de 12 palabras serían idénticos. Como era de esperar, cuando no encripté las billeteras, la misma mnemotécnica parecía conducir a archivos de billetera idénticos. Sin embargo, también intenté encriptar cada billetera con la misma contraseña y, para mi sorpresa, los archivos tenían diferentes valores en el campo "seed". Esto me sorprendió, así que me pregunto si este es el comportamiento esperado y por qué sucede.
En realidad es una buena pregunta. Echemos un vistazo a lo que está sucediendo. Primero, Electrum procesa tu mnemotécnico para generar una semilla. De hecho, la semilla contiene toda la información necesaria para generar la clave pública maestra y la clave secreta maestra, la primera se usa para generar la secuencia de claves públicas (direcciones) y la segunda se usa para derivar una clave secreta de una clave pública (en realidad es un poco más complejo). Luego, Electrum guarda el archivo de la billetera, que contiene la semilla y las claves que están realmente en uso, la secuencia completa de pares de claves a menos que llegue a 5 direcciones consecutivas sin usar. Puede almacenarlo sin encriptar o encriptado. En el primer caso, el valor semilla en el archivo siempre tendrá el mismo aspecto, al igual que las claves privadas. En el segundo caso, sin embargo, no lo harán. ¿Por qué? La documentación de Electrum dice:
Electrum usa AES-256-CBC para encriptar la semilla y las claves privadas en la billetera.
¿Qué significa? AES-256 es simplemente un cifrado de bloque. Toma un bloque de datos (128 bits en este caso) y un bloque de clave (256 bits) y genera 128 bits de datos cifrados. Pero no es lo que hace Electrum. En realidad, nadie usa cifrados de bloque como ese y nadie debería hacerlo. En su lugar, se utilizan los llamados modos.En nuestro caso, es el modo Cipher Block Chaining (CBC). Electrum primero genera un vector de inicialización aleatorio (IV), lo mezcla (por operación o exclusiva) con los primeros 128 bits de entrada y usa AES-256 en este bloque mixto para producir el primer bloque encriptado. Para cualquier bloque subsiguiente hace lo mismo, excepto que en lugar de IV toma el bloque cifrado anterior para mezclarlo con el bloque de texto sin formato. El IV se guarda junto con el archivo. Finalmente, es por eso que siempre llega con un valor inicial diferente en un archivo, incluso cuando usa la misma contraseña (lo que da como resultado la misma clave para el cifrado AES-256-CBC [1]): se usa un IV diferente cada vez.
[1] Probablemente tampoco sea el caso, ya que es probable que se utilice la Función de derivación de clave para entregar una clave de su frase de contraseña, en cuyo caso se agrega un valor de sal aleatorio adicional a la frase de contraseña antes de codificarla y guardarla junto, de manera similar a la IV.
La semilla es la clave que se toma para derivar todas sus direcciones de forma determinista. El cifrado es para proteger la semilla https://electrum.org/faq.html#wallet-encryption
Juan T.
Michael McGowan
CodesInChaos
Michael McGowan
david schwartz