Blog
10 Min. Lesezeit
|
18. Okt. 2024

Keystores für Ethereum, BNB und Polygon entschlüsseln

So entschlüsseln Sie mit PHP den privaten Schlüssel aus einer Ethereum-, BNB- oder Polygon-Keystore-Datei, Schritt für Schritt im Chaingateway-Blog.

Kapitel
C
Chaingateway Team
Blockchain-Experten

Einführung

Ethereum, Binance Smart Chain (BSC) und andere EVM-kompatible Netzwerke verwenden Keystore-Dateien, um die privaten Schlüssel der Nutzer zu schützen. Eine Keystore-Datei ist eine JSON-Datei, die einen verschlüsselten privaten Schlüssel enthält, gesichert mit einem Passwort. Aus Sicherheitsgründen speichern Anwendungen oft nur die Keystore-Datei, nicht den privaten Schlüssel im Klartext.

In diesem Blogbeitrag zeigen wir, wie Sie den privaten Schlüssel aus einer Keystore-Datei mit PHP wiederherstellen können. Das ist besonders nützlich, wenn Sie Ihren privaten Schlüssel für die Nutzung in einer anderen Anwendung exportieren oder wiederherstellen müssen.

Warnung

Der direkte Umgang mit privaten Schlüsseln kann riskant sein, wenn er nicht sicher durchgeführt wird. Stellen Sie stets sicher, dass Ihre Umgebung sicher ist, und vermeiden Sie es, Ihren privaten Schlüssel unnötig offenzulegen.

Die Keystore-Struktur verstehen

Eine typische Keystore-Datei ist ein JSON-Objekt, das verschlüsselte Informationen über den privaten Schlüssel enthält. Hier ein Überblick über die wichtigsten Abschnitte der Datei:

  • crypto: Enthält verschlüsselungsbezogene Informationen.
    • ciphertext: Der verschlüsselte private Schlüssel.
    • cipher: Der für die Verschlüsselung verwendete Cipher-Algorithmus.
    • cipherparams: Enthält den Initialisierungsvektor (iv), der im Verschlüsselungsprozess verwendet wird.
    • kdf: Key Derivation Function (KDF), entweder pbkdf2 oder scrypt, verwendet, um den Verschlüsselungsschlüssel aus Ihrem Passwort abzuleiten.
    • kdfparams: Parameter für die KDF, wie Salt, Iterationen (c) und Schlüssellänge (dklen).
    • mac: Message Authentication Code, verwendet, um zu verifizieren, dass die Schlüsselableitung erfolgreich war.

So extrahieren Sie den privaten Schlüssel

Voraussetzungen

Um einen privaten Schlüssel aus einer Keystore-Datei zu extrahieren, benötigen Sie die folgenden PHP-Erweiterungen:

  1. php-json: Um die Keystore-Datei zu parsen (da sie im JSON-Format vorliegt).
  2. php-openssl: Erforderlich, um den privaten Schlüssel zu entschlüsseln (da Keystores AES-128-CTR für die Verschlüsselung verwenden).
  3. php-scrypt: Benötigt, wenn der Keystore die scrypt-KDF verwendet. Mehr dazu hier

Installieren Sie diese Erweiterungen mit:

Terminal window
sudo apt-get install php-json php-openssl
sudo pecl install scrypt

Sie benötigen außerdem:

  1. Den Inhalt der Keystore-Datei.
  2. Das Passwort, das zum Schutz des Keystores verwendet wurde.

1. Keystore und Passwort laden

Beginnen Sie damit, den Inhalt der Keystore-Datei in ein PHP-Array zu laden und das Passwort zu definieren, das zur Entschlüsselung des privaten Schlüssels verwendet wird:

// Load keystore JSON file
$keystore = file_get_contents('/path/to/keystore-file.json');
$keystore_json = json_decode($keystore, true);
// Define the password
$password = "YOUR_PASSWORD";

2. Verschlüsselungsdaten extrahieren

Die Verschlüsselungsdaten sind im Abschnitt crypto der Keystore-JSON gespeichert. Sie müssen die relevanten Felder extrahieren, um sie im Entschlüsselungsprozess zu verwenden.

$crypto = $keystore_json['crypto'];
$ciphertext = $crypto['ciphertext'];
$iv = $crypto['cipherparams']['iv'];
$salt = $crypto['kdfparams']['salt'];
$kdf = $crypto['kdf'];
$kdfparams = $crypto['kdfparams'];
$mac = $crypto['mac'];

3. Den Schlüssel ableiten

Als Nächstes leiten Sie den Schlüssel aus dem Passwort mithilfe der angegebenen KDF (pbkdf2 oder scrypt) ab. Ethereum-Keystores verwenden üblicherweise eine dieser beiden KDFs.

Für PBKDF2:

if ($kdf === 'pbkdf2') {
$derivedKey = hash_pbkdf2(
'sha256',
$password,
hex2bin($salt),
$kdfparams['c'], // iterations
$kdfparams['dklen'] * 2,
false
);
}

Für Scrypt:

Wenn der Keystore die scrypt-KDF verwendet, benötigen Sie die php-scrypt-Erweiterung aus den Voraussetzungen oben (pecl install scrypt). Sie implementiert scrypt mit denselben N-/r-/p-Parametern, die die Keystore-Datei angibt, und liefert den abgeleiteten Schlüssel – wie hash_pbkdf2() oben – standardmäßig als Hex-String zurück:

if ($kdf === 'scrypt') {
$N = $kdfparams['n'];
$r = $kdfparams['r'];
$p = $kdfparams['p'];
$dklen = $kdfparams['dklen'];
// Derive the key using the php-scrypt extension
$derivedKey = scrypt($password, hex2bin($salt), $N, $r, $p, $dklen);
}

4. Den MAC verifizieren

Bevor Sie den privaten Schlüssel entschlüsseln, verifizieren Sie, dass der MAC (Message Authentication Code) übereinstimmt. Das stellt sicher, dass die Schlüsselableitung erfolgreich war.

$derivedKeyPart = substr($derivedKey, 0, 32);
$calculatedMac = hash('sha3-256', hex2bin(substr($derivedKey, 32)) . hex2bin($ciphertext));
if ($calculatedMac !== $mac) {
die('MAC verification failed. The password may be incorrect or the keystore may be corrupted.');
}

5. Den privaten Schlüssel entschlüsseln

Wenn der MAC übereinstimmt, können Sie den privaten Schlüssel mit dem abgeleiteten Schlüssel entschlüsseln. Der private Schlüssel ist in Ethereum-Keystores mit dem AES-128-CTR-Cipher verschlüsselt.

$privateKey = openssl_decrypt(
hex2bin($ciphertext),
'aes-128-ctr',
hex2bin($derivedKeyPart),
OPENSSL_RAW_DATA,
hex2bin($iv)
);
if (!$privateKey) {
die('Failed to decrypt the private key.');
}
echo 'Private key: ' . bin2hex($privateKey);

An diesem Punkt sollten Sie den privaten Schlüssel erfolgreich entschlüsselt und ausgegeben haben.

Zum Abschluss

Wir sind die Schritte durchgegangen, um einen privaten Schlüssel aus einer Keystore-Datei mit PHP zu extrahieren. Durch das Laden des Keystores, das Ableiten des Verschlüsselungsschlüssels, das Verifizieren des MAC und das Entschlüsseln des privaten Schlüssels können wir den privaten Schlüssel auf sichere Weise wiederherstellen. Nachfolgend finden Sie das vollständige Codebeispiel, das den gesamten Prozess zusammenfasst.

Vollständiges Codebeispiel

<?php
// Step 1: Load keystore JSON file
$keystore = file_get_contents('/path/to/keystore-file.json');
$keystore_json = json_decode($keystore, true);
// Step 2: Define the password
$password = "YOUR_PASSWORD";
// Step 3: Extract relevant data from the keystore
$crypto = $keystore_json['crypto'];
$ciphertext = $crypto['ciphertext'];
$iv = $crypto['cipherparams']['iv'];
$salt = $crypto['kdfparams']['salt'];
$kdf = $crypto['kdf'];
$kdfparams = $crypto['kdfparams'];
$mac = $crypto['mac'];
// Step 4: Derive the key based on the KDF used (pbkdf2 or scrypt)
if ($kdf === 'pbkdf2') {
// PBKDF2 key derivation
$derivedKey = hash_pbkdf2(
'sha256',
$password,
hex2bin($salt),
$kdfparams['c'], // iterations
$kdfparams['dklen'] * 2,
false
);
} elseif ($kdf === 'scrypt') {
// Scrypt key derivation (requires the php-scrypt PECL extension)
$N = $kdfparams['n'];
$r = $kdfparams['r'];
$p = $kdfparams['p'];
$dklen = $kdfparams['dklen'];
$derivedKey = scrypt($password, hex2bin($salt), $N, $r, $p, $dklen);
} else {
die('Unsupported KDF method.');
}
// Step 5: Verify the MAC
$derivedKeyPart = substr($derivedKey, 0, 32);
$calculatedMac = hash('sha3-256', hex2bin(substr($derivedKey, 32)) . hex2bin($ciphertext));
if ($calculatedMac !== $mac) {
die('MAC verification failed. Wrong password or corrupted keystore.');
}
// Step 6: Decrypt the private key
$privateKey = openssl_decrypt(
hex2bin($ciphertext),
'aes-128-ctr',
hex2bin($derivedKeyPart),
OPENSSL_RAW_DATA,
hex2bin($iv)
);
if (!$privateKey) {
die('Failed to decrypt the private key.');
}
// Output the private key in hexadecimal format
echo 'Private key: ' . bin2hex($privateKey);

Unser kostenloses Tool

Wenn Sie nach einem einfachen und vollständig offline funktionierenden Weg suchen, um Keystore-Dateien zu entschlüsseln, schauen Sie sich unser kostenloses Tool an, verfügbar unter unser Keystore Decryptor Tool.

Dieses Tool funktioniert vollständig offline und gibt Ihnen die Sicherheit, mit Ihren sensiblen privaten Schlüsseldaten umzugehen, ohne jegliche Verbindung zum Internet. Um maximale Sicherheit zu gewährleisten, können Sie Ihren Computer während der Nutzung des Tools vom Internet trennen, sodass garantiert keine sensiblen Informationen offengelegt werden.

Sie können es auch über unser Github Repository herunterladen

Möchten Sie das selbst umsetzen? API-Key erhalten — 7 Tage kostenlos testen, keine Karte nötig — oder werfen Sie einen Blick auf Blockchain-API für die vollständige Endpoint-Referenz.

C
Chaingateway Team
Blockchain-Experten

Das Chaingateway-Team hat es sich zur Aufgabe gemacht, die Blockchain-Integration für Entwickler weltweit zu vereinfachen.