主页 > imtoken官方地址 > 【比特币钱包开发2】助记词扩展子地址原理及编码实现

【比特币钱包开发2】助记词扩展子地址原理及编码实现

imtoken官方地址 2024-01-09 05:13:43

比特币私钥公钥签名_比特币扩展公钥_比特币李笑比特币身价

作者:ChainDesk 李旭,ChainDesk 区块链行业分析师,ChainDesk 区块链工程师

ChainDesk官网:

课程目标

掌握助记词生成原理 掌握助记词种子生成原理 掌握种子生成子密钥原理 编程实践:从助记词生成到子地址

前言

为了安全起见,尽量确保比特币地址的公钥从未出现在网络上。 这就需要我们每次支付都要将支付的金额转入新的账户发起转账,收款时使用新的账户地址。 为了满足这样的场景,需要对很多账户和对应的秘钥进行安全管理,这显然是不科学的。 因此,这里我们将介绍如何通过助记词生成多个子地址。 这样我们只需要保存一个助记词,相当于保存了2^31个账户的私钥。

一、助记词的生成过程

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

使用 BIP39 中定义的标准化流程,钱包自动生成助记词。 钱包以熵源开始,添加校验和,并将熵映射到单词列表,如下所示:

比特币私钥公钥签名_比特币扩展公钥_比特币李笑比特币身价

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

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

比特币李笑比特币身价_比特币私钥公钥签名_比特币扩展公钥

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

比特币私钥公钥签名_比特币扩展公钥_比特币李笑比特币身价

2、从助记词到种子

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

助记符表示熵,长度为 128 到 256 位。 然后使用密钥扩展函数 PBKDF2 使用熵来导出更长的(512 位)种子。 然后使用生成的种子来构建确定性钱包并获取其密钥。

密钥扩展函数有两个参数:mnemonic 和 salt。 密钥扩展函数中加盐的目的是使构建能够进行暴力攻击的查找表变得困难。 在 BIP-39 标准中比特币扩展公钥,盐还有另一个用途——它允许引入密码短语作为额外的安全因素来保护种子。

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

比特币扩展公钥_比特币私钥公钥签名_比特币李笑比特币身价

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

比特币李笑比特币身价_比特币扩展公钥_比特币私钥公钥签名

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

12位助记词,无密码生成种子

比特币扩展公钥_比特币私钥公钥签名_比特币李笑比特币身价

12位带密码生成种子的助记词

比特币扩展公钥_比特币私钥公钥签名_比特币李笑比特币身价

24位长度的助记词,无密码生成种子

比特币私钥公钥签名_比特币李笑比特币身价_比特币扩展公钥

12位带密码生成种子的助记词

比特币私钥公钥签名_比特币李笑比特币身价_比特币扩展公钥

比特币扩展公钥_比特币李笑比特币身价_比特币私钥公钥签名

3.种子生成子密钥

种子通过不可逆的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 父扩展公钥和索引 i,则可以计算出相应的子扩展公钥。 它仅为未加固的子项定义。 if i ≥ 2^31 (hardened subkey): 如果 i 返回失败

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

tprv8iGPAfgu51nkCZZtua8jFgzVoCQLqHZrLCQonxTo7qdtzutL8ZFZt1yAtpcUF8sHdNyiVhece3SSRsBvtUCKpGkRvxXgV2TMdcDbKQzstta

· 1

扩展公钥的前缀为tpub,如:

tpubDExRK5j9DPUR62bgoDoKf6ecNDvGzckkuW1b5UW6Y7SHqQ96kx5A4Wb34w6bkHUStdq5w7ZHPQHkipwRdSQMbGnqTAQj1sEBaJmL9wXvBSu

· 1

比特币李笑比特币身价_比特币私钥公钥签名_比特币扩展公钥

每个扩展密钥都有 2^31 个普通子密钥和 2^31 个加固子密钥。 这些子键有一个索引,普通子键使用索引 0 到 2^31-1,而加固子键使用索引 2^31 到 2^32-1。 为了简化强化键索引的表示法,数字 iH 表示 i + 2^31。

将上述流程与BIP43、BIP44相结合,HD Wallet实现了多币种、多账户、多用途等功能。

比特币扩展公钥_比特币李笑比特币身价_比特币私钥公钥签名

4、编程实践:从生成助记词到扩展子地址

代码

比特币李笑比特币身价_比特币私钥公钥签名_比特币扩展公钥

输出

以下是测试网下生成的私钥、公钥、地址

比特币扩展公钥_比特币私钥公钥签名_比特币李笑比特币身价

以下是官网下生成的私钥、公钥、地址

比特币扩展公钥_比特币私钥公钥签名_比特币李笑比特币身价

比特币李笑比特币身价_比特币扩展公钥_比特币私钥公钥签名

核实

比特币扩展公钥_比特币李笑比特币身价_比特币私钥公钥签名

比特币李笑比特币身价_比特币扩展公钥_比特币私钥公钥签名

代码分析

ChainDesk,一种学习方式

chaindesk.cn,首个基于区块链的多相脑图分割模型学习社区

独创专业体系是高效率的代名词,学你想学,想你所想

欢迎加入区块链部落2群,群聊号:263270946

在这里,找到你的朋友,一起学习,一起成长