Blockchain.info-Wallet-Export entschlüsseln

Das verschlüsselte Wallet-Format von Blockchain.info wird wie folgt beschrieben :

AES verschlüsselt die gesamte JSON-Nutzlast mit dem Benutzerkennwort, das dann als base64 codiert wird. Für die Single-Pass-Verschlüsselung wird kein Salt verwendet. Die genauen AES-Spezifikationen sind 10 Runden PBKDF2, Blockmodus CBC ISO10126-Padding.

Beim Versuch, meine eigenen verschlüsselten Exporte zu überprüfen, scheint es jedoch, dass dies nicht alle Informationen (oder korrekt) sind. Ich denke, ein Teil des Problems besteht darin, wie das Passwort des Benutzers zu einem Eingabeschlüssel für die AES/Rijndael-Chiffre erweitert wird.

  • Der Eingabeschlüssel für AES kann 128, 192 oder 256 Bit lang sein; was wird verwendet?
  • AES hat seinen eigenen Schlüsselplan , aber es scheint, dass Blockchain etwas anderes verwendet, da „PBKDF2“ eine weitere Schlüsselerweiterungsfunktion ist.
  • PBKDF2 ist eine Methode, die mit vielen Arten von Hashes verwendet werden kann; Welcher Hash wird verwendet?

Antworten (2)

Okay, nachdem ich das bereitgestellte Wiederherstellungstool untersucht hatte (danke Lohoris für den Hinweis!), kam ich zu den folgenden Antworten auf meine Fragen:

  • Der Eingabeschlüssel für die AES-Entschlüsselung beträgt 32 Byte (256 Bit)
  • Die verwendete Blockgröße beträgt 16 Bytes ( MCRYPT_RIJNDAEL_128für PHP-mcrypt- Funktionen)
  • Der Initialisierungsvektor (IV) für die AES-Entschlüsselung sind die ersten 16 Bytes (eine Blockgröße) der verschlüsselten Zeichenfolge. Die verbleibende verschlüsselte Zeichenfolge ist die verschlüsselte Nachricht.
  • Das Passwort des Benutzers wird erweitert, indem 10 Runden PBKDF2-Hashing verwendet werden, SHA1-Hashing verwendet wird und die IV als Salz verwendet wird (der Hinweis „Kein Salz wird für die Single-Pass-Verschlüsselung verwendet“ scheint nur kein Salz für die AES-Verschlüsselung zu bedeuten. Für das PBKDF2-Hashing , es gibt ein Salz).

Beachten Sie, dass Sie bei Verwendung von PHP - mcryptErweiterungsfunktionen (wie ich es versucht habe) die mdecrypt_generic()Methode anstelle von verwenden mcrypt_decrypt()müssen, da Blockchain ISO10126-Padding verwendet und die mcryptErweiterung nur "Zero Padding" verwendet. Sie müssen das Ergebnis dann separat entpolstern.

Ich habe zwar keine direkte Antwort auf Ihre Fragen, aber ich denke, Sie können diese finden, wenn Sie sich die Quelle des Wiederherstellungsskripts ansehen .

Danke Lohoris; das hat mich auf die richtige Spur gebracht! Ich habe festgestellt, dass dieses bestimmte Wiederherstellungsskript veraltet ist (die Verschlüsselungsmethode wurde im März 2012 geändert). Obwohl es mich auf dieses funktionierende Skript und das Wiederherstellungstool hingewiesen hat, das mir geholfen hat, es herauszufinden.