比特币的私钥

比特币的私钥是一个小于 n 的正整数。n 的值等于

0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

换算成十进制为

115792089237316195423570985008687907852837564279074904382605163141518161494337

这是一个非常大的数,它介于 \(2^{255}\)\(2^{256}\) 之间。

在发送比特币等链上资产时,需要用私钥创建数字签名以证明用户对这些资产的控制权。丢失或泄露私钥都意味着资金损失,所以对私钥的保护十分重要,具体可以分为三个方面:

  • 生成私钥,使用安全的随机源保证他人无法用可重复的过程碰撞出你的私钥
  • 存储和使用私钥,保证你的私钥不会泄漏给他人或被他人窃取
  • 备份私钥,让你在意外丢失私钥时还能从备份恢复它

WIF

可以直接使用十进制或十六进制来表示私钥,但为了转录方便避免抄写错误,私钥一般会被编码成 WIF(Wallet Import Format)格式。

WIF 是对私钥 Base58Check 编码的结果,因为一些历史原因,WIF 分为压缩(compressed)和不压缩(uncompressed)两种格式。对于要编码的私钥:

0xF97C89AAACF0CD2E47DDBACC97DAE1F88BEC49106AC37716C451DCDD008A4B62
  1. 根据网络类型在私钥前添加前缀,例如比特币主网(Mainnet)要添加 0x80 前缀。
0x80F97C89AAACF0CD2E47DDBACC97DAE1F88BEC49106AC37716C451DCDD008A4B62
  1. 根据压缩格式在私钥后添加后缀,WIF compressed 要添加 0x01 后缀,WIF uncompressed 不添加任何后缀。
# WIF compressed
0x80F97C89AAACF0CD2E47DDBACC97DAE1F88BEC49106AC37716C451DCDD008A4B6201
# WIF uncompressed
0x80F97C89AAACF0CD2E47DDBACC97DAE1F88BEC49106AC37716C451DCDD008A4B62
  1. 对上一步的结果做 Base58Check 编码。
# WIF compressed
L5agPjZKceSTkhqZF2dmFptT5LFrbr6ZGPvP7u4A6dvhTrr71WZ9
# WIF uncompressed
5KiANv9EHEU4o9oLzZ6A7z4xJJ3uvfK2RLEubBtTz1fSwAbpJ2U

对同一个私钥,不同的网络类型和不同的 WIF 格式会得到不同的编码结果。

网络 WIF 压缩格式 前缀 后缀 WIF
Mainnet compressed 0x80 0x01 L5agPjZKceSTkhqZF2dmFptT5LFrbr6ZGPvP7u4A6dvhTrr71WZ9
Mainnet uncompressed 0x80 5KiANv9EHEU4o9oLzZ6A7z4xJJ3uvfK2RLEubBtTz1fSwAbpJ2U
Testnet compressed 0xEF 0x01 cVwfreZB3i8iv9JpdSStd9PWhZZGGJCFLS4rEKWfbkahibwhticA
Testnet uncompressed 0xEF 93UnxexmsTYCmDJdctz4zacuwxQd5prDmH6rfpEyKkQViAVA3me

在 WIF 中编码额外的前缀和后缀信息,是为了方便钱包软件在用户导入私钥时能正确的初始化。私钥只是一个大整数,压缩和不压缩是 WIF 的两种格式,私钥本身不能被“压缩”。