paint-brush
Cách tạo địa chỉ Ethereum từ khóa riêng bằng Pythontừ tác giả@rareskills
6,344 lượt đọc
6,344 lượt đọc

Cách tạo địa chỉ Ethereum từ khóa riêng bằng Python

từ tác giả RareSkills4m2023/06/01
Read on Terminal Reader

dài quá đọc không nổi

Địa chỉ ethereum là 20 byte cuối cùng của keccack256 của khóa chung. Thuật toán khóa công khai là secp256k1, được sử dụng tương tự trong bitcoin. Vì là thuật toán đường cong elip nên khóa công khai là cặp (x, y) tương ứng với một điểm trên đường cong elip.
featured image - Cách tạo địa chỉ Ethereum từ khóa riêng bằng Python
RareSkills HackerNoon profile picture
0-item
1-item
2-item

Địa chỉ ethereum là 20 byte cuối cùng của keccack256 của khóa chung. Thuật toán khóa công khai là secp256k1, được sử dụng tương tự trong bitcoin.


Vì là thuật toán đường cong elip nên khóa công khai là cặp (x, y) tương ứng với một điểm trên đường cong elip.

Tạo khóa công khai đường cong Elliptic.

Khóa công khai là sự kết hợp của x và y, và đó là những gì chúng tôi lấy hàm băm.

Mã được cung cấp dưới đây.


 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)


Thư viện ecpy ở đây https://github.com/cslashm/ECPy . Thư viện này triển khai toán học đường cong elip trong python, vì vậy nó sẽ không nhanh bằng trình bao bọc xung quanh việc triển khai bitcoin C, được sử dụng bởi thư viện coincurve .


Tuy nhiên, việc triển khai python cho phép bạn xem từng bước phép toán đường cong elip được sử dụng để lấy khóa chung.


Bạn có thể sử dụng mã này để tạo địa chỉ ảo ethereum bằng vũ lực, nhưng hãy lưu ý rằng nếu nguồn ngẫu nhiên của bạn không an toàn hoặc không đủ ngẫu nhiên, bạn có thể trở thành nạn nhân của một vụ hack tương tự như thế này .

Tạo khóa riêng bằng trăn và lật đồng xu hoặc xúc xắc

Bạn có thể tự tạo địa chỉ Ethereum từ khóa cá nhân bằng cách tung một đồng xu 256 lần và ghi vào một chuỗi 1 nếu là mặt ngửa và 0 nếu là mặt sấp.

Giả sử bạn nhận được kết quả sau

 result = b'1100001011001101010001001100101000001111101101111011001000110001101100011101101011010001011000101111100110010101001001101110111011001000100001010101111100001100100110010010111110110100000010011111100000110101001110000101100101011111001101010001100001000'


Bạn có thể chuyển đổi nó thành khóa riêng bằng mã python sau


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


Sau đó, cắm khóa riêng đó vào mã từ phần trên và bạn đã tạo địa chỉ của mình một cách ngẫu nhiên.


Điều tương tự có thể được thực hiện nhanh hơn bằng cách tung một con xúc xắc 16 mặt 64 lần và viết ra chuỗi lục giác được tạo ra theo từng ký tự. Hãy lưu ý rằng hầu hết các viên xúc xắc không có đại diện cho số 0, vì vậy bạn sẽ phải trừ 1 cho mỗi kết quả.


Nếu bạn chỉ có sáu mặt truyền thống, bạn có thể viết ra một chuỗi trong cơ số 6 (đừng quên trừ 1 cho mỗi cuộn) và thực hiện chuyển đổi cơ số thành nhị phân. Bạn sẽ cần tiếp tục cuộn cho đến khi có ít nhất 256 bit cho khóa riêng của mình. Nếu bạn đặc biệt hoang tưởng về tính ngẫu nhiên, bạn có thể sử dụng xúc xắc cấp sòng bạc.


Hãy thận trọng khi sử dụng thư viện số ngẫu nhiên tích hợp sẵn cho Python. Nó không có ý định bảo mật bằng mật mã. Chúng tôi khuyên bạn nên tự làm quen với tính ngẫu nhiên được bảo mật bằng mật mã nếu bạn chưa quen với chủ đề này.


Nói chung, bạn không thể khởi tạo ví phần cứng bằng phương pháp này vì cụm từ khôi phục 24 từ mà họ sử dụng không giống với khóa riêng được sử dụng để ký giao dịch. Cụm từ khôi phục 24 từ được sử dụng để lấy nhiều khóa riêng tư cho các loại tiền điện tử khác nhau mà ví chứa.

Toán học: Giới thiệu về secp256k1: Khóa công khai từ Khóa riêng

Hiện đã có rất nhiều tài liệu trực tuyến mô tả việc bổ sung đường cong trông như thế nào một cách trực quan , vì vậy chúng tôi sẽ mô tả nó ở cấp độ thấp hơn ở đây.

Hình dạng của đường cong

Secp256k1 xác định hình dạng của đường cong elip y^2 = x^3 + y (mod p) trong đó p là số nguyên tố 115792089237316195423570985008687907853269984665640564039457584007908834671663

hoặc 2^256 – 2^32 – 977


Không nên nhầm lẫn số nguyên tố p với thứ tự của đường cong. Không phải mọi giá trị 0 < n < p đều thỏa mãn phương trình trên. Tuy nhiên, các hoạt động trên đường cong được đảm bảo được đóng lại . Nghĩa là, nếu hai điểm hợp lệ được cộng hoặc nhân, kết quả sẽ là một số hợp lệ trên đường cong.

Điểm băt đâu

Tham số quan trọng khác trong secp256k1 là điểm bắt đầu G. Vì G là một điểm trên đường cong elip nên nó là 2 chiều và có các tham số

 x = 55066263022277343669578718895168534326250603453777594175500187360389116729240 y = 32670510020758816978083085130507043184471273380659243275938904335757337482424


Để xem G là một điểm hợp lệ, chúng ta có thể cắm các số vào python

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

Để tạo cặp khóa công khai/riêng tư, một số s ngẫu nhiên được tạo (đây là khóa bí mật). Điểm G được thêm vào chính nó s lần và điểm mới (x, y) là khóa công khai. Không thể lấy được s từ G.


Cộng G với chính nó s lần cũng giống như nhân s * G. Thực tế, chúng ta có thể thấy thao tác này ở cấp độ thấp hơn bằng cách loại bỏ một số trừu tượng mà thư viện đang cung cấp.


 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)


Khóa chung chỉ đơn giản là khóa riêng nhân với điểm G trên đường cong elip secp256k1. Đó là nó.

Tìm hiểu thêm

Hãy xem chương trình đào tạo blockchain nâng cao của chúng tôi ngay hôm nay và trở thành nhà phát triển blockchain biết những thứ khó mà các lập trình viên khác không biết.


Cũng được xuất bản ở đây .