深入区块链——比特币私钥的钱包导入格式:WIF(Wallet Import Format)(第二讲)

导言

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

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

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

总览

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

256位的整数通常以十六进制表示,转换后我们可以获得一个固定64字符的十六进制字符串。注意:每两个十六进制字符表示一个字节,因此,64字符的十六进制字符串表示的是32字节=256位整数。

想要记住一个256位的整数是非常困难的,并且,如果记错了其中某些位,这个记错的整数仍然是一个有效的私钥,因此,比特币有一种对私钥进行编码的方式,这种编码方式就是带校验的Base58编码
又称为钱包导入格式:WIF(Wallet Import Format),该格式可通过校验码验证私钥是否正确。

对私钥进行Base58编码有两种方式,一种是非压缩的私钥格式,一种是压缩的私钥格式,它们分别对应非压缩的公钥格式压缩的公钥格式。目前,非压缩的私钥格式几乎已经不使用了。

非压缩的私钥格式

非压缩的私钥格式是指在32字节的私钥前添加一个0x80字节前缀,得到33字节的数据,对其计算4字节的校验码,附加到最后,一共得到37字节的数据:


0x80           256bit             check
┌─┬──────────────────────────────┬─────┐
│1│              32              │  4  │
└─┴──────────────────────────────┴─────┘

计算校验码非常简单,对其进行两次SHA256,取开头4字节作为校验码。

对这37字节的数据进行Base58编码,得到总是以5开头的字符串编码,整个过程如下图所示:

压缩的私钥格式

压缩的私钥格式会在32字节的私钥前后各添加一个0x80字节前缀和0x01字节后缀,共34字节的数据,对其计算4字节的校验码,附加到最后,一共得到38字节的数据:


0x80           256bit           0x01 check
┌─┬──────────────────────────────┬─┬─────┐
│1│              32              │1│  4  │
└─┴──────────────────────────────┴─┴─────┘

校验码的计算方式和上面相同。

对这38字节的数据进行Base58编码,得到总是以KL开头的字符串编码,整个过程如下图所示:

评论