主页 > imtoken最新app下载 > HD钱包-office2007密钥序列号的助记词和密钥生成原理

HD钱包-office2007密钥序列号的助记词和密钥生成原理

imtoken最新app下载 2023-09-05 05:09:47

HD钱包的助记词与密钥生成原理

块布线

姿态/深度/温度

专注于

文字 | 字里行间

来源 | 区块链兄弟

原文链接:

在区块链相关话题不断发酵的时候,应该很多人都知道加密货币钱包。 钱包是普通用户与加密货币系统交互的入口。 手机钱包、桌面钱包、硬件钱包、网页钱包等各种货币形式百花齐放。 和纸钱包等。通过钱包,您可以无边界、无限制地转移您的数字资产。 从开发者的角度来看,钱包的作用是管理用户的私钥,通过私钥签名交易管理用户在区块链上的数字货币。

比特币地址+私钥=比特币钱包

钱包根据key是否关联可以分为两类:nondeterministic wallet和deterministic wallet

非确定性钱包:密钥对之间没有关联。

确定性钱包:密钥对源自原始种子主密钥。 最常见的推导方法是层次确定性(hierarchical deterministic,简称HD)。

Bitcoin Core生成的密钥对之间没有任何关系,属于非确定性钱包。 如果要备份导入这类钱包,就比较麻烦了。 用户必须将钱包中的私钥和对应地址一一操作。 确定性钱包基于BIP32(Bitcoin Improvement Proposal 32)标准实现,通过一个共同的种子维护n个私钥。 大多数情况下,种子是BIP44生成的助记词,方便复制),而在支持BIP32和BIP44标准的钱包中比特币扩展公钥,只导入助记词即可导入所有私钥。

避免地址重用原则:提倡避免地址重用。 当数字货币地址已经过转账时,存在私钥泄露的可能。

HD钱包的助记词与密钥生成原理

符合BIP-32/BIP-44的HD钱包

如上所述,确定性钱包可以通过种子派生出许多密钥。 它是基于BIP32标准实现的。 种子可以推导出主密钥(master key),主密钥可以推导出子密钥(children keys),子密钥可以推导出孙密钥(grandchildren keys),等等。

具有树状特征的 HD 钱包是有组织的公司的理想选择。

HD Wallet可以在不知道私钥的情况下生成大量的公钥,非常适合只负责收款的服务。

BIP32 标准的种子是一个随机的 16 字节十六进制字符串。 如果能用英文单词作为助记词,无疑会降低种子备份和钱包恢复的难度。 BIP39标准是通过随机生成12到24个易记单词来解决助记词的需求。 单词序列通过 PBKDF2 和 HMAC-SHA512 函数创建一个随机种子作为 BIP32 种子。

HD钱包的助记词与密钥生成原理

BIP32/BIP39标准详解

BIP39 标准定义了钱包助记词和种子生成规则。

钱包助记词和种子可以通过九个步骤生成:

Step 1~6 生成助记词

Steps 7~9 将前六步生成的助记词转化为BIP32种子

HD钱包的助记词与密钥生成原理

生成助记词

规定熵的位数必须是32的整数倍,所以熵的长度在128和256之间应该是32的整数倍,分别为128、160、192、224、256;

校验和的长度是熵的长度/32位,所以校验和的长度可以是4、5、6、7、8位;

助记词库中有2048个词,词库中的所有词都可以用11位作为词的索引来定位,所以一个词用11位表示,助记词的个数可以是(熵+校验和) /11,值为12、15、18、21、24

熵(bits) 校验和(bits) 熵+校验和(bits) 助记符长度128413212160516515192619818224723121256826424

生成长度为128~256位(bits)的随机序列(熵)

取熵散列后的前n位作为校验和(n=熵长度/32)

随机序列+校验和

将第3步得到的结果切割成11位

第 4 步得到的每个 11 位字节与词库中的一个词相匹配

第5步得到的结果就是助记词串

HD钱包的助记词与密钥生成原理

HD钱包的助记词与密钥生成原理

从助记词生成种子

助记词通过长度为128~256位的随机序列(熵)与词汇表进行匹配,然后使用PBKDF2函数推导出更长的种子(seed)。 生成的种子用于生成确定性钱包并派生钱包密钥。

在密码学中,Key stretching 技术被用来增强弱密钥的安全性,增加了 Brute-force 攻击尝试破解每个可能密钥的时间,增加了攻击难度。 各种编程语言本机库提供了密钥拉伸的实现。 PBKDF2(Password-Based Key Derivation Function 2)是常用的密钥拉伸算法之一。 其基本原理是使用一个随机函数(如HMAC函数),将明文和salt值作为输入参数,然后重复上述操作,最终生成密钥。

为了从助记词中生成二进制种子,BIP39使用PBKDF2函数计算种子,其参数如下:

DK = PBKDF2(PRF, 密码, 盐, c, dkLen)

HD钱包的助记词与密钥生成原理

BIP32标准定义了HD钱包的生成规则。 HD钱包中的所有层级密钥都是从根种子衍生出来的,通常根种子是通过上述BIP39步骤生成的。 所以钱包只能通过助记词进行备份和恢复,这也是HD钱包的一个缺陷。 如果你的根种子泄露,所有的密钥也会泄露。

HD钱包的助记词与密钥生成原理

掌握私钥和掌握链码

首先是从根种子生成主密钥和主链码

HD钱包的助记词与密钥生成原理

上图中,根种子通过不可逆的HMAC-SHA512算法计算出一个512位的哈希串。 左边256位是主私钥(m),右边256位是主链码。 将公钥的推导与m相结合的椭圆曲线算法,可以推导出对应的264位主公钥(M)。 链码用作派生从属密钥的熵。

HD钱包的助记词与密钥生成原理

子私钥推导

HD钱包使用CKD(child key derivation)功能从父密钥(parent keys)中派生出子密钥(child keys)。 CKD使用以下三个元素来做单向哈希函数(one-way hash function)。

HD钱包的助记词与密钥生成原理

索引号个数为2的32次方,每个父密钥可以派生子密钥个数的一半(索引号从0x00到0x7fffffff(0到2的21次方减1)会生成普通的加密密钥;索引从 0x80000000 到 0xffffffff 的数字生成增强密钥)。 CKD采用不可逆HMAC-SHA512不可逆加密算法。 子键不能向上推导出父键,也不能水平推导出同级键。

HD钱包的助记词与密钥生成原理

扩展密钥

CKD派生子密钥的三要素中,父密钥与链码的组合统称为扩展密钥。 256位的密钥和256位的链码拼接成512位,就是扩展密钥。

扩展密钥使用 Base58Check 算法加上特定的前缀编码。 包含私钥的编码前缀是xprv,包含公钥的扩展密钥前缀是xpub。 与比特币的公私钥相比,编码后得到的扩展密钥长度为512位或513位。

HD钱包的助记词与密钥生成原理

子公钥推导

在上面的方法中,可以从导出的私钥中导出对应的公钥,但是HD钱包的一个非常好用的特性就是在隐藏私钥的前提下,从公钥中导出子公钥,大大提高了安全性。 在只需要生成地址接受比特币而不消费比特币的场景下非常有用。 公钥扩展密钥可以生成无穷无尽的公钥和比特币地址。

HD钱包使用公钥推导子公钥使用场景:在接受数字货币支付的电子商务系统中,在Web服务中集成比特币扩展公钥服务,系统生成接受比特币的支付对于客户的每个订单。 不涉及私钥的地址、网络服务大大降低了被盗币的可能性。 如果不使用HD钱包,比特币地址通常是在物理隔离的服务器上批量生成,然后导入到电商系统中。 该方法需要定期生成和导入地址维护,以防止web服务系统用完预先导入的地址。 .

子私钥的推​​导过程与子公钥的过程基本相同比特币扩展公钥,有两点不同:

HD钱包的助记词与密钥生成原理

HD钱包的助记词与密钥生成原理

增强的扩展密钥派生

密钥需要严格保管,以免泄露。 泄露私钥意味着对应地址上的币可以被转走。 泄露公钥意味着HD钱包的隐私被泄露。 强化子密钥派生解决了以下两个问题:

这里,BIP32协议将CKD函数改为HKD(硬化密钥派生公式),生成增强的密钥派生函数。

CKD函数用于导出扩展密钥的序号(0x00到0x7fffffff),父链码和父公钥,或者父私钥导出子链码和子公钥,子私钥从父私钥派生; 而 HKD 使用父私钥、父链码和序列号(0x80000000 到 0xffffffff)来导出增强的扩展密钥、增强的子私钥和增强的子链码。

HD钱包的助记词与密钥生成原理

HD钱包的助记词与密钥生成原理

高清钱包密钥路径表示

HD路径密钥描述m/0由主私钥(m)导出 第一代的第一个子私钥m/0/0由第一代子密钥m(0)导出 第二代的第一代孙私钥m/0'/0由第一代增强密钥(m/0')派生,第二代第一孙私钥m/1/0由第一代的第二个孩子派生出来 Second-generation first -从密钥派生的孙密钥

HD钱包的助记词与密钥生成原理