bitcoin 地址产生过程
首先,让我们先简单的说说比特币地址是怎么算出来的。比特币是建立在数学加密学基础上的,中本聪大神用了椭圆加密算法(ECDSA)来产生比特币的私钥和公钥。由私钥是可以计算出公钥的,公钥的值经过一系列数字签名运算会得到比特币地址。
需要说明的是:因为由公钥可以算出比特币地址,所以我们经常把公钥和比特币地址的说法相混淆,但是他们都是指的一个概念。比特币地址只是另一种格式的公钥。
从比特币私钥得到我们所用的比特币地址需要九个步骤。中间要用到SHA256加密、RIPEMD160加密和BASE58编码。我们最终用到的比特币私钥和比特币地址一般都是经过BASE58编码的结果。整个流程如下图所示。
第一步,随机选取一个32字节的数、大小介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间,作为私钥。
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725
第二步,使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥。 (共65字节, 1字节 0x04, 32字节为x坐标,32字节为y坐标)关于公钥压缩、非压缩的问题另文说明。
0450863AD64A87AE8A2FE83C1AF1A8403CB53F53E486D8511DAD8A04887E5B
23522CD470243453A299FA9E77237716103ABC11A1DF38855ED6F2EE187E9C582BA6
第三步,计算公钥的 SHA-256 哈希值
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408
第四步,取上一步结果,计算 RIPEMD-160 哈希值
010966776006953D5567439E5E39F86A0D273BEE
第五步,取上一步结果,前面加入地址版本号(比特币主网版本号“0x00”)
00010966776006953D5567439E5E39F86A0D273BEE
第六步,取上一步结果,计算 SHA-256 哈希值
445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094
第七步,取上一步结果,再计算一下 SHA-256 哈希值(哈哈)
D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30
第八步,取上一步结果的前4个字节(8位十六进制)
D61967F6
第九步,把这4个字节加在第五步的结果后面,作为校验(这就是比特币地址的16进制形态)。
00010966776006953D5567439E5E39F86A0D273BEED61967F6
第十步,用base58表示法变换一下地址(这就是最常见的比特币地址形态)。
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
(说明: 有些数字以”0x”开头,意思是此数字使用十六进制表示法。”0x”本身没有任何含义,它是C语言流传下来的,约定俗成的写法,比如0xA就是十进制的10。另外,1个字节 = 8位二进制 = 2位十六进制)。
我们经常说的比特币公钥就是指的图中第二步所产生的结果。而HASH160指的是第四步RIPEMD160签名所产生的结果,由于RIPEMD也是一种HASH算法所以就统称为HASH160了。而我们常用的比特币地址就是经过BASE58编码后的结果。
比特币客户端和钱包也接受各种比特币地址格式,常用的格式有BASE58格式、WIF压缩格式、130位和66位公钥(Public key)格式。进入比巴克的钱包工具点击钱包详情查询页面,如下图,红色框中130位的字符串就是比特币ECDSA算出的原始公钥,下面是公钥压缩成66位的格式,上面两个分别是我们常用的比特币BASE58地址格式和比特币地址WIF(wallet import format)压缩格式。
其实现在各种格式的地址基本上都是通用的,在学习了相关知识后,我们会对比特币体系有更加深入的理解。
Gobittest网站(国外可访问)提供了从比特币原始私钥到公钥再到HASH160和BASE58的计算程序,读者可以参考。
再重复一遍:
第一步:生成随机私钥
私钥是一个随机数,随机选取一个32字节的数,这个数的范围大小是介于1 ~ 0xFFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFE BAAE DCE6 AF48 A03B BFD2 5E8C D036 4141之间的一个数,为了方便后面的计算,我们随机生成一个合法的私钥:
8F72F6B29E6E225A36B68DFE333C7CE5E55D83249D3D2CD6332671FA445C4DD3
第二步:椭圆曲线算公钥
生成了私钥之后,我们使用椭圆曲线加密算法(ECDSA-secp256k1)计算私钥所对应的非压缩公钥,生成的公钥共65字节, 其中一个字节是0x04,其中32个字节是X坐标,另外32个字节是Y坐标:
公钥P.X:
06CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385
公钥P.Y:
FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
第三步:计算公钥的SHA-256哈希值
将上述公钥地址拼合,得到标准地址:
0406CCAE7536386DA2C5ADD428B099C7658814CA837F94FADE365D0EC6B1519385FF83EC5F2C0C8F016A32134589F7B9E97ACBFEFD2EF12A91FA622B38A1449EEB
对齐进行SHA-256哈希计算,得到结果:
2572e5f4a8e77ddf5bb35b9e61c61f66455a4a24bcfd6cb190a8e8ff48fc097d
第四步:计算 RIPEMD-160哈希值
取上一步结果,进行RIPEMD-160计算,得到结果:
0b14f003d63ab31aef5fedde2b504699547dd1f6
第五步:加入地址版本号(比特币主网版本号“0x00”)
取上一步结果,在前面加上16进制的00,即:
000b14f003d63ab31aef5fedde2b504699547dd1f6
第六步:计算 SHA-256 哈希值
取上一步结果,进行SHA-256计算,可得:
ddc2270f93cc84cc6869dd373f3c340bbf5cb9a8f5559297cc9e5d947aab2536
然后,对以上结果再次计算 SHA-256 哈希值,得到:
869ac57b83ccf75ca9da8895823562fffb611e3c297d9c2d4612aeeb32850078
第七步:取上一步结果的前4个字节(8位十六进制)
869ac57b
第八步:把这4个字节加在第五步的结果后面
作为校验位,将这4个字节加载第五步的结果后面,这就是比特币地址的16进制形态了:
869ac57b000b14f003d63ab31aef5fedde2b504699547dd1f6
第九步:用Base58编码变换一下地址
对上一步的结果进行Base58编码,得到:
1QCXRuoxWo5Bya9NxHaVBArBQYhatHJrU7
这就是我们经常看到的传统意义上的比特币钱包地址了。
以上步骤可以简化为下图所示:
我们经常说的比特币公钥就是指的图中第二步所产生的结果,而HASH160指的是第四步RIPEMD160签名所产生的结果,由于RIPEMD也是一种HASH算法所以就统称为HASH160了,而我们常用的比特币地址就是经过BASE58编码后的结果。
bitcoin 地址产生过程相关推荐
- 数据存储方式_寻找要操作数据的存储地址的过程称为寻址,几种寻址的方式分享...
单片机工作时,在程序指令的控制下,对数据进行各种操作(如存取数据.对数据进行运算等),然后输出控制信号.指令要对数据进行操作,必须先找到操作的数据,数据存放在存储器中,只有找到要操作数据的存储地址,才 ...
- BTC公钥生成地址的过程详解
BTC公钥生成地址的过程详解 首先简单介绍一下,BTC助记词以及种子和公私钥之间的关系:BTC助记词生成种子,种子生成私钥,私钥生成公钥,公钥生成地址. 本文主要的内容是介绍公钥生成地址的这一过程: ...
- [原创]分析某app直播地址的过程
[原创]分析某app直播地址的过程 0x00 前言 自从疫情后,一直关注**电视台,直到前段时间再去看,没法播放了.最近空了,就去看看. 0x01 先抓包 有X-***-SIGNATURE的解密值 0 ...
- 操作系统课设——编程演示三种管理方式的地址换算过程
核心内容 编程演示三种管理方式的地址换算过程 分页方式的地址换算 分段方式的地址换算 段页式的地址换算 概括 程序主要有三个功能,分别是 分页方式的地址换算,分段方式的地址换算,段页式的地址换算. S ...
- linux运维笔记:DNS解析IP地址的过程(dns解析的原理 )
linux运维笔记:DNS解析IP地址的过程(dns解析的原理 ) 1.首先:说一下dns解析的流程,大家都知道,计算机之间只能通过ip相互通信,因为ip不好记,于是才使用dns服务器把域名解析为相应 ...
- 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。
详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程. first() {//检索快表if(找到){修改页表项访问位if(是写指令){修改位置为"1";}us ...
- 详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程。...
详述在设有快表的请求分页存储管理系统中,一个虚地址转换成物理内存地址的过程. first() {//检索快表if(找到){修改页表项访问位if(是写指令){修改位置为"1";}us ...
- DHCP自动获取IP地址的过程(自动获取ip地址的过程)
我们电脑(或者W5500)在自动获取IP地址的过程(通过DHCP请求获取IP的过程),电脑是客户端,路由器是DHCP客户端. 1.DHCP的请求的总过程 1.1在 DHCP请求的过程中,包括 4 个主 ...
- android dhcp 服务器,安卓通过DHCP协议获取IP地址的过程
安卓通过DHCP协议的DORA Discovery发现 Offer提供 Request请求 Ack确认 获取IP地址的过程 安卓N之前 5.0 6.0通过 android_net_utils_runD ...
最新文章
- Linux常用的文本查找命令 find
- 皮一皮:让我们一起,走近科学!
- 学python什么视频教程_学习python有什么好的视频教程?
- postgresal去重_PostgreSQL数据去重
- jQuery中.html(“xxx”)和.append(xxx)的区别和不同
- java common io_Java之Apache Commons-IO使用精讲
- 被解放的姜戈08 远走高飞
- 高并发场景下,如何保证生产者投递到消息中间件的消息不丢失?
- ANT自动化压缩合并JS/CSS和更改版本号
- 吴恩达-coursera-机器学习-week8
- python实现FTP文件上传和下载
- 安装 Unity Hub 发现 进不了 Unity3D 了
- 计算机文化与计算机技术有什么区别,什么是计算机文化?
- poj 3709 斜率优化
- win10更新完,每次重启电脑都提示 未安装任何音频输出设备
- 使用易路代理yiluproxy时,出现不是自己选定的城市该怎么办?
- android TextView 中划线、下划线 跑马灯
- linux——signal信号(SIGHUP、SIGINT、SIGQUIT、SIGILL、SIGTRAP、SIGABRT...........................)
- Cesium-定位至entity的位置
- VUE H5页面微信/QQ/微博 分享连接设置