用同一份私钥来管理比特币与以太坊地址
zmhg799417
发表于 2022-12-25 19:02:27
86
0
0
" H& }; U- ]7 Y* P
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9" t$ B- B! \; h, e8 @& A
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。
) W2 l% {% }2 O- D) \$ X
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。6 _- {, ]$ t( D+ d0 N% L3 t* O
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。9 O& O$ g. [- S! w/ T% m
4 u7 I+ g ^0 m U) o' M
生成以太坊地址跟比特币地址都是不需要连接网络的
# G! n4 s t& P* \! f
python code 生成以太坊地址3 T/ M1 `/ |' o; X4 M. X' d) H
python首先安装类库
pip install ecdsa
pip install pysha3' U7 {9 r4 [- {* t4 d
import binascii
# [1 L% t5 d' o! T
import sha3
from ecdsa import SigningKey, SECP256k1; I1 i% w! q8 H# H
7 w6 u; h m. B( \3 Z& o
priv = SigningKey.generate(curve=SECP256k1) #生成私钥+ ]$ S$ J. Z3 ]
0 Z1 a2 N* a1 U: Y7 G3 \/ X
pub = priv.get_verifying_key() #生成公钥$ A' _2 L* T0 t$ t" O5 S
?. h2 A) X" w+ ]2 ~# u9 K7 g. `
keccak = sha3.keccak_256()- N' C0 {! x$ H- u* x
/ h! V: k, R5 K% h% ~% w
keccak.update( pub.to_string()) #keccak_256哈希运算
address = "0x" + keccak.hexdigest()[24:]
# _* A9 l4 ^6 B
priv_key = binascii.hexlify( priv.to_string())' _, |9 g* K6 g# r t$ L
# T) i* Y6 p) k y% x6 q# R; {" r
pub_key = binascii.hexlify( pub.to_string())
print("Private key: " + priv_key.decode() )2 j. P6 Y. A; c8 v2 \ L
% E2 R) {: g! n. D" F
print("Public key: " + pub_key.decode() )
7 k1 }. P+ W0 b3 \. M3 b/ e$ w
print("Address: " + address)- P. l W7 ]; m
4 Q @: `0 @7 J" J
# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e8 j8 q: p T$ H% D
) n3 D/ X: |- Y9 B# I; D
来个骚操作,用同一份私钥来管理比特币与以太坊" G7 e0 D0 Q) z" H* o# a) c, [
! ?. t: {4 E* n8 \% P
既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
) J3 a8 |1 I: e4 Y8 u
那我们就用 Bitcoin地址是如何生成的得到的公钥
! [% R3 A7 r7 t( M F/ \
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。% p# X8 |: _$ m0 `( A1 p2 Z8 K
# a# v; {: @8 F4 T2 ]0 n, `
这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。! }. [% B8 B& H0 A
import sha3
import binascii* p) v& J! [. B' W$ T
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d"
_pub_key = _openssl_pub_key[2:]/ E& ^. b% d6 T6 n. v3 U9 V, i* X
_pub_hex = binascii.unhexlify(_pub_key). R& o; t2 J# x/ V2 \2 U; I% |0 o( @
+ A' L) z+ Q' U6 y! K7 A
keccak = sha3.keccak_256(). S Q0 ~/ h; e+ Y
keccak.update(_pub_hex)
- S- _$ I: [7 ?
address = "0x" + keccak.hexdigest()[24:]! @* j' k y" x
7 v# P4 b7 E9 o; Q$ Z$ a
print address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f [$ x7 T& X5 i2 C7 {$ s
$ \1 \* {" ^0 R$ ~- h8 Z: u7 s
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。9 l6 x; e D; S0 U
" a5 @. N. u" A& ~% l- K# b' z/ a
以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f* {$ Z9 D( V7 K8 ]! ^/ J+ [
与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。
?; O0 }" A8 R* P
这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
成为第一个吐槽的人