Come decifrare i keystore di Ethereum, BNB e Polygon
Come decifrare con PHP la chiave privata da un file keystore di Ethereum, BNB o Polygon, passo dopo passo, sul blog di Chaingateway.
Introduzione
Ethereum, Binance Smart Chain (BSC) e altre reti compatibili con EVM utilizzano file keystore per proteggere le chiavi private degli utenti. Un file keystore è un file JSON che contiene una chiave privata cifrata, protetta con una password. Per motivi di sicurezza, le applicazioni spesso memorizzano solo il file keystore, non la chiave privata in chiaro.
In questo articolo del blog, mostreremo come recuperare la chiave privata da un file keystore utilizzando PHP. Ciò è particolarmente utile quando è necessario esportare o recuperare la propria chiave privata per l’uso in un’altra applicazione.
Avviso
Gestire direttamente le chiavi private può essere rischioso se non viene fatto in modo sicuro. Assicuratevi sempre che il vostro ambiente sia sicuro ed evitate di esporre inutilmente la vostra chiave privata.
Comprendere la struttura del keystore
Un tipico file keystore è un oggetto JSON che contiene informazioni cifrate sulla chiave privata. Ecco una panoramica delle sezioni chiave del file:
crypto: Contiene informazioni relative alla crittografia.ciphertext: La chiave privata cifrata.cipher: L’algoritmo di cifratura utilizzato.cipherparams: Contiene il vettore di inizializzazione (iv) utilizzato nel processo di cifratura.kdf: Funzione di derivazione della chiave (KDF),pbkdf2oscrypt, utilizzata per derivare la chiave di cifratura dalla password.kdfparams: Parametri per la KDF, come il salt, le iterazioni (c) e la lunghezza della chiave (dklen).mac: Codice di autenticazione del messaggio, utilizzato per verificare che la derivazione della chiave sia andata a buon fine.
Come estrarre la chiave privata
Prerequisiti
Per estrarre una chiave privata da un file keystore, avrete bisogno delle seguenti estensioni PHP:
- php-json: Per analizzare il file keystore (poiché è in formato JSON).
- php-openssl: Necessaria per decifrare la chiave privata (poiché i keystore utilizzano AES-128-CTR per la cifratura).
- php-scrypt: Necessaria se il keystore utilizza la KDF
scrypt. Ulteriori informazioni qui
Installate queste estensioni con:
sudo apt-get install php-json php-opensslsudo pecl install scryptAvrete inoltre bisogno di:
- Il contenuto del file keystore.
- La password utilizzata per proteggere il keystore.
1. Caricare il keystore e la password
Iniziate caricando il contenuto del file keystore in un array PHP e definendo la password che verrà utilizzata per decifrare la chiave privata:
// 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. Estrarre i dati di cifratura
I dati di cifratura sono memorizzati nella sezione crypto del JSON del keystore. Sarà necessario estrarre i campi rilevanti per utilizzarli nel processo di decifratura.
$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. Derivare la chiave
Successivamente, derivate la chiave dalla password utilizzando la KDF specificata (pbkdf2 o scrypt). I keystore di Ethereum utilizzano comunemente una di queste due KDF.
Per PBKDF2:
if ($kdf === 'pbkdf2') { $derivedKey = hash_pbkdf2( 'sha256', $password, hex2bin($salt), $kdfparams['c'], // iterations $kdfparams['dklen'] * 2, false );}Per Scrypt:
Se il keystore utilizza la KDF scrypt, sarà necessaria l’estensione php-scrypt indicata nei prerequisiti sopra (pecl install scrypt). Implementa scrypt con gli stessi parametri N/r/p specificati dal file keystore e, come hash_pbkdf2() sopra, restituisce per impostazione predefinita la chiave derivata come stringa esadecimale:
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. Verificare il MAC
Prima di decifrare la chiave privata, verificate che il MAC (Codice di Autenticazione del Messaggio) corrisponda. Ciò garantisce che la derivazione della chiave sia andata a buon fine.
$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. Decifrare la chiave privata
Se il MAC corrisponde, potete decifrare la chiave privata utilizzando la chiave derivata. Nei keystore di Ethereum, la chiave privata è cifrata con il cifrario AES-128-CTR.
$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);A questo punto, dovreste aver decifrato e stampato con successo la chiave privata.
Per riassumere
Abbiamo esaminato i passaggi per estrarre una chiave privata da un file keystore utilizzando PHP. Caricando il keystore, derivando la chiave di cifratura, verificando il MAC e decifrando la chiave privata, possiamo recuperare la chiave privata in modo sicuro. Di seguito è riportato l’esempio di codice completo che riassume l’intero processo.
Esempio di codice completo
<?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 formatecho 'Private key: ' . bin2hex($privateKey);Presentiamo il nostro strumento gratuito
Se cercate un modo semplice e completamente offline per decifrare i file keystore, date un’occhiata al nostro strumento gratuito disponibile su il nostro Keystore Decryptor Tool.
Questo strumento funziona completamente offline, dandovi la sicurezza di gestire i vostri dati sensibili relativi alla chiave privata senza alcuna connessione a internet. Per garantire la massima sicurezza, potete scollegare il computer da internet durante l’utilizzo dello strumento, garantendo che nessuna informazione sensibile venga esposta.
Potete anche scaricarlo dal nostro repository Github
Pronto a costruirlo da solo? Ottieni la tua API key — prova di 7 giorni, senza carta — oppure consulta Blockchain API per il riferimento completo degli endpoint.