主页 > 下载官方imtoken钱包 > 【转】HD钱包助记词及密钥生成原理

【转】HD钱包助记词及密钥生成原理

下载官方imtoken钱包 2023-01-28 07:28:49

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

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

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

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

避免地址重用原则:提倡避免地址重用。 当数字货币地址已经转账时,存在私钥泄露的可能。HD钱包符合BIP-32/BIP-44

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

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

BIP32/BIP39标准详解

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

比特币扩展公钥_比特币之父能不能随意制造比特币_比特币bitcoin公钥

九步生成钱包密码和种子:编程语言

助记词的生成规定熵的位数必须是32的整数倍,所以熵的长度在128~256之间应该是32的整数倍,分别为128、160、192、224、256; 校验和的长度是熵的长度/32位,所以校验和的长度可以是4、5、6、7、8位; 助记词词典有2048个词,词库中的所有词都可以用11位来定位,作为词的索引,所以一个词用11位表示,助记词的个数可以是(熵+校验和)/11 , 值为 12, 15, 18, 21, 24

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

生成长度为128~256位(bits)的随机序列(熵)。 取熵散列后的前n位作为校验和(n=熵长度/32) 随机序列+校验和 结果 第4步得到的每11个数字每11个数字匹配词典中的一个词 第5步得到的结果是助记符串

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

通过助记词生成种子

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

比特币之父能不能随意制造比特币_比特币扩展公钥_比特币bitcoin公钥

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

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

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

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

BIP32标准定义了HD钱包的生成规则。 HD 钱包中的所有分层密钥都源自根种子。 一般情况下,根种子是通过以上步骤BIP39生成的。 所以钱包只能通过助记词进行备份和恢复,这也是HD钱包的一个缺陷。 如果你的根种子泄露,那么所有的密钥都会泄露。

掌握私钥和掌握链码

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

比特币扩展公钥_比特币之父能不能随意制造比特币_比特币bitcoin公钥

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

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

子私钥推导

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

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

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

扩展密钥

比特币扩展公钥_比特币之父能不能随意制造比特币_比特币bitcoin公钥

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

包含私钥的扩展密钥用于推导子私钥,从子私钥可以推导出对应的公钥和比特币地址。 包含公钥的扩展密钥用于导出子公钥

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

子公钥推导

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

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

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

比特币bitcoin公钥_比特币之父能不能随意制造比特币_比特币扩展公钥

子私钥推导过程中将私钥替换为公钥。子公钥导出对应的子链码

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

增强的扩展密钥派生

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

公钥泄露虽然不会导致币丢失,但是包含公钥的扩展密钥泄露会导致根节点派生的所有扩展公钥泄露,一定程度上破坏隐私.泄露扩展公钥加上由公钥派生的后续生成的扩展公钥对应的私钥,有可能派生出扩展公钥后代的所有私钥

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

CKD函数用于导出扩展密钥的序号(0x00到0x7fffffff)比特币扩展公钥,父链码和父公钥,或者父私钥导出子链码和子公钥,子私钥从父私钥派生; 而HKD通过parent private key , parent chaincode 和序列号(0x80000000 to 0xffffffff)来推导出增强的扩展密钥 Strengthen the child private key 和 strengthen child chaincode。

比特币bitcoin公钥_比特币扩展公钥_比特币之父能不能随意制造比特币

高清钱包密钥路径表示

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