目录

1、BIP协议

  BIP协议,是Bitcoin Improvement Proposals的缩写,意思是Bitcoin 的改进建议,用于提出 Bitcoin 的新功能或改进措施。BIP协议衍生了很多的版本,主要有BIP32、BIP39、BIP44。

  • BIP32:

      BIP32是 HD钱包(Hierarchical Deterministic,分层确定性钱包)的核心提案,通过种子来生成主私钥,然后派生海量的子私钥和地址,种子是一串很长的随机数。好处是可以方便的备份、转移到其他相容装置(因为都只需要 seed),以及分层的权限控制等

  • BIP39:

      由于种子是一串很长的随机数,不利于记录,所以我们用算法将种子转化为一串12 ~ 24个的单词,方便保存记录,这就是BIP39,它扩展了 HD钱包种子的生成算法。将 seed 用方便记忆和书写的单字表示。一般由 12 个单词组成,称为 mnemonic code(phrase),中文称为助记词或助记码。

  • BIP44:

      BIP44 是在 BIP32 和 BIP43 的基础上增加多币种,提出的层次结构非常全面,它允许处理多个币种,多个帐户,每个帐户有数百万个地址。基于 BIP32 的系统,赋予树状结构中的各层特殊的意义。让同一个 seed 可以支持多币种、多帐户等。各层定义如下:

    m / purpose’ / coin_type’ / account’ / change / address_index

    其中的 purporse 固定是 44’,代表使用 BIP44。

    coin_type: 用来表示不同币种,例如 Bitcoin 就是 0’,Ethereum 是 60’。

    account: 此级别为了设置独立的用户身份可以将所有币种放在一个的帐户中,从0开始按顺序递增。

    change: 常量0用于外部链,常量1用于内部链,外部链用于钱包在外部用于接收和付款。内部链用于在钱包外部不可见的地址,如返回交易变更。

    address_index: 地址索引,按顺序递增的方式从索引0开始编号。

 

2、从助记词生成私钥

format,png

2.1 从熵到助记词

  1. 创建128到256位的随机序列(熵)。

  2. 通过获取SHA256哈希的第一(熵长度/ 32)位来创建随机序列的校验和。

  3. 将校验和添加到随机序列的末尾。

  4. 将序列分成11位的部分。

  5. 将每个11位值映射到来自2048个单词的预定义字典中的单词。

  6. 得到对应的助记词

image-20221105175154984

 
  助记词的长度不固定,可以为12-24位,下表描述了初始熵长度(ENT),校验和长度(CS)和单词中生成的助记词(MS)的长度之间的关系:
image-20221105175300159

 

2.2 从助记词生成种子

  用户可以决定用密码来保护他们的助记符。如果不存在密码短语,则使用空字符串“”。

  助记词代表长度为128到256位的熵。然后使用熵通过使用密钥扩展函数PBKDF2来导出更长(512位)的种子。然后,所产生的种子用于构建确定性钱包并获得其密钥。

  密钥扩展功能有两个参数:助记词和盐(salt)。密钥扩展功能中的盐的目的是使得难以构建能够进行暴力攻击的查找表。在BIP-39标准中,salt具有另一个目的 - 它允许引入密码短语作为保护种子的额外安全因子。

  1. PBKDF2密钥扩展功能的第一个参数是从步骤6产生的助记词。
  2. PBKDF2密钥扩展功能的第二个参数是salt。salt由字符串常量“mnemonic”和可选的用户提供的密码短语字符串组成。
  3. PBKDF2使用2048轮HMAC-SHA512哈希算法来扩展助记词和salt参数,产生512位值作为其最终输出。那个512位的值就是种子。 使用助记词来生成种子的步骤如下图。

image-20221105175440124

2.3 从种子到母密钥

  512位分成平均分成两部分,左边的256位为母私钥,右边的256位为链码。母私钥、链码和索引号,CKD(child key derivation)函数去从母密钥衍生出子密钥。

2.4 从母密钥到子密钥

  母密钥、链码、索引合并在一起并且用HMAC-SHA512函数散列之后可以产生512位的散列。所得的散列可被拆分为两部分。散列右半部分的256位产出可以给子链当链码。左半部分256位散列以及索引码被加载在母私钥上来衍生子私钥。在图中,我们看到这个说明——索引集被设为0去生产母密钥的第0个子密钥(第一个通过索引)。

2.5 扩展密钥

  母密钥和链码结合叫做扩展密钥,拥有扩展私钥可以推导出子私钥,扩展公钥可以推导出子公钥。拥有扩展公钥就可以推导出子公钥,在服务器不需要母私钥也可以,这样就更安全更方便。但是还有一个问题,那就是扩展公钥包含有链码,如果子私钥被知道或者被泄漏的话,链码就可以被用来衍生所有的其他子私钥。简单地泄露的私钥以及一个母链码,可以暴露所有的子密钥。更糟糕的是,子私钥与母链码可以用来推断母私钥。

 
 
参考链接:
https://blog.csdn.net/Lisa_8888888/article/details/103637783
https://www.jianshu.com/p/fb4860e38b90
 
如有不对,烦请指出,感谢~