Blog
10 min de lecture
|
18 oct. 2024

Déchiffrer les keystores Ethereum, BNB et Polygon

Comment déchiffrer avec PHP la clé privée d'un fichier keystore Ethereum, BNB ou Polygon, étape par étape, sur le blog Chaingateway.

Chapitres
C
Chaingateway Team
Experts blockchain

Introduction

Ethereum, Binance Smart Chain (BSC) et d’autres réseaux compatibles EVM utilisent des fichiers keystore pour protéger les clés privées des utilisateurs. Un fichier keystore est un fichier JSON contenant une clé privée chiffrée, sécurisée par un mot de passe. Pour des raisons de sécurité, les applications ne stockent souvent que le fichier keystore, et non la clé privée en clair.

Dans cet article de blog, nous allons démontrer comment récupérer la clé privée à partir d’un fichier keystore à l’aide de PHP. Cela est particulièrement utile lorsque vous devez exporter ou récupérer votre clé privée pour l’utiliser dans une autre application.

Avertissement

Manipuler directement des clés privées peut être risqué si cela n’est pas fait de manière sécurisée. Assurez-vous toujours que votre environnement est sécurisé et évitez d’exposer inutilement votre clé privée.

Comprendre la structure du keystore

Un fichier keystore typique est un objet JSON contenant des informations chiffrées sur la clé privée. Voici un aperçu des principales sections du fichier :

  • crypto : Contient les informations liées au chiffrement.
    • ciphertext : La clé privée chiffrée.
    • cipher : L’algorithme de chiffrement utilisé.
    • cipherparams : Contient le vecteur d’initialisation (iv) utilisé dans le processus de chiffrement.
    • kdf : Fonction de dérivation de clé (KDF), soit pbkdf2 soit scrypt, utilisée pour dériver la clé de chiffrement à partir de votre mot de passe.
    • kdfparams : Paramètres de la KDF, tels que le sel, les itérations (c) et la longueur de clé (dklen).
    • mac : Code d’authentification de message, utilisé pour vérifier que la dérivation de clé a réussi.

Comment extraire la clé privée

Prérequis

Pour extraire une clé privée d’un fichier keystore, vous aurez besoin des extensions PHP suivantes :

  1. php-json : Pour analyser le fichier keystore (car il est au format JSON).
  2. php-openssl : Nécessaire pour déchiffrer la clé privée (les keystores utilisant AES-128-CTR pour le chiffrement).
  3. php-scrypt : Nécessaire si le keystore utilise la KDF scrypt. En savoir plus ici

Installez ces extensions avec :

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

Vous aurez également besoin de :

  1. Le contenu du fichier keystore.
  2. Le mot de passe utilisé pour protéger le keystore.

1. Charger le keystore et le mot de passe

Commencez par charger le contenu du fichier keystore dans un tableau PHP et définir le mot de passe qui sera utilisé pour déchiffrer la clé privée :

// 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. Extraire les données de chiffrement

Les données de chiffrement sont stockées dans la section crypto du JSON du keystore. Vous devrez extraire les champs pertinents pour les utiliser dans le processus de déchiffrement.

$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. Dériver la clé

Ensuite, dérivez la clé à partir du mot de passe en utilisant la KDF spécifiée (pbkdf2 ou scrypt). Les keystores Ethereum utilisent couramment l’une de ces deux KDF.

Pour PBKDF2 :

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

Pour Scrypt :

Si le keystore utilise la KDF scrypt, vous aurez besoin de l’extension php-scrypt mentionnée dans les prérequis ci-dessus (pecl install scrypt). Elle implémente scrypt avec les mêmes paramètres N/r/p que ceux spécifiés par le fichier keystore et, comme hash_pbkdf2() ci-dessus, renvoie par défaut la clé dérivée sous forme de chaîne hexadécimale :

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. Vérifier le MAC

Avant de déchiffrer la clé privée, vérifiez que le MAC (Message Authentication Code) correspond. Cela garantit que la dérivation de clé a réussi.

$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. Déchiffrer la clé privée

Si le MAC correspond, vous pouvez déchiffrer la clé privée à l’aide de la clé dérivée. La clé privée est chiffrée avec le chiffrement AES-128-CTR dans les keystores Ethereum.

$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);

À ce stade, vous devriez avoir déchiffré et affiché avec succès la clé privée.

Pour résumer

Nous avons parcouru les étapes pour extraire une clé privée d’un fichier keystore à l’aide de PHP. En chargeant le keystore, en dérivant la clé de chiffrement, en vérifiant le MAC et en déchiffrant la clé privée, nous pouvons récupérer la clé privée de manière sécurisée. Voici ci-dessous l’exemple de code complet résumant l’ensemble du processus.

Exemple de code complet

<?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);

Découvrez notre outil gratuit

Si vous recherchez un moyen simple et entièrement hors ligne de déchiffrer des fichiers keystore, découvrez notre outil gratuit disponible sur notre outil Keystore Decryptor.

Cet outil fonctionne entièrement hors ligne, vous donnant la confiance nécessaire pour gérer vos données de clé privée sensibles sans aucune connexion à internet. Pour garantir une sécurité absolue, vous pouvez déconnecter votre ordinateur d’internet pendant l’utilisation de l’outil, garantissant ainsi qu’aucune information sensible n’est exposée.

Vous pouvez également le télécharger sur notre dépôt Github

Prêt à le construire vous-même ? Obtenir votre clé API — essai de 7 jours, sans carte bancaire — ou consultez API Blockchain pour la référence complète des endpoints.

C
Chaingateway Team
Experts blockchain

L'équipe Chaingateway s'attache à simplifier l'intégration blockchain pour les développeurs du monde entier.