比特币钱包开发:通过助记词扩展子地址的原理与编码

[db:标签]

  1. 掌握生成助记词的原理
  2. 掌握助记词生成种子的原理
  3. 掌握种子生成子秘钥的原理
  4. 编程实践:从生成助记词到子地址

前言

为了安全尽量保证比特币地址的公钥未在网络上出现过,这就需要我们每次支付时,将支付额转到一个新的账户发起转账,而收款时使用一个新账号地址。为了满足这样的场景,就需要安全管理很多的账号与对应的秘钥,这样显然是不科学的。因此,这里讲解通过助记词生成很多子地址,这样,我们只需保存一份助记词就相当于保存好了2^31个账号的私钥。

一、助记词的生成过程

BIP39是助记词标准的实现,助记词是一个随机数的字序列,用来作为种子产生一个确定性的钱包。单词序列足以重新创建种子,然后再创建钱包和所有派生的密钥。一个实现带有助记词的确定性钱包应用程序在首次创建钱包时将向用户显示12到24个单词的序列。该单词序列是钱包备份,可用于恢复和重新创建相同或任何兼容的钱包应用程序中的所有密钥。记忆单词使用户更容易备份钱包,因为与随机数字序列相比,它们易于阅读和正确地转录。所有的助记词在这里可以查看:助记词词库。

使用BIP39中定义的标准化过程,钱包自动生成助记词。钱包从一个熵源开始,添加一个校验和,然后将熵映射到一个单词列表,具体步骤如下:

  1. 创建128到256位的随机序列(熵)。
  2. 通过获取SHA256哈希的第一(熵长度/ 32)位来创建随机序列的校验和。
  3. 将校验和添加到随机序列的末尾。
  4. 将序列分成11位的部分。
  5. 将每个11位值映射到来自2048个单词的预定义字典中的单词。
  6. 助记词是单词序列。

生成助记词的步骤如下图。

 

img

下表描述了初始熵长度(ENT),校验和长度(CS)和单词中生成的助记词(MS)的长度之间的关系。

熵(bits)Checksum(bits)熵+Checksum(bits)助记词长度(words)128413212160516515192619818224723121256826424

二、从助记词到种子

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

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

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

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

使用助记词来生成种子的步骤如下图。

img下面演示一下助记词生成种子的实例:

12个长度的助记词,无密码生成种子

9C286891-0902-4F1D-AD31-4EB804F71DF712个长度的助记词,有密码生成种子

51FC2016-15A7-4641-A203-43964671B88124个长度的助记词,无密码生成种子

 

DE00BE18-E081-446B-9736-69198B2524E012个长度的助记词,有密码生成种子

442FFE9B-0929-4C4B-B0B1-7D046B5C85FC

三、种子生成子秘钥

种子通过不可逆HMAC-SHA512算法推算出512位的哈希串,前256位是主私钥Master Private Key (m),后256位是主链码Master Chain Code(c)。

给定父扩展私钥和索引i,可以计算相应的子扩展私钥。

函数CKDpriv((kpar,cpar),i)→(ki,ci)

如果i ≥ 2^31(硬化的子密钥):让I= HMAC-SHA512(Key = cpar,Data = 0x00 || ser256(kpar)|| ser32(i))。 (注意:0x00将私钥补齐到33字节长。)

如果i<2^31(普通的子密钥):让I= HMAC-SHA512(Key = cpar,Data = serP(point(kpar))|| ser32(i))。

给定父扩展公钥和索引i,可以计算相应的子扩展公钥。它只针对未硬化的子密钥定义。

如果i ≥ 2^31(硬化子密钥):返回失败

如果i<2^31(普通子密钥):让I= HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i)).

扩展私钥的前缀是xprv,如:

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值