深入区块链——比特币的私钥、公钥、地址是如何生成的?(第一讲)

导言

区块链(Blockchain)技术源于比特币,本质上其实是一个分布式的,不可篡改的数据库,具有可验证、可信任的特性。

本系列教程带你逐步深入理解区块链技术,并附带源码教程(主要使用PHP编写),但需要你对密码学原理、安全机制、共识算法、哈希算法有一定的认知。

教程源码:https://github.com/wenshunbiao/bitcoin-tutorial

总览

在比特币交易中,最重要的就是私钥,掌握了私钥,你就掌握了比特币,私钥是需要保密的重要数据,与之对应的公钥却是可公开的。

地址是为了人们交换方便而弄出来的一个方案,因为公钥太长了(130个字符或66个字符)。地址长度为25字节,转为base58编码后,为34个字符。

地址生成的过程:

生成步骤

第一步:私钥 (private key)产生

私钥本质上就是一个256位的随机整数,但是这串数字却控制着你的比特币账号的所有权,因此这串数字相当重要,要具有足够的随机性,一般采用密码学安全的伪随机数生成器(CSPNG),并且需要有一个来自具有足够熵值的源的种子(seed)。

示例私钥使用:
d4b905ec9fb53484ac8d8355ebee5b20373dbeaf40a0e82c8bb870448d66f942

第二步:公钥 (public key)

  • 由于ECC曲线的特点,根据非压缩格式的公钥(x, y)x实际上也可推算出y,但需要知道y的奇偶性,因此,可以根据(x, y)推算出x',作为压缩格式的公钥。
  • 压缩格式的公钥实际上只保存x这一个256位整数,但需要根据y的奇偶性在x前面添加0203前缀,y为偶数时添加02,否则添加03,这样,得到一个1+32=33字节的压缩格式的公钥数据,记作x'
  • 非压缩格式的公钥目前已很少使用,原因是非压缩格式的公钥签名脚本数据会更长。
  1. 拿私钥经secp256k1椭圆曲线算法推出公钥(前缀04+X公钥+Y公钥):
    04b3a6fd76499bae61b8b422f0ce7452d43975230192235fb86fcdea063782c4e8bcd16d0a9a3ae3770fe9a12cb3ad650ab5da8b8dc40ee5499e58ba3477d21f36

    压缩公钥:
    02b3a6fd76499bae61b8b422f0ce7452d43975230192235fb86fcdea063782c4e8

  2. 计算公钥(压缩公钥)的 SHA-256 哈希值(32bytes):
    223446ebf32ffcab4f4fe9c845bf79def5c2a2ba021a0e0f6e18f1f5aab3b9d7

  3. 取上一步结果,计算 RIPEMD-160 哈希值(20bytes):
    c5ab9fe3f256a1db9028cde6bd9c4a20610d0f97

  4. 取上一步结果,前面加入版本号(比特币主网版本号 0x00):
    00c5ab9fe3f256a1db9028cde6bd9c4a20610d0f97

  5. 取上一步结果,计算两次 SHA-256 哈希值(32bytes):
    0b151e0577ed1b06dd8e4a0ee2c5e718597d861a958d1f66c966181aa455b7a1

  6. 取上一步结果的前4个字节(8位十六进制),把这4个字节加在第4步的结果后面,作为校验(这就是比特币地址的16进制形态):
    00c5ab9fe3f256a1db9028cde6bd9c4a20610d0f970b151e05

第三步:地址 (address)

用base58编码变换一下地址(这就是最常见的比特币地址形态):

1K2BiUYadAzhk8vFaEwXfRGWZo8WabKbkp


第一讲到此结束啦,下期继续讲一讲 私钥的钱包导入格式:WIF(Wallet Import Format)

评论