生成比特币私钥
杂谈 | 共 2146 字 | 2017/2/3 发表 | 2017/2/3 更新
最近研究了研究比特币,水一篇
废话少说,先上代码
package main
import (
"crypto/sha256"
"fmt"
base58 "github.com/jbenet/go-base58"
)
func main() {
//以任意字符串作为种子生成私钥
seed := []byte("halu.lu")
privateKey := sha256.Sum256(seed)
fmt.Printf("Your hex private key is : %x\n", privateKey)
wifKeyBytes := append([]byte{0x80}, privateKey[:]...)
hash1 := sha256.Sum256(wifKeyBytes)
hash2 := sha256.Sum256(hash1[:])
wifKeyBytes = append(wifKeyBytes, hash2[:4]...)
wifKey := base58.Encode(wifKeyBytes)
fmt.Printf("Your wif private key is : %s\n", wifKey)
}
比特币私钥是由一个ECDSA私钥生成的,而ECDSA私钥可以是0到FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F之间的任何一个整数,前面那玩意是:
这玩意略小于2^256。所以我们通常用SHA256生成一个值,再检验这个值是否满足要求(不符合的概率极小,我懒得检验了),这样我们就可以得到ECDSA的私钥。
但我们一般不直接用 ECDSA 私钥做比特币私钥,通常在钱包里导入导出的格式是 WIF(Wallet Import Format),这种格式导出后是 Base58 字符串,以 5 开头,而压缩格式 WIF 私钥以 K 或 L 开头。
格式 | 私钥 |
---|---|
16 进制 ECDSA | 90b57c1a64fbc39b2e516fcc4f69fa55307d3ddb53da90a66f4da46c6a0f4102 |
WIF | 5Jv1yc8RLkYhgAn7DveWe9Xm14R9taNbq8A6AkdHY772bc5APZJ |
下面说一下怎么从 16 进制的 ECDSA 私钥生成 WIF 格式的私钥
-
首先我们有一个 ECDSA 私钥(大小为 32bytes,通常用 SHA-256 生成)
90b57c1a64fbc39b2e516fcc4f69fa55307d3ddb53da90a66f4da46c6a0f4102 ①
-
向 ① 头部加入一个值为 0x80 的字节
8090b57c1a64fbc39b2e516fcc4f69fa55307d3ddb53da90a66f4da46c6a0f4102 ②
-
计算 ② 的 SHA256 哈希值
53aef433b9bc580580caa7fb578b0c75ce40e3460c60baba11e3cbf3e4f98ae4③
-
计算 ③ 的 SHA256 哈希值
c8ce99f17c9064c7517938b685d553f26609a6a180f93b91ab5581b9f459b426 ④
-
向 1 的尾部加入 ④ 的前 4 个字节
8090b57c1a64fbc39b2e516fcc4f69fa55307d3ddb53da90a66f4da46c6a0f4102c8ce99f1 ⑤
-
计算 ⑤ 的 BASE58 值,得到 WIF 格式的私钥 5Jv1yc8RLkYhgAn7DveWe9Xm14R9taNbq8A6AkdHY772bc5APZJ
嗯,就这么简单,但我当初折腾了好几天...
最后是我的比特币地址 12y5Ph8p4FYfpRzRyAi2MLh2irafY8gwHE 你们看着办吧(手动滑稽)
参考