主页 > imtoken最新app下载 > HD钱包-office2007密钥序列号的助记词和密钥生成原理
HD钱包-office2007密钥序列号的助记词和密钥生成原理
块布线
姿态/深度/温度
专注于
文字 | 字里行间
来源 | 区块链兄弟
原文链接:
在区块链相关话题不断发酵的时候,应该很多人都知道加密货币钱包。 钱包是普通用户与加密货币系统交互的入口。 手机钱包、桌面钱包、硬件钱包、网页钱包等各种货币形式百花齐放。 和纸钱包等。通过钱包,您可以无边界、无限制地转移您的数字资产。 从开发者的角度来看,钱包的作用是管理用户的私钥,通过私钥签名交易管理用户在区块链上的数字货币。
比特币地址+私钥=比特币钱包
钱包根据key是否关联可以分为两类:nondeterministic wallet和deterministic wallet
非确定性钱包:密钥对之间没有关联。
确定性钱包:密钥对源自原始种子主密钥。 最常见的推导方法是层次确定性(hierarchical deterministic,简称HD)。
Bitcoin Core生成的密钥对之间没有任何关系,属于非确定性钱包。 如果要备份导入这类钱包,就比较麻烦了。 用户必须将钱包中的私钥和对应地址一一操作。 确定性钱包基于BIP32(Bitcoin Improvement Proposal 32)标准实现,通过一个共同的种子维护n个私钥。 大多数情况下,种子是BIP44生成的助记词,方便复制),而在支持BIP32和BIP44标准的钱包中比特币扩展公钥,只导入助记词即可导入所有私钥。
避免地址重用原则:提倡避免地址重用。 当数字货币地址已经过转账时,存在私钥泄露的可能。
符合BIP-32/BIP-44的HD钱包
如上所述,确定性钱包可以通过种子派生出许多密钥。 它是基于BIP32标准实现的。 种子可以推导出主密钥(master key),主密钥可以推导出子密钥(children keys),子密钥可以推导出孙密钥(grandchildren keys),等等。
具有树状特征的 HD 钱包是有组织的公司的理想选择。
HD Wallet可以在不知道私钥的情况下生成大量的公钥,非常适合只负责收款的服务。
BIP32 标准的种子是一个随机的 16 字节十六进制字符串。 如果能用英文单词作为助记词,无疑会降低种子备份和钱包恢复的难度。 BIP39标准是通过随机生成12到24个易记单词来解决助记词的需求。 单词序列通过 PBKDF2 和 HMAC-SHA512 函数创建一个随机种子作为 BIP32 种子。
BIP32/BIP39标准详解
BIP39 标准定义了钱包助记词和种子生成规则。
钱包助记词和种子可以通过九个步骤生成:
Step 1~6 生成助记词
Steps 7~9 将前六步生成的助记词转化为BIP32种子
生成助记词
规定熵的位数必须是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步得到的结果就是助记词串
从助记词生成种子
助记词通过长度为128~256位的随机序列(熵)与词汇表进行匹配,然后使用PBKDF2函数推导出更长的种子(seed)。 生成的种子用于生成确定性钱包并派生钱包密钥。
在密码学中,Key stretching 技术被用来增强弱密钥的安全性,增加了 Brute-force 攻击尝试破解每个可能密钥的时间,增加了攻击难度。 各种编程语言本机库提供了密钥拉伸的实现。 PBKDF2(Password-Based Key Derivation Function 2)是常用的密钥拉伸算法之一。 其基本原理是使用一个随机函数(如HMAC函数),将明文和salt值作为输入参数,然后重复上述操作,最终生成密钥。
为了从助记词中生成二进制种子,BIP39使用PBKDF2函数计算种子,其参数如下:
DK = PBKDF2(PRF, 密码, 盐, c, dkLen)
BIP32标准定义了HD钱包的生成规则。 HD钱包中的所有层级密钥都是从根种子衍生出来的,通常根种子是通过上述BIP39步骤生成的。 所以钱包只能通过助记词进行备份和恢复,这也是HD钱包的一个缺陷。 如果你的根种子泄露,所有的密钥也会泄露。
掌握私钥和掌握链码
首先是从根种子生成主密钥和主链码
上图中,根种子通过不可逆的HMAC-SHA512算法计算出一个512位的哈希串。 左边256位是主私钥(m),右边256位是主链码。 将公钥的推导与m相结合的椭圆曲线算法,可以推导出对应的264位主公钥(M)。 链码用作派生从属密钥的熵。
子私钥推导
HD钱包使用CKD(child key derivation)功能从父密钥(parent keys)中派生出子密钥(child keys)。 CKD使用以下三个元素来做单向哈希函数(one-way hash function)。
索引号个数为2的32次方,每个父密钥可以派生子密钥个数的一半(索引号从0x00到0x7fffffff(0到2的21次方减1)会生成普通的加密密钥;索引从 0x80000000 到 0xffffffff 的数字生成增强密钥)。 CKD采用不可逆HMAC-SHA512不可逆加密算法。 子键不能向上推导出父键,也不能水平推导出同级键。
扩展密钥
CKD派生子密钥的三要素中,父密钥与链码的组合统称为扩展密钥。 256位的密钥和256位的链码拼接成512位,就是扩展密钥。
扩展密钥使用 Base58Check 算法加上特定的前缀编码。 包含私钥的编码前缀是xprv,包含公钥的扩展密钥前缀是xpub。 与比特币的公私钥相比,编码后得到的扩展密钥长度为512位或513位。
子公钥推导
在上面的方法中,可以从导出的私钥中导出对应的公钥,但是HD钱包的一个非常好用的特性就是在隐藏私钥的前提下,从公钥中导出子公钥,大大提高了安全性。 在只需要生成地址接受比特币而不消费比特币的场景下非常有用。 公钥扩展密钥可以生成无穷无尽的公钥和比特币地址。
HD钱包使用公钥推导子公钥使用场景:在接受数字货币支付的电子商务系统中,在Web服务中集成比特币扩展公钥服务,系统生成接受比特币的支付对于客户的每个订单。 不涉及私钥的地址、网络服务大大降低了被盗币的可能性。 如果不使用HD钱包,比特币地址通常是在物理隔离的服务器上批量生成,然后导入到电商系统中。 该方法需要定期生成和导入地址维护,以防止web服务系统用完预先导入的地址。 .
子私钥的推导过程与子公钥的过程基本相同比特币扩展公钥,有两点不同:
增强的扩展密钥派生
密钥需要严格保管,以免泄露。 泄露私钥意味着对应地址上的币可以被转走。 泄露公钥意味着HD钱包的隐私被泄露。 强化子密钥派生解决了以下两个问题:
这里,BIP32协议将CKD函数改为HKD(硬化密钥派生公式),生成增强的密钥派生函数。
CKD函数用于导出扩展密钥的序号(0x00到0x7fffffff),父链码和父公钥,或者父私钥导出子链码和子公钥,子私钥从父私钥派生; 而 HKD 使用父私钥、父链码和序列号(0x80000000 到 0xffffffff)来导出增强的扩展密钥、增强的子私钥和增强的子链码。
高清钱包密钥路径表示
HD路径密钥描述m/0由主私钥(m)导出 第一代的第一个子私钥m/0/0由第一代子密钥m(0)导出 第二代的第一代孙私钥m/0'/0由第一代增强密钥(m/0')派生,第二代第一孙私钥m/1/0由第一代的第二个孩子派生出来 Second-generation first -从密钥派生的孙密钥