首页 » PHP教程 » php公钥前缀技巧_跟老廖廖雪峰进修区块链5教程公钥和地址

php公钥前缀技巧_跟老廖廖雪峰进修区块链5教程公钥和地址

访客 2024-11-05 0

扫一扫用手机浏览

文章目录 [+]

私钥实质上是一个256位整数,记作k。
根据比特币采取的ECDSA算法,可以推导出两个256位整数,记作(x, y),这两个256位整数即为非压缩格式的公钥。

由于ECC曲线的特点,根据非压缩格式的公钥(x, y)的x实际上也可推算出y,但须要知道y的奇偶性,因此,可以根据(x, y)推算出x',作为压缩格式的公钥。

php公钥前缀技巧_跟老廖廖雪峰进修区块链5教程公钥和地址

压缩格式的公钥实际上只保存x这一个256位整数,但须要根据y的奇偶性在x前面添加02或03前缀,y为偶数时添加02,否则添加03,这样,得到一个1+32=33字节的压缩格式的公钥数据,记作x'。

php公钥前缀技巧_跟老廖廖雪峰进修区块链5教程公钥和地址
(图片来自网络侵删)

把稳压缩格式的公钥和非压缩格式的公钥是可以相互转换的,但均不可反向推导出私钥。

非压缩格式的公钥目前已很少利用,缘故原由是非压缩格式的公钥署名脚本数据会更长。

我们来看看如何根据私钥推算出公钥:

const bitcoin = require('bitcoinjs-lib');let wif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617', ecPair = bitcoin.ECPair.fromWIF(wif); // 导入私钥// 打算公钥:let pubKey = ecPair.getPublicKeyBuffer(); // 返回Buffer工具console.log(pubKey.toString('hex')); // 02或03开头的压缩公钥

布局出ECPair工具后,即可通过getPublicKeyBuffer()以Buffer工具返回公钥数据。

地址

要特殊把稳,比特币的地址并不是公钥,而是公钥的哈希,即从公钥能推导出地址,但从地址不能反推公钥,由于哈希函数是单向函数。

以压缩格式的公钥为例,从公钥打算地址的方法是,首先对1+32=33字节的公钥数据进行Hash160(即先打算SHA256,再打算RipeMD160),得到20字节的哈希。
然后,添加0x00前缀,得到1+20=21字节数据,再打算4字节校验码,拼在一起,总计得到1+20+4=25字节数据:

对上述25字节数据进行Base58编码,得到总是以1开头的字符串,该字符串即为比特币地址,全体过程如下:

利用JavaScript实现公钥到地址的编码如下:

const bitcoin = require('bitcoinjs-lib');let publicKey = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c', ecPair = bitcoin.ECPair.fromPublicKeyBuffer(Buffer.from(publicKey, 'hex')); // 导入公钥// 打算地址:let address = ecPair.getAddress();console.log(address); // 1开头的地址

打算地址的时候,不必知道私钥,可以直接从公钥打算地址,即通过ECPair.fromPublicKeyBuffer布局一个不带私钥的ECPair即可打算出地址。

要把稳,对非压缩格式的公钥和压缩格式的公钥进行哈希编码得到的地址,都因此1开头的,因此,从地址本身并无法区分出利用的是压缩格式还是非压缩格式的公钥。

以1开头的字符串地址即为比特币收款地址,可以安全地公开给任何人。

仅供应地址并不能让其他人得知公钥。
常日来说,公开公钥并没有安全风险。
实际上,如果某个地址上有对应的资金,要花费该资金,就须要供应公钥。
如果某个地址的资金被花费过至少一次,该地址的公钥实际上就公开了。

私钥、公钥以及地址的推导关系如下:

小结

比特币的公钥是根据私钥由ECDSA算法推算出来的,公钥有压缩和非压缩两种表示方法,可相互转换。

比特币的地址是公钥哈希的编码,并不是公钥本身,通过公钥可推导出地址。

通过地址不可推导出公钥,通过公钥不可推导出私钥。

要在线运行代码,用浏览器查看以下链接

https://www.liaoxuefeng.com/wiki/1207298049439968/1210215537429856

标签:

相关文章

夏日炎炎,探秘夏季语言的魅力与智慧

夏日炎炎,阳光洒满大地,万物生长,生机勃勃。在这个充满活力的季节里,我国丰富的语言文化也呈现出独特的魅力。夏季语言,作为我国语言文...

PHP教程 2024-12-27 阅读0 评论0

教育招聘IT,拥抱科技浪潮,共筑教育未来

随着科技的飞速发展,信息技术(IT)已经成为我国教育领域的重要支撑。近年来,我国教育部门高度重视教育信息化建设,积极推动教育招聘I...

PHP教程 2024-12-27 阅读0 评论0