助记词(Mnemonic)是一种编码方式,通过将随机生成的【比特流】编码为【单词序列】,方便人类记忆。

举个例子,这是一份随机生成的助记词序列 (‼️千万别用作主网私钥‼️)

churn hire action decline avocado banner host kangaroo chat coffee thumb muscle brass ladder urban reform window jar poet letter artwork fiscal pony present

由算法通过采样随机熵而生成的私钥,是一串形如 01010101...101010 的比特流。用户在生成私钥时,可以指定私钥长度,通常有 128 位、256 位、乃至 512 等。

在其他条件相同的情况下,私钥长度越长,则密钥被暴力破解的难度越大,也意味着安全性越高。目前主流的比特币钱包,默认的私钥长度为256位。

人类几乎不可能长久地记忆长达 256 位的比特流,即使是借助特定编码格式,例如 Base58,也很难做到。

因此,助记词将比特流编码为单词序列,方便人类记忆。

以下,笔者将介绍助记词的生成过程。

密钥生成算法在生成私钥时,需要外界提供某种随机性来源,以此来作为输入,保证私钥的随机性。描述这种随机性强弱的参数,被称为 (Entropy,缩写 ENT)。熵越大,随机性越强。在本文中,熵是用户指定的私钥长度。

假设用户指定熵为 ENT,则密钥生成算法会生成一个长度为 ENT 比特的随机比特流,称之为私钥 (SecretKey,缩写 SK)。定义私钥的校验和(Checksum,缩写 CS)为私钥的 SHA256 哈希值的前 ENT/32 比特。

将私钥和校验和拼接,得到一个更长的比特流,其长度为 ENT + CS

准备一份常见单词表,其内容是 2048 (2^11) 个常见单词,并指定每个单词的索引(Index: 0000000000000000 - 1111111111111111)。

将比特流按每 11 比特进行小组划分,并根据每个小组的索引值,从常见单词表中找到对应的单词。

将所有单词拼接起来,成为助记词序列。

至此,我们得到了一份便于人类记忆的助记词。

最后,总结相关公式:

CS = ENT / 32
MS = (ENT + CS) / 11

|  ENT  | CS | ENT+CS |  MS  |
+-------+----+--------+------+
|  128  |  4 |   132  |  12  |
|  160  |  5 |   165  |  15  |
|  192  |  6 |   198  |  18  |
|  224  |  7 |   231  |  21  |
|  256  |  8 |   264  |  24  |
|  512  | 16 |   528  |  48  |

注意:在区实际应用中,助记词并不严格等于账号/地址的私钥,而被称之为主私钥 (Master Key)。然后,通过一种派生规则,推导出一系列子私钥,作为真实的链上ID。

这里有一份 A4 标准打印的单词表,小小一页纸张,便囊括了所有区块链的财富密码。但你无从破解,这便是密码学的力量。

一些有用的资源: