前言
在网络搜到了 Technical background of version 1 Bitcoin addresses 这篇文章,翻译过来就是 第 1 版比特币地址的技术原理 ,经过多方面校验,发现这个算法是真实可靠的。更难能可贵的是,这篇文章竟然都附带的了每个用到的算法说明。附带的算法说明如下
算法技术文档
- ECDSA: https://en.bitcoin.it/wiki/Elliptic_Curve_Digital_Signature_Algorithm
- SHA-256: https://en.bitcoin.it/wiki/SHA-256
- RIPEMD-160: https://en.bitcoin.it/wiki/RIPEMD-160
- Base58Check encoding: https://en.bitcoin.it/wiki/Base58Check_encoding
生成比特币地址的流程图
我大概的画了下比特币地址的生成流程
大概逻辑是下面的这样的:
- 正向的时候:
私钥
可以计算出公钥
,公钥
可以计算出比特币地址
- 反向的时候:
比特币地址
无法计算出公钥
,公钥
无法计算出私钥
正是因为这样的逻辑,所以告诉别人比特币地址是没有任何问题的,地址仅用来标识公钥和接收地址使用,别人无法得到任何有用的私密信息。
比特币地址生成原理
下面的比特币地址生成流程,是根据刚才提到的 Technical background of version 1 Bitcoin addresses 这篇文章中的介绍翻译整理的。
-
随机数生成私钥:拿下面这个已知的 ECDSA 私钥作为例子 (使用算法技术文档中的 ECDSA 生成)
18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
- 在测试的时候,我们可以用例子中给出的值进行测试,这样在接下来的每一步流程中的结果都作为正确值,如果我们代码跑出来的结果和例子中的结果不一致,就说明我们的算法有问题,需要修改代码;如果结果相同,则说明我们的算法是符合规范的;
- 注意: 在真正生成的时候,第 1 步这里需要创建一个随机值,不能再使用
18e14a7b6a30...
这串值了。
-
计算私钥对应的公钥:使用椭圆曲线加密算法,计算私钥对应的公钥 (33 字节)
0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352
-
对公钥进行 SHA-256 处理 (算法技术文档 SHA-256)
0b7c28c9b7290c98d7438e70b3d3f7c848fbd7d1dc194ff83f4f7cc9b1378e98
-
对 SHA-256 后的值进行 RIPEMD-160 处理 (算法技术文档 RIPEMD-160)
f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
-
在 RIPEMD-160 的结果之前添加版本号 (比特币主网 0x0)
00f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
-
对第 4 步中 RIPEMD-160 的结果进行 SHA-256 处理(第 1 次 SHA256)
ad3c854da227c7e99c4abfad4ea41d71311160df2e415e713318c70d67c6b41c
-
对第 6 步中的结果再次进行 SHA-256 处理(第 2 次 SHA256)
c7f18fe8fcbed6396741e58ad259b5cb16b7fd7f041904147ba1dcffabf747fd
-
取两次 SHA256 结果的前 4 个字节,这被称为地址的校验和。
c7f18fe8
-
拼接比特币的二进制地址: 将第 8 阶段的 4 个校验和字节,添加到第 5 阶段带版本号的 RIPEMD-160 哈希末尾,一共 25 字节。
00f54a5851e9372b87810a8e60cdd2e7cfd80b6e31c7f18fe8
-
使用
Base58Check编码
将二进制地址转换为base58字符串
。(这是我们常用的比特币地址格式)1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs
如何校验比特币地址是否合法
比如你在发起转账或者提现的时候,都需要转入资金的地址,这时候交易所或者钱包会对你填入的地址进行地址判断。如果你是错误格式的地址,会禁止你进入下一步.
相关的思考
- 比特币钱包地址的长度是否固定?为什么?
- 比特币地址能否暴力破解出私钥?几率是多少?
- 备注: 暴力破解是指破解一个地址
- 随机出一个有资产的比特币私钥?几率是怎么计算?
- 备注: 有资产的比特币私钥,指的是一堆,只要蒙对一个有资产的地址就算完成目标。
- 如何判断一个地址是合法的比特币地址?