比特币的助记词生成规则详解
阿牛哥 Lv4

数字货币密钥的备份和保存方式有两种,一是直接保存私钥,二是保管助记词,用助记词生成私钥。

顾名思义,助记词的目的是为了方便记忆,本文将详细介绍助记词的生成规则。

使用助记词的好处

我们用的钱包,特别是手机App钱包,几乎都引入了助记词。因为助记词要比纯字符串的私钥容易辨识,备份要比备份私钥容易得多,而且不容易出错,打印或者写到纸上会比抄写私钥出错的概率小很多,如果要在通话中告诉他人(当然一般不会),助记词显然更清楚。

助记词的特点

  1. 助记词可以生成私钥,而且可以生成多个

  2. 助记词到私钥是一个单向的过程,无法从私钥恢复助记词

  3. 按照惯例,著几次中单词的个数一般为12到24个

助记词中使用的单词是怎么规定的?

比特币项目制定了BIP39协议,该协议规定了助记词的生成规范,我们常用的英文助记词来自于2048个常用单词,这个列表规定了所有的单词和它们的位置。

淡然除了常见的英文助记词,也可以有中文日文等其他语言的助记词。不管英文还是其它语言,只要单词在相同位置就可以替换过去。

助记词的生成过程

以下是一段比特币的助记词:

wrap love mouse adjust shiver food suspect attitude boost joy reveal cushion

注意,目前大部分币种遵循了BIP39协议,且助记词的个数一般为12个

生成过程如下

  1. 随机生成一个128位到256位的随机数,这个数字的位数必须是32的整数倍,即128位、160位、192位、224位和256位。接下来的步骤就以128位举例。

  2. 产生校验位。将第1步生成的随机数做sha256的hash,获取结果前面n位,128位的随机数就对应n = 128 / 32 = 4,即4位校验位。

  3. 将第2步产生的校验位附加到第1步产生的随机数之后。即128位再加上4位,得到132位的数字。

  4. 将第3步得到的数字切成12份,每份11位。

  5. 查单词表,就是上文链接的txt文件,文件中包含了2048个单词,此处11位数字正好用作单词表的位置索引,转换到对应位置的单词。

  6. 转换所有12个数字,得出助记词。

从助记词到私钥

助记词已经产生,下一步是将助记词转换为私钥。显然,这里是一个确定性的过程,即只要助记词不变,不管在什么设备上恢复都会获得相同的私钥。

私钥的产生分两步,一是从私钥产生私钥种子(seed),二是从种子派生出多个私钥。

本文介绍种子seed的产生过程,至于私钥的产生涉及到比特币的另一个协议BIP32,下一篇再讲。

从助记词到种子只会用到一个函数,PBKDF2(Password-Based Key Derivation Function 2)。PBKDF2函数是一个常用的密码函数,计算方式如下:

1
2
3
4
5
6
7
8
9
10
11
key = pbkdf2(password, salt, iterations-count, hash-function, derived-key-len)

- password -> 助记词:“wrap love mouse...”

- salt -> 盐:"mnemonic"

- iterations-count -> 迭代次数,2048

- hash-function -> 哈希函数,SHA512

- derived-key-len -> 512

助记词和可选的密码送入这个函数,生成一个512bit的seed,比如上面的12个助记词生成的seed如下:

f9ae1b7c6e1463920699e0da6b0eec53636253b25a0bde97332dd6dfcc7a55fcb3760c246eff08fa0500723aad9ec2240fe7bf68469d60f82cd56a7c3d75102c

seed已经得出,下一步将是生成私钥,生成过程定义在BIP32协议中,请看下一篇文章