BIP-39规范主要描述了基于助记词(一组易于记忆的单词)生成确定性钱包的算法和过程。
该规范由两个主要部分组成:
如何生成助记词。
如何将生成的助记词转换为二进制种子。
下面首先描述这两部分,看看如何生成确定性钱包。
生成助记词
生成助记词的算法流程如下:
流程如下:
创建 128 至 256 位的随机序列(熵)(步长为 32 位)
对上一步生成的随机序列进行SHA256生成Hash值,并将Hash值的前N位(熵长度/32,例如128位,则N=4)作为随机序列的Checksum。
在第一步生成的随机序列末尾添加 Checksum,这样对于图中的示例,带有 Checksum 的随机序列为 128 + 4 = 132 位。
将上一步中的随机序列分成 11 位片段(分割),这样对于 128 位熵长度的序列,会生成 12 个片段(132 / 11 = 12)。
此时,将包含 11 位段的每个值映射到包含 2048 个单词的预定义字典。
按照剪切顺序生成的最后一组单词就是助记词。
从助记符生成种子
助记词生成后,我们可以使用密钥生成函数PBKDF2算法生成种子。
PBKDF2 需要两个参数:助记符和盐。盐的目的是让破解变得更加困难,在 BIP-39 中我们可以引入密码作为额外的安全因素来保护种子。
“PBKDF2 是 RSA 实验室公钥加密标准 (PKCS) 系列的一部分, 特别是 PKCS #5 v2.0,也作为互联网工程任务组的 RFC 2898 发布。”
经过上述助记词生成后,下图展示了种子生成的算法。
PBKDF2的第一个参数就是上面生成的助记词。
PBKDF2 的第二个参数是 salt,它通常由一个字符串和用户提供的密码字符串的可选串联组成。
PBKDF2 使用 HMAC-SHA512 算法,该算法使用 2048 个哈希值生成 512 位值作为种子。
从种子生成HD钱包
上面生成的种子将作为 HD 钱包的 Root Seed,任何 HD 钱包的 Root Seed 都可以重新创建整个 HD 钱包。
将根种子输入 HMAC-SHA512 算法会产生 512 位哈希值,其中左侧 256 位用作主私钥,右侧 256 位用作主链码。之后,可以通过主私钥m生成主公钥(264位)。
从上图可以看出,HD key是通过以下参数生成的。
父私钥或父公钥; (两者都是未压缩的 256 位 ECDSA 密钥)。
256 位的父链码。
32 位整数索引号。
另外,上述过程是递归的,图中的子私钥可以作为下一级的父私钥。
通过在HMAC-SHA512算法中输入(Parent Publick Key、Parent Chain Code、Index Number),我们可以生成其子密钥,并且我们可以调整Index Number来生成多个同一级别的子密钥。
关于扩展密钥
由于该密钥派生功能是单向的,因此所有子密钥都不能派生出其同级的父密钥或姊妹密钥,只能使用父密钥和父链码(由Parent的父级密钥和链码生成)来派生所有子密钥和子链码,并随后生成相应的子公钥和地址来签名交易。
密钥和链码的组合称为扩展密钥,扩展密钥可以用来生成从这里开始向下的所有分支。
扩展密钥中提供的密钥可以是私钥或公钥,与分别称为“扩展私钥”和“扩展公钥”的链码组合,分别记为(k,c)和(K,c),其中公钥K = point(k)。
我们可以从扩展私钥推导出扩展公钥,反之亦然,因此对于某些交易场景(例如电子商务),可以为每笔交易生成新的公钥和地址来接收付款,而扩展私钥可以存储在纸钱包或硬件钱包中,用于安全离线签署交易。可以看到,扩展公钥的安全性比较高,下图展示了扩展父公钥推导子私钥并生成子公钥的传输机制:




