在比特币中,私钥本质上就是一个256位的随机整数。
每两个十六进制字符表示一个字节,因此,64字符的十六进制字符串表示的是32字节=256位整数。

想要记住一个256位的整数是非常困难的,并且,如果记错了其中某些位,这个记错的整数仍然是一个有效的私钥,因此,比特币有一种对私钥进行编码的方式,这种编码方式就是带校验的Base58编码
对私钥进行Base58编码有两种方式,一种是非压缩的私钥格式,一种是压缩的私钥格式,它们分别对应非压缩的公钥格式和压缩的公钥格式。
具体地来说,非压缩的私钥格式是指在32字节的私钥前添加一个0x80字节前缀,得到33字节的数据,对其计算4字节的校验码,附加到最后,一共得到37字节的数据:

  1. 0x80 256bit check
  2. ┌─┬──────────────────────────────┬─────┐
  3. 1 32 4
  4. └─┴──────────────────────────────┴─────┘

计算校验码非常简单,对其进行两次SHA256,取开头4字节作为校验码。
对这37字节的数据进行Base58编码,得到总是以5开头的字符串编码,这个字符串就是我们需要非常小心地保存的私钥地址,又称为钱包导入格式:WIF(Wallet Import Format),整个过程如下图所示:
私钥 - 图1
另一种压缩格式的私钥编码方式,与非压缩格式不同的是,压缩的私钥格式会在32字节的私钥前后各添加一个0x80字节前缀和0x01字节后缀,共34字节的数据,对其计算4字节的校验码,附加到最后,一共得到38字节的数据:

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

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

小结

比特币的私钥本质上就是一个256位整数,对私钥进行WIF格式编码可以得到一个带校验的字符串。
使用非压缩格式的WIF是以5开头的字符串。
使用压缩格式的WIF是以KL开头的字符串