用同一份私钥来管理比特币与以太坊地址
zmhg799417
发表于 2022-12-25 19:02:27
83
0
0
3 C$ t0 H5 x2 G; r3 ?6 Q4 B
eth address: 0xd91c747b4a76B8013Aa336Cbc52FD95a7a9BD3D9% `) J1 R ?; K R' Z
以太坊生成地址的方式跟比特币比较类似,也是 私钥 -> 公钥 -> 地址,以太坊只是在公钥 -> 地址做了简化。
; e; m6 ]8 c5 j, O c; u
以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
* }/ m H4 w/ p, Y
得到公钥后,对公钥做Keccak-256哈希运算,然后取最后的40位16进制字符,得到的就是以太坊地址。
生成以太坊地址跟比特币地址都是不需要连接网络的' X# }. P$ M$ F6 d" n! x. {
python code 生成以太坊地址6 K% K* u* N$ }! [. f7 v2 h" S& G
python首先安装类库
7 F, s- p7 s1 Z& c6 Q! u8 O
pip install ecdsa$ q d3 H4 f" m1 N* l) a
* D' ~- j3 n4 t- ]$ n4 P, H
pip install pysha33 U% B2 _' _4 N; U
import binascii+ Z8 _+ u( ^3 n8 N2 W- e
import sha3! i3 M* P; B c& l* g' w
: t( e6 X/ e& W" H' c! q
from ecdsa import SigningKey, SECP256k13 {5 m! S2 X0 _7 a4 `
/ ~1 n3 e: y" o8 h9 }- }
priv = SigningKey.generate(curve=SECP256k1) #生成私钥3 m7 r0 f- X) o( T
pub = priv.get_verifying_key() #生成公钥+ y' @3 e* o% D1 E$ b4 ~9 m3 z
( A) x$ b- f3 k8 K6 c) {
keccak = sha3.keccak_256()
keccak.update( pub.to_string()) #keccak_256哈希运算
1 f# h& J! D" ]5 y7 L8 t/ e
address = "0x" + keccak.hexdigest()[24:], X% J1 e9 I5 T+ t+ N2 k
9 M# Z9 C7 M( l. d9 F, |
priv_key = binascii.hexlify( priv.to_string())
pub_key = binascii.hexlify( pub.to_string())
: f; Q- o. c/ U4 ]/ ^
print("Private key: " + priv_key.decode() )0 T% L: Y/ a6 b# X' ], b
print("Public key: " + pub_key.decode() )0 f) V& `% M1 A6 z
7 |: v! w* | t
print("Address: " + address)
) {6 l: k }# n9 i B$ Q |
# Address: 0xd38d3c226d0a86ce9932608edac39163fcbc550e5 G$ o) j5 |1 |: e3 S
- H3 C X+ S; O+ R3 w1 c
来个骚操作,用同一份私钥来管理比特币与以太坊7 V9 ~5 j% i9 A/ e" M; D9 l
既然以太坊使用Secp256k1椭圆曲线得到私钥、公钥,比特币使用的也是相同的椭圆曲线算法。
那我们就用 Bitcoin地址是如何生成的得到的公钥
1 J& T& Y) U8 C& A& O) M
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d,生成一个以太坊地址。2 h- d5 ~. L: G+ c" A3 b/ ^
% ?7 D$ Y+ P5 ?- m0 ^' G" q7 u
这个公钥是通过openSSL得到的未压缩公钥,以太坊不需要使用这种类型的公钥,只要把首位的04去掉即可。
import sha3
( R' a) e" e% C& S
import binascii" {- F K& ~) f. l) _& \
6 r% J. R r0 u4 f. I9 r
_openssl_pub_key= "04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d"
_pub_key = _openssl_pub_key[2:]
0 `' @8 C/ E; J1 h/ U t
_pub_hex = binascii.unhexlify(_pub_key)0 b4 M& \8 M1 p# K9 x6 l
4 [" C7 e J( X- [/ E/ I
keccak = sha3.keccak_256()9 ?& E; [; Z- O
keccak.update(_pub_hex) A4 j( i6 K) X% M% d8 L
address = "0x" + keccak.hexdigest()[24:]$ k: y% W# S% Z5 d: G! j( m
print address # 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f! F# ?' V' B% x* W) o: C {
3 P V3 F3 V' e& Y. i. d; C
这说明啥?我用完全相同的私钥,分别生成了比特币地址与以太坊地址,这两个完全不一样的地址用的是同一个私钥。0 h3 p8 u* G$ D3 D# ?% N0 a/ ^+ G
以太坊地址 0x9156a7cdab767ffe161ed21a0cb0b688b545b01f4 n2 T" P5 X, p- g/ A
与比特币地址 14xfJr1DArtYR156XBs28FoYk6sQqirT2s的私钥竟然是相同的。
7 V6 M% [; @* e
这给资产管理带来很大方便,但如果一份私钥泄露了,2份资产都有可能被盗。
成为第一个吐槽的人