bitcoin: 压缩公钥与非压缩公钥

本贴最后更新于 2129 天前,其中的信息可能已经物是人非

来自简书

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
  • 比特币

    比特币(BitCoin)的概念最初由中本聪在 2009 年提出,根据中本聪的思路设计发布的开源软件以及建构其上的 P2P 网络。比特币是一种 P2P 形式的数字货币。点对点的传输意味着一个去中心化的支付系统。

    27 引用 • 169 回帖 • 79 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
shooter
区块链技术爱好者 btc address: `1FmWXNJT3jVKaHBQs2gAs6PLGVWx1zPPHf` 北京