paint-brush
Cómo generar una dirección de Ethereum a partir de una clave privada usando Pythonpor@rareskills
6,339 lecturas
6,339 lecturas

Cómo generar una dirección de Ethereum a partir de una clave privada usando Python

por RareSkills4m2023/06/01
Read on Terminal Reader

Demasiado Largo; Para Leer

Una dirección ethereum son los últimos 20 bytes del keccack256 de la clave pública. El algoritmo de clave pública es secp256k1, el mismo que se usa en bitcoin. Debido a que es un algoritmo de curva elíptica, la clave pública es un par (x, y) que corresponde a un punto en la curva elíptica.
featured image - Cómo generar una dirección de Ethereum a partir de una clave privada usando Python
RareSkills HackerNoon profile picture
0-item
1-item
2-item

Una dirección ethereum son los últimos 20 bytes del keccack256 de la clave pública. El algoritmo de clave pública es secp256k1, el mismo que se usa en bitcoin.


Debido a que es un algoritmo de curva elíptica, la clave pública es un par (x, y) que corresponde a un punto en la curva elíptica.

Genere la clave pública de la curva elíptica.

La clave pública es la concatenación de x e y, y de eso tomamos el hash.

El código se proporciona a continuación.


 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 biblioteca ecpy está aquí https://github.com/cslashm/ECPy . Esta biblioteca implementa la matemática de la curva elíptica en python, por lo que no será tan rápida como un contenedor alrededor de la implementación de bitcoin C, que es utilizada por la biblioteca coincurve .


Sin embargo, la implementación de python le permite ver paso a paso la matemática de la curva elíptica utilizada para derivar la clave pública.


Puede usar este código para generar una dirección personalizada de ethereum con fuerza bruta, pero tenga en cuenta que si su fuente de aleatoriedad no es segura o no tiene suficiente aleatoriedad, puede ser víctima de un ataque similar a este .

Genere una clave privada con python y lanzamientos de monedas o dados

Usted mismo puede generar una dirección de Ethereum a partir de una clave privada lanzando una moneda al aire 256 veces y escribiendo en una cadena un 1 si es cara y un 0 si es cruz.

Digamos que obtienes el siguiente resultado

 result = b'1100001011001101010001001100101000001111101101111011001000110001101100011101101011010001011000101111100110010101001001101110111011001000100001010101111100001100100110010010111110110100000010011111100000110101001110000101100101011111001101010001100001000'


Puede convertir eso en una clave privada usando el siguiente código de Python


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


Luego, inserte esa clave privada en el código de la sección anterior y habrá generado su dirección con su propia aleatoriedad.


Lo mismo se puede lograr más rápido lanzando un dado de 16 caras 64 veces y escribiendo la cadena hexadecimal que se produce carácter por carácter. Tenga en cuenta que la mayoría de los dados no tienen una representación para el número cero, por lo que deberá restar 1 de cada resultado.


Si solo tiene seis lados tradicionales, puede escribir una cadena en base 6 (no olvide restar 1 de cada rollo) y hacer una conversión de base a binario. Deberá continuar hasta que tenga al menos 256 bits para su clave privada. Si está particularmente paranoico acerca de la aleatoriedad, puede usar dados de calidad de casino.


Tenga cuidado al usar la biblioteca de números aleatorios incorporada para Python. No pretende ser criptográficamente seguro. Recomendamos familiarizarse con la aleatoriedad criptográficamente segura si es nuevo en el tema.


Por lo general, no puede inicializar una billetera de hardware con este método porque la frase de recuperación de 24 palabras que usan no es lo mismo que una clave privada que se usa para firmar transacciones. La frase de recuperación de 24 palabras se usa para derivar múltiples claves privadas para diferentes tipos de criptografía que contiene la billetera.

Matemáticas: Acerca de secp256k1: clave pública de clave privada

Ya hay mucho material en línea que describe cómo se ve visualmente la suma de curvas, por lo que lo describiremos en un nivel inferior aquí.

La forma de la curva

Secp256k1 define la forma de la curva elíptica y^2 = x^3 + y (mod p) donde p es el número primo 115792089237316195423570985008687907853269984665640564039457584007908834671663

o 2^256 – 2^32 – 977


El primo p no debe confundirse con el orden de la curva. No todos los valores 0 < n < p satisfacen la ecuación anterior. Sin embargo, se garantiza que las operaciones en la curva se cerrarán . Es decir, si se suman o multiplican dos puntos válidos, el resultado será un número válido en la curva.

El punto de partida

El otro parámetro importante en secp256k1 es el punto de partida G. Dado que G es un punto en la curva elíptica, es bidimensional y tiene los parámetros

 x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424


Para ver que G es un punto válido, podemos conectar los números en python

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

Para crear un par de claves pública/privada, se crea un número aleatorio s (esta es la clave secreta). El punto G se suma a sí mismo s veces y el nuevo punto (x, y) es la clave pública. No es factible derivar s de G.


Sumar G a sí mismo s veces es lo mismo que multiplicar s * G. De hecho, podemos ver esta operación en un nivel inferior eliminando algunas de las abstracciones que proporciona la biblioteca.


 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 clave pública es simplemente la clave privada multiplicada por el punto G en la curva elíptica secp256k1. Eso es todo.

Aprende más

Echa un vistazo a nuestro campo de entrenamiento avanzado de blockchain hoy y conviértete en un desarrollador de blockchain que conoce las cosas difíciles que otros codificadores no conocen.


También publicado aquí .