paint-brush
Como gerar um endereço Ethereum a partir de uma chave privada usando Pythonpor@rareskills
6,311 leituras
6,311 leituras

Como gerar um endereço Ethereum a partir de uma chave privada usando Python

por RareSkills4m2023/06/01
Read on Terminal Reader

Muito longo; Para ler

Um endereço ethereum são os últimos 20 bytes do keccack256 da chave pública. O algoritmo de chave pública é o secp256k1, o mesmo usado no bitcoin. Por ser um algoritmo de curva elíptica, a chave pública é um par (x, y) que corresponde a um ponto na curva elíptica.
featured image - Como gerar um endereço Ethereum a partir de uma chave privada usando Python
RareSkills HackerNoon profile picture
0-item
1-item
2-item

Um endereço ethereum são os últimos 20 bytes do keccack256 da chave pública. O algoritmo de chave pública é o secp256k1, o mesmo usado no bitcoin.


Por ser um algoritmo de curva elíptica, a chave pública é um par (x, y) que corresponde a um ponto na curva elíptica.

Gere a chave pública da curva elíptica.

A chave pública é a concatenação de x e y, e é dela que extraímos o hash.

O código é fornecido abaixo.


 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)


A biblioteca ecpy está aqui https://github.com/cslashm/ECPy . Esta biblioteca implementa a matemática da curva elíptica em python, então não será tão rápida quanto um wrapper em torno da implementação bitcoin C, que é usada pela biblioteca coincurve .


No entanto, a implementação do python permite que você veja passo a passo a matemática da curva elíptica usada para derivar a chave pública.


Você pode usar este código para gerar um endereço virtual ethereum com força bruta, mas lembre-se de que, se sua fonte de aleatoriedade não for segura ou tiver aleatoriedade insuficiente, você poderá ser vítima de um hack semelhante a este .

Gere chave privada com python e cara ou coroa ou dados

Você mesmo pode gerar um endereço Ethereum a partir de uma chave privada jogando uma moeda 256 vezes e escrevendo em uma string um 1 se for cara e 0 se for coroa.

Digamos que você obtenha o seguinte resultado

 result = b'1100001011001101010001001100101000001111101101111011001000110001101100011101101011010001011000101111100110010101001001101110111011001000100001010101111100001100100110010010111110110100000010011111100000110101001110000101100101011111001101010001100001000'


Você pode converter isso em uma chave privada usando o seguinte código python


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


Em seguida, insira essa chave privada no código da seção acima e você gerou seu endereço com sua própria aleatoriedade.


A mesma coisa pode ser realizada mais rapidamente jogando um dado de 16 lados 64 vezes e escrevendo a sequência hexadecimal que é produzida caractere por caractere. Esteja ciente de que a maioria dos dados não tem uma representação para o número zero, então você terá que subtrair 1 de cada resultado.


Se você tiver apenas seis lados tradicionais, poderá escrever uma string na base 6 (não se esqueça de subtrair 1 de cada rolo) e fazer uma conversão de base para binário. Você precisará continuar rolando até ter pelo menos 256 bits para sua chave privada. Se você é particularmente paranóico com a aleatoriedade, pode usar dados de nível de cassino.


Seja cauteloso ao usar a biblioteca de números aleatórios integrada para Python. Não se destina a ser criptograficamente seguro. Recomendamos familiarizar-se com a aleatoriedade criptograficamente segura se você for novo no assunto.


Geralmente, você não pode inicializar uma carteira de hardware usando este método porque a frase de recuperação de 24 palavras que eles usam não é a mesma coisa que uma chave privada usada para assinar transações. A frase de recuperação de 24 palavras é usada para derivar várias chaves privadas para diferentes tipos de criptografia que a carteira possui.

Matemática: Sobre secp256k1: Chave pública da chave privada

Já existe muito material on-line descrevendo como é visualmente a adição de curvas , portanto, vamos descrevê-lo em um nível inferior aqui.

A forma da curva

Secp256k1 define a forma da curva elíptica y^2 = x^3 + y (mod p) onde p é o número primo 115792089237316195423570985008687907853269984665640564039457584007908834671663

ou 2^256 – 2^32 – 977


O primo p não deve ser confundido com a ordem da curva. Nem todo valor 0 < n < p satisfaz a equação acima. No entanto, as operações na curva são garantidas como fechadas . Ou seja, se dois pontos válidos forem somados ou multiplicados, o resultado será um número válido na curva.

O ponto de partida

O outro parâmetro importante em secp256k1 é o ponto inicial G. Como G é um ponto na curva elíptica, ele é bidimensional e tem os parâmetros

 x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424


Para ver que G é um ponto válido, podemos inserir os números em python

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

Para criar um par de chaves pública/privada, um número aleatório s é criado (essa é a chave secreta). O ponto G é adicionado a si mesmo s vezes e o novo ponto (x, y) é a chave pública. Não é possível derivar s de G.


Adicionar G a si mesmo s vezes é o mesmo que multiplicar s * G. Na verdade, podemos ver essa operação em um nível inferior removendo algumas das abstrações que a biblioteca está fornecendo.


 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)


A chave pública é simplesmente a chave privada multiplicada pelo ponto G na curva elíptica secp256k1. É isso.

Saber mais

Confira nosso bootcamp de blockchain avançado hoje e torne-se um desenvolvedor de blockchain que conhece as coisas difíceis que outros codificadores não conhecem.


Publicado também aqui .