来自简书
btc address: 1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf
前文介绍
生成 bitcoin 地址 文章中得到了公钥 04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d
,
公钥其实是 secp256k1 椭圆曲线的一个坐标点,即(x,y)形式,用 16 进制表示是
(0xd061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f69,
0x1757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d)
而且(x,y) 必然符合:
# python code
Pcurve = 2**256 - 2**32 - 2**9 - 2**8 - 2**7 - 2**6 - 2**4 -1 #有限域
x = 0xd061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f69
y = 0x1757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d
x_res = x**3+7
y_res = y**2
(x_res%Pcurve) == (y_res%Pcurve)
####为啥符合呢
比特币 secp256k1 椭圆曲线公式是 y^2=x^3+7
椭圆曲线加密算法 定义在有限域 \mathbb{F}_p上
假设 y^2=x^3+7 在 \mathbb{F}_{23},
x^3+7 \ mod \ 23 就是 ((x**3)+7) % 23
y^2 \ mod \ 23 就是 (y**2)%23
((x**3)+7) % 23 == (y**2)%23
必然成立,不成立就不符合椭圆曲线加密的定义了。
secp256k1 的有限域是 Pcurve,Pcurve 是个质数。
####未压缩公钥
前缀 04+x 坐标 +y 坐标
04d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f691757b28e31be71f09f24673eed52348e58d53bcfd26f4d96ec6bf1489eab429d
压缩公钥
前缀 03+x(如果 y 是奇数),前缀 02+x(如果 y 是偶数)
0x1757......429d
从最后一位 0xd
来看,这个数是奇数,所以压缩公钥是 03d061e9c5891f579fd548cfd22ff29f5c642714cc7e7a9215f0071ef5a5723f69
现在一般都使用压缩公钥, 压缩/未压缩公钥生成的地址确实会不一样,
非压缩公钥早已成了非主流。
比特币地址
以下是同一个私钥,不同类型的公钥生成的地址。
代码见 gen_addr
14xfJr1DArtYR156XBs28FoYk6sQqirT2s
35egEPVeimCvWAmXeHXcYtAUtdA8RtsNUY
mjUcbu6BytKoC7YiEkqPxB1sc6U7nnjFse
#############压缩公钥#############
1ASfqPzBTfPSBA9DWdHYYNk4qM5NoGNtzL
3B8gkwUd1ZhpGKqedix8y16zysN6QWqQxS
mpxd8T5AGgpgxGcqECFvNHxPhLg5of8Sh3
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于