一文看懂钱包助记词和根私钥的关系

在最近的《区块链核心成员》的课程答疑中,讲师讲的最多的还是加密货币的密码机制。其中有好几个问题是关于私钥和助记词的。比如:

  • 记录了助记词后,是否可以不记私钥;

  • 自己的钱包,能够通过助记词还原私钥吗?具体过程有例子吗?
    等等。 本文对此做一个补充。希望能够简单地讲明白。

  • 1. 钱包私钥如何来的?

    简单地说,私钥就是一个256位的随机数。这个随机数的产生是钱包功能之一。也就是说,钱包内置了密码级别的随机数产生器,保证产生的随机数是没有规律可循的,也就是说不易破解的。注意钱包是在用户终端运行的,产生的私钥就保存在用户终端,不会也不应该上传给钱包公司。这一点非常重要。大家尽量要使用开源的,被公开考验过的钱包软件,保证安全。

    进一步说,现在的绝大多数钱包都是确定性钱包,它首先产生一个根私钥,而后根据这个根私钥可以产生无数的派生私钥,我们的钱包地址就是这些派生私钥所对应的公钥经过运算得到的地址。算法是固定的,因此地址也就是固定的。那么,这里,最重要的就是根私钥了。因为有了根私钥,根据固定的算法,就可以求出派生私钥,一切都可以简单地计算出来。

    这里注意,根私钥不一定要是256位的。可以是128位,或196位或其他位数,只要强度足够大(一般要求至少128位)就行,而由其计算出来的派生私钥则一定是256位的。

    2. 根私钥和助记词的关系是什么?

    根私钥与助记词是一一对应的关系。也就是说一个根私钥就对应一组助记词,一组助记词也对应一个根私钥。两者可以简单运算出来。

    根私钥与助记词之间的对应关系可以查看 BIP39 (BIP的意思是比特币的改进建议,BIP39是正式发布的第39号建议)。BIP39是一部字典,这个字典有各种语言版本,我们最感兴趣的就是中文版了。当然还有英文,韩文,德文,法文,日文等等。这个字典什么样呢?很简单,每本字典都是一个模子,都包含2048个常用字(比如中文版)或单词(比如英文版),不多不少,就是2048个。每个字都有一个编号,从0到2047,就这么多。其他啥也没有。

    那么这个字典表示什么呢?就是表示一个对应关系,也就是说通过字可以查编号,或者通过编号可以查到字。

    3. 助记词转换为根私钥的过程

    好了,学过计算机或者了解2进制的朋友,当然知道2048(0~2047)意味着什么,很简单,就是2的11次方,也就是说11位2进制数可以表示0到2047。其实这就是助记词和根私钥的关系。

    也就是说每一个字表示一个11位2进制数,或者说一个11位2进制数通过查字典就知道它表示哪个字。举个例子来说,我们产生了一个128位的根私钥,这样从头开始,每11位11位地分开,这样我们就有了11个11位二进制码,还剩下7位,咋办?好办。把最后7位也凑成11位就行了,差4位就补上。这4位正好可以为128为做校验来保证正确性。整个过程是这样:

  • 1. 对128为根私钥做hash(sha256),然后取hash值的头4位,补到这128位上,形成一个132位数。

  • 2. 对这个132位数每11位进行分割,形成12个11位二进制数,

  • 3. 每一个算算看,是十进制的什么数,查BIP39字典,找到相应的字或单词写下来。

  • 那助记词回推私钥也就简单了,这样:

  • 1. 查BIP39字典,找出每一个字(词)对应的数字;

  • 2. 把这些数字转换为2进制的11位数,拼起来成为一个132位数;

  • 3. 然后计算前128为的hash值,并比较hash值的前4位和这个132位数的后四位进行比较;