paint-brush
Comment générer une adresse Ethereum à partir d'une clé privée à l'aide de Pythonpar@rareskills
6,332 lectures
6,332 lectures

Comment générer une adresse Ethereum à partir d'une clé privée à l'aide de Python

par RareSkills4m2023/06/01
Read on Terminal Reader

Trop long; Pour lire

Une adresse Ethereum correspond aux 20 derniers octets du keccack256 de la clé publique. L'algorithme à clé publique est secp256k1, le même que celui utilisé dans le bitcoin. Comme il s'agit d'un algorithme de courbe elliptique, la clé publique est une paire (x, y) correspondant à un point sur la courbe elliptique.
featured image - Comment générer une adresse Ethereum à partir d'une clé privée à l'aide de Python
RareSkills HackerNoon profile picture
0-item
1-item
2-item

Une adresse Ethereum correspond aux 20 derniers octets du keccack256 de la clé publique. L'algorithme à clé publique est secp256k1, le même que celui utilisé dans le bitcoin.


Comme il s'agit d'un algorithme de courbe elliptique, la clé publique est une paire (x, y) correspondant à un point sur la courbe elliptique.

Générez la clé publique de la courbe elliptique.

La clé publique est la concaténation de x et y, et c'est de cela que nous prenons le hachage.

Le code est fourni ci-dessous.


 from ecpy.curves import Curve from ecpy.keys import ECPublicKey, ECPrivateKey from sha3 import keccak_256 private_key = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 cv = Curve.get_curve('secp256k1') pv_key = ECPrivateKey(private_key, cv) pu_key = pv_key.get_public_key() # equivalent alternative for illustration: # concat_x_y = bytes.fromhex(hex(pu_key.Wx)[2:] + hex(pu_key.Wy)[2:]) concat_x_y = pu_key.Wxto_bytes(32, byteorder='big') + pu_key.Wyto_bytes(32, byteorder='big') eth_addr = '0x' + keccak_256(concat_x_y).digest()[-20:].hex() print('private key: ', hex(private_key)) print('eth_address: ', eth_addr)


La bibliothèque ecpy est ici https://github.com/cslashm/ECPy . Cette bibliothèque implémente les mathématiques de la courbe elliptique en python, elle ne sera donc pas aussi rapide qu'un wrapper autour de l'implémentation bitcoin C, qui est utilisée par la bibliothèque coincurve .


Cependant, l'implémentation de python vous permet de voir étape par étape les mathématiques de la courbe elliptique utilisées pour dériver la clé publique.


Vous pouvez utiliser ce code pour générer une adresse de vanité Ethereum avec une force brute, mais gardez à l'esprit que si votre source d'aléatoire n'est pas sécurisée ou a un caractère aléatoire insuffisant, vous pouvez être victime d'un piratage similaire à celui-ci .

Générer une clé privée avec python et des lancers de pièces ou des dés

Vous pouvez générer vous-même une adresse Ethereum à partir d'une clé privée en lançant une pièce 256 fois et en écrivant dans une chaîne un 1 si c'est face et 0 si c'est pile.

Disons que vous obtenez le résultat suivant

 result = b'1100001011001101010001001100101000001111101101111011001000110001101100011101101011010001011000101111100110010101001001101110111011001000100001010101111100001100100110010010111110110100000010011111100000110101001110000101100101011111001101010001100001000'


Vous pouvez le convertir en clé privée en utilisant le code python suivant


 # 2 means base 2 for binary private_key = hex(int(result, 2)) # private key is 0x1859a89941f6f646363b5a2c5f32a4ddd910abe19325f6813f06a70b2be6a308


Ensuite, branchez cette clé privée dans le code de la section ci-dessus et vous avez généré votre adresse avec votre propre caractère aléatoire.


La même chose peut être accomplie plus rapidement en lançant un dé à 16 faces 64 fois et en écrivant la chaîne hexadécimale qui est produite caractère par caractère. N'oubliez pas que la plupart des dés n'ont pas de représentation pour le nombre zéro, vous devrez donc soustraire 1 de chaque résultat.


Si vous n'avez que six côtés traditionnels, vous pouvez écrire une chaîne en base 6 (n'oubliez pas de soustraire 1 de chaque rouleau) et faire une conversion de base en binaire. Vous devrez continuer jusqu'à ce que vous ayez au moins 256 bits pour votre clé privée. Si vous êtes particulièrement paranoïaque à propos du hasard, vous pouvez utiliser des dés de qualité casino.


Soyez prudent en utilisant la bibliothèque de nombres aléatoires intégrée pour Python. Il n'est pas destiné à être cryptographiquement sécurisé. Nous vous recommandons de vous familiariser avec l'aléatoire cryptographiquement sécurisé si vous êtes nouveau sur le sujet.


Généralement, vous ne pouvez pas initialiser un portefeuille matériel en utilisant cette méthode car la phrase de récupération de 24 mots qu'ils utilisent n'est pas la même chose qu'une clé privée utilisée pour signer des transactions. La phrase de récupération de 24 mots est utilisée pour dériver plusieurs clés privées pour différents types de crypto que le portefeuille contient.

Math : À propos de secp256k1 : clé publique à partir de la clé privée

Il existe déjà de nombreux documents en ligne décrivant à quoi ressemble visuellement l'ajout de courbes, nous allons donc le décrire à un niveau inférieur ici.

La forme de la courbe

Secp256k1 définit la forme de la courbe elliptique y^2 = x^3 + y (mod p) où p est le nombre premier 115792089237316195423570985008687907853269984665640564039457584007908834671663

ou 2^256 – 2^32 – 977


Le premier p ne doit pas être confondu avec l' ordre de la courbe. Toutes les valeurs 0 < n < p ne satisfont pas l'équation ci-dessus. Cependant, les opérations sur la courbe sont garanties fermées . Autrement dit, si deux points valides sont ajoutés ou multipliés, le résultat sera un nombre valide sur la courbe.

Le point de départ

L'autre paramètre important dans secp256k1 est le point de départ G. Puisque G est un point sur la courbe elliptique, il est bidimensionnel et a les paramètres

 x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424


Pour voir G est un point valide, nous pouvons brancher les nombres en python

 x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424 p = 115792089237316195423570985008687907853269984665640564039457584007908834671663 assert pow(y, 2, p) == (pow(x, 3) + 7) % p

Pour créer une paire de clés publique/privée, un nombre aléatoire s est créé (il s'agit de la clé secrète). Le point G est ajouté à lui-même s fois et le nouveau point (x, y) est la clé publique. Il n'est pas possible de dériver s de G.


Ajouter G à lui-même s fois revient à multiplier s * G. En fait, nous pouvons voir cette opération à un niveau inférieur en supprimant certaines des abstractions fournies par la bibliothèque.


 from ecpy.curves import Curve from sha3 import keccak_256 private_key = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 cv = Curve.get_curve('secp256k1') pu_key = private_key * cv.generator # just multiplying the private key by generator point (EC multiplication) concat_x_y = pu_key.x.to_bytes(32, byteorder='big') + pu_key.y.to_bytes(32, byteorder='big') eth_addr = '0x' + keccak_256(concat_x_y).digest()[-20:].hex() print('private key: ', hex(private_key)) print('eth_address: ', eth_addr)


La clé publique est simplement la clé privée multipliée par le point G sur la courbe elliptique secp256k1. C'est ça.

Apprendre encore plus

Découvrez notre bootcamp blockchain avancé aujourd'hui et devenez un développeur blockchain qui connaît les choses difficiles que les autres codeurs ne connaissent pas.


Également publié ici .