跳转到主要内容

什么是 BIP39?

U
作者:UKey Wallet

BIP-39规范主要描述了基于助记词(一组易于记忆的单词)生成确定性钱包的算法和过程。

该规范由两个主要部分组成:

  1. 如何生成助记词。

  2. 如何将生成的助记词转换为二进制种子。

下面首先描述这两部分,看看如何生成确定性钱包。

生成助记词

生成助记词的算法流程如下:

流程如下:

  1. 创建 128 至 256 位的随机序列(熵)(步长为 32 位)

  2. 对上一步生成的随机序列进行SHA256生成Hash值,并将Hash值的前N位(熵长度/32,例如128位,则N=4)作为随机序列的Checksum。

  3. 在第一步生成的随机序列末尾添加 Checksum,这样对于图中的示例,带有 Checksum 的随机序列为 128 + 4 = 132 位。

  4. 将上一步中的随机序列分成 11 位片段(分割),这样对于 128 位熵长度的序列,会生成 12 个片段(132 / 11 = 12)。

  5. 此时,将包含 11 位段的每个值映射到包含 2048 个单词的预定义字典。

  6. 按照剪切顺序生成的最后一组单词就是助记词。

从助记符生成种子

助记词生成后,我们可以使用密钥生成函数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)。

我们可以从扩展私钥推导出扩展公钥,反之亦然,因此对于某些交易场景(例如电子商务),可以为每笔交易生成新的公钥和地址来接收付款,而扩展私钥可以存储在纸钱包或硬件钱包中,用于安全离线签署交易。可以看到,扩展公钥的安全性比较高,下图展示了扩展父公钥推导子私钥并生成子公钥的传输机制:

这是否解答了您的问题?