详解比特币地址的生成原理

前言

在网络搜到了 Technical background of version 1 Bitcoin addresses 这篇文章,翻译过来就是 第 1 版比特币地址的技术原理 ,经过多方面校验,发现这个算法是真实可靠的。更难能可贵的是,这篇文章竟然都附带的了每个用到的算法说明。附带的算法说明如下

算法技术文档

生成比特币地址的流程图

我大概的画了下比特币地址的生成流程

大概逻辑是下面的这样的:

  • 正向的时候: 私钥 可以计算出 公钥公钥 可以计算出 比特币地址
  • 反向的时候: 比特币地址 无法计算出 公钥公钥无法计算出私钥

正是因为这样的逻辑,所以告诉别人比特币地址是没有任何问题的,地址仅用来标识公钥和接收地址使用,别人无法得到任何有用的私密信息。

比特币地址生成原理

下面的比特币地址生成流程,是根据刚才提到的 Technical background of version 1 Bitcoin addresses 这篇文章中的介绍翻译整理的。

  1. 随机数生成私钥:拿下面这个已知的 ECDSA 私钥作为例子 (使用算法技术文档中的 ECDSA 生成)

    18e14a7b6a307f426a94f8114701e7c8e774e7f9a47e2c2035db29a206321725
    
    • 在测试的时候,我们可以用例子中给出的值进行测试,这样在接下来的每一步流程中的结果都作为正确值,如果我们代码跑出来的结果和例子中的结果不一致,就说明我们的算法有问题,需要修改代码;如果结果相同,则说明我们的算法是符合规范的;
    • 注意: 在真正生成的时候,第 1 步这里需要创建一个随机值,不能再使用 18e14a7b6a30...这串值了。
  2. 计算私钥对应的公钥:使用椭圆曲线加密算法,计算私钥对应的公钥 (33 字节)

    0250863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b2352
    

  3. 对公钥进行 SHA-256 处理 (算法技术文档 SHA-256)

    0b7c28c9b7290c98d7438e70b3d3f7c848fbd7d1dc194ff83f4f7cc9b1378e98
    
  4. 对 SHA-256 后的值进行 RIPEMD-160 处理 (算法技术文档 RIPEMD-160)

    f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
    
  5. 在 RIPEMD-160 的结果之前添加版本号 (比特币主网 0x0)

    00f54a5851e9372b87810a8e60cdd2e7cfd80b6e31
    
  6. 对第 4 步中 RIPEMD-160 的结果进行 SHA-256 处理(第 1 次 SHA256)

    ad3c854da227c7e99c4abfad4ea41d71311160df2e415e713318c70d67c6b41c
    
  7. 对第 6 步中的结果再次进行 SHA-256 处理(第 2 次 SHA256)

    c7f18fe8fcbed6396741e58ad259b5cb16b7fd7f041904147ba1dcffabf747fd
    
  8. 取两次 SHA256 结果的前 4 个字节,这被称为地址的校验和

    c7f18fe8
    
  9. 拼接比特币的二进制地址: 将第 8 阶段的 4 个校验和字节,添加到第 5 阶段带版本号的 RIPEMD-160 哈希末尾,一共 25 字节。

    00f54a5851e9372b87810a8e60cdd2e7cfd80b6e31c7f18fe8
    
  10. 使用 Base58Check编码 将二进制地址转换为 base58字符串。(这是我们常用的比特币地址格式)

    1PMycacnJaSqwwJqjawXBErnLsZ7RkXUAs
    

如何校验比特币地址是否合法

比如你在发起转账或者提现的时候,都需要转入资金的地址,这时候交易所或者钱包会对你填入的地址进行地址判断。如果你是错误格式的地址,会禁止你进入下一步.

相关的思考

  • 比特币钱包地址的长度是否固定?为什么?
  • 比特币地址能否暴力破解出私钥?几率是多少?
    • 备注: 暴力破解是指破解一个地址
  • 随机出一个有资产的比特币私钥?几率是怎么计算?
    • 备注: 有资产的比特币私钥,指的是一堆,只要蒙对一个有资产的地址就算完成目标。
  • 如何判断一个地址是合法的比特币地址?

关于站长

我叫朱安邦,本站的站长。如果您对网站有什么好的建议,欢迎在 Twitter 上与我交流