用同一份私钥来管理比特币与以太坊地址
zmhg799417
发表于 2022-12-25 19:02:27
150
0
0
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D95 P/ \- _& f/ u2 }4 y
9 ~) Z) |1 z: f
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。( @6 @6 o4 {- ~% E, M
. e& i. N3 X3 f5 A
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。5 K! }$ r& d/ ~" h1 ~
5 P y- _& o4 \) e
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。, y) w% c$ e5 N/ G
# w2 i) v0 `4 ~
生成以太坊地址跟比特币地址都是不需要连接网络的
python code 生成以太坊地址% T/ t5 G! l1 t7 g
python首先安装类库8 K4 b" \6 }) M5 d6 }' r! |
4 D0 J' c( u W9 v) `+ S
pip install ecdsa4 ]. c# h, O) l/ _) j5 P- s
pip install pysha39 } q; _+ F+ _1 g4 ?- h
' t7 e; D& @2 W8 e6 E" s( p
import binascii
& ~, Q( t! O- N3 k0 x) ^
import sha3' N7 ~1 A; H" y. m& i
- |8 C, l% b, j; k) s/ x
from ecdsa import SigningKey, SECP256k1
priv = SigningKey.generate(curve=SECP256k1) #生成私钥
* a7 U8 N: ~. \; Y7 B4 p& g6 l
pub = priv.get_verifying_key() #生成公钥
$ b, J. g% ]1 T
keccak = sha3.keccak_256()
* K* A. ~3 K/ @' {6 Y- o
keccak.update( pub.to_string()) #keccak_256哈希运算7 I7 n+ j! C5 Y6 u, z2 B9 Z- a1 ~
% i/ c, ~+ [! O6 S# M
address = "0x" + keccak.hexdigest()[24:]1 r' c1 [3 T9 v! j7 |
priv_key = binascii.hexlify( priv.to_string())
pub_key = binascii.hexlify( pub.to_string()): \! I0 j. {, V7 Q- s
3 m% f( I: ]3 I- P& m# }
print("Private key: " + priv_key.decode() )
/ ?& m( ]( Y8 @; {/ e* m6 U7 t% G. d& S
print("Public key: " + pub_key.decode() )( n C6 K# V+ @0 o
print("Address: " + address)
3 U: w4 l2 |+ X9 N- r) n( g4 v( ]
# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e
来个骚操作,用同一份私钥来管理比特币与以太坊! R6 S: X2 a- x/ I- |) z& v
既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。! k+ K! L7 A$ W, `3 P; V0 C2 M1 K6 `
那我们就用 Bitcoin地址是如何生成的得到的公钥
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。
这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。
import sha3- ?6 l; y9 u7 \
* j4 {5 R3 |: x" q
import binascii
& `( x- X6 S! S" \; l
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d"
_pub_key = _openssl_pub_key[2:]
1 d; c# N/ m" G, W
_pub_hex = binascii.unhexlify(_pub_key)/ @; X9 v2 I, u" b a, }( [
: m( _1 p/ G7 ]* J
keccak = sha3.keccak_256()
7 x7 [. o s* d! g/ |0 n
keccak.update(_pub_hex)
! ]0 r* P5 x* u7 ?' G) U; l
address = "0x" + keccak.hexdigest()[24:]- h; Z/ b; O* Y
print address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
2 f& _. ^) x3 \9 S$ p4 h5 g. D
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。
以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f
/ z+ @# I. q( q" s) V8 L9 K$ Z( [
与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。& S5 {: N7 r( S- Z- E0 x: U
4 f1 ^* J* }6 p$ \! @
这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
成为第一个吐槽的人