当前位置:   article > 正文

BIP0032(秘钥派生)_私钥生成子私钥

私钥生成子私钥

摘要

HD Wallets( hierarchical deterministic wallets),在HD Wallet出现之前,比特币钱包是通过随机数生成互不相关的多个私钥。这种类型的钱包被称作非确定钱包(或随机钱包)。然而,一般情况下,区块链中的用户为了保证自己的匿名性,往往会生成多个私钥,以保证每次交易不会被追踪,非确定性钱包的方法会随机生成多个公私钥对,这些秘钥需要反复备份,导入在使用秘钥进行签名,占用空间,使用不便。因此,有成员提出了使用一个“种子”和单向哈希函数来生成一组私钥的方法,该方法不需要一次生成多个私钥,只需要记住种子值,即可推导出多个子私钥。而**BIP32(秘钥派生)**就是这种方法的其中之一。

秘钥派生

秘钥派生简介

BIP32算法的目的就是,只需要一个种子,就可以推导出其他所有子孙私钥的信息,从而避免了随机生成多个私钥而带来的繁琐操作。
BIP32秘钥派生算法的整体流程如下所示:
引用论文中的图片

  1. 随机选取一个种子(随机数)
  2. 将种子输入到HMAC-SHA512算法中,得到主私钥 s k r o o t sk_{root} skroot和一个连码( c h a i n r o o t chain_{root} chainroot
  3. p k r o o t = s k r o o t ⋅ G pk_{root} = sk_{root}\cdot G pkroot=skrootG得到公钥并发送给外界
  4. 主私钥计算 p k r o o t = s k r o o t ⋅ G ∣ ∣ i pk_{root} = sk_{root}\cdot G || i pkroot=skrootG∣∣i 其中 i i i是索引 ( 0 < i < 2 31 ) (0<i<2^{31}) (0<i<231)
  5. 将第四步得到的值和 c h a i n r o o t chain_{root} chainroot作为参数输入到HMAC-SHA512算法,其中左32byte作为子私钥,右32byte作为新的子链码 c h a i n i chain_{i} chaini
  6. 循环执行上述过程,即可得到多个子私钥和子公钥,其中每个相同的 i i i的子私钥和子公钥是一一对应的。

一些简要的定义

  1. 采用的签名算法是椭圆曲线的私钥签名算法 secp256k1
  2. 加法( + + +)操作是两个EC椭圆曲线的坐标对的加法,连接操作( ∣ ∣ || ∣∣)是将一个字节序列附加到另一个字节上的操作
  3. p o i n t ( p ) point(p) point(p): 返回secp256k1基点G与整数p的EC点相乘(重复应用EC群运算)得到的坐标对。
  4. s e r 32 ( i ) ser_{32}(i) ser32(i): 将32位无符号整数 i i i序列化为4字节序列,最高有效字节优先。
  5. s e r 256 ( i ) ser_{256}(i) ser256(i): 将整数 p p p序列化为32字节序列,最高有效字节优先。
  6. s e r p ( P ) ser_{p}(P) serp(P): 使用SEC1的压缩形式: ( 0 x 02 或 0 x 03 ) ∣ ∣ s e r 256 ( x ) (0x02或0x03)||ser_{256}(x) 0x020x03∣∣ser256(x)将坐标对P=(x,y)序列化为字节序列,其中头部字节取决于省略的y坐标的奇偶性。
  7. p a r s e 256 ( p ) parse_{256}(p) parse256(p): 将32字节序列化为256位,最高有效字节优先。

私钥派生(父私钥->子私钥):孩子秘钥生成函数(Child key derivation (CKD) functions)

下面的过程是一个父私钥推断出子私钥 ( k i , c i ) ← C K D p r i v ( ( k p a r , c p a r ) , i ) (k_i,c_i)\leftarrow CKDpriv((k_{par},c_{par}),i) (ki,ci)CKDpriv((kpar,cpar),i),其中 k p a r k_{par} kpar代表父私钥, c p a r c_{par} cpar代表父私钥的链码, i i i代表索引值。

  1. 判断是否 i > = 2 31 i>=2^{31} i>=231(是否是hardened key?这个我们暂时不讨论)
    如果是(hardened child): 计算 I = H M A C − S H A 512 ( K e y = c p a r , D a t a = 0 × 00 ∣ ∣ s e r 256 ( k p a r ) ∣ ∣ s e r 32 ( i ) ) I = HMAC-SHA512(Key=c_{par},Data = 0\times00||ser_{256}(k_{par})||ser_{32}(i)) I=HMACSHA512(Key=cpar,Data=0×00∣∣ser256(kpar)∣∣ser32(i)),其中, 0 × 00 0\times00 0×00用于填充私钥,使其达到33bytes长度。
    否则(normal child): 让 I = H M A C − S H A 512 ( K e y = c p a r , D a t a = s e r p ( p o i n t ( k p a r ) ) ∣ ∣ s e r 32 ( i ) ) I = HMAC-SHA512(Key=c_{par},Data =ser_p(point(k_par))||ser_{32}(i)) I=HMACSHA512(Key=cpar,Data=serp(point(kpar))∣∣ser32(i))
  2. I I I划分到两个32bytes的序列,其中左边32bytes为 I L I_L IL, 右边32bytes为 I R I_R IR
  3. 返回子秘钥 k i k_i ki, k i = p a r s e 256 ( I L ) + k p a r ( m o d   n ) k_i=parse_{256}(I_L)+k_{par}(mod \ n) ki=parse256(IL)+kpar(mod n)
  4. 返回链码 c i c_i ci, c i = I R c_i=I_R ci=IR
  5. 如果存在 p a r s e 256 ( I L ) > = n parse_{256}(I_L)>=n parse256(IL)>=n k i = 0 k_i=0 ki=0,则结果是无效的,应该继续计算下一个value值。但是这种情况发生的概率很低,大约是 1 / 2 127 1/2_{127} 1/2127

公钥派生(父公钥->子公钥): 孩子秘钥生成函数(Child key derivation (CKD) functions)

公钥派生函数用 ( k i , c i ) ← C K D p u b ( ( k p a r , c p a r ) , i ) (k_i,c_i)\leftarrow CKDpub((k_{par},c_{par}),i) (ki,ci)CKDpub((kpar,cpar),i), 生成子公钥的过程类似于子私钥的生成过程。

  1. 检查是否 i > = 2 31 i>=2^{31} i>=231
    如果成立(hardened child): 返回失败;
    如果不成立(normal child): 计算 I = H M A C − S H A 512 ( K e y = c p a r , D a t a = s e r p ( K p a r ) ∣ ∣ s e r 32 ( i ) ) I=HMAC-SHA512(Key=c_{par}, Data = ser_p(K_{par})||ser_{32}(i)) I=HMACSHA512(Key=cpar,Data=serp(Kpar)∣∣ser32(i)).
  2. 划分 I I I进入两个32bytes的序列,其中左边32位是 I L I_L IL, 右边32位是 I R I_R IR.
  3. 返回子公钥 K i K_i Ki, K i = p o i n t ( p a r s e 256 ( I L ) ) + K p a r K_i=point(parse_{256}(I_L))+K_{par} Ki=point(parse256(IL))+Kpar.
  4. 返回链码 c i c_{i} ci, c i = I R c_{i}=I_R ci=IR.
  5. 同理,如果 p a r s e 256 ( I L ) > = n parse_{256}(I_L)>=n parse256(IL)>=n k i k_i ki是无穷大的,则结果是无效的,继续计算下一个 i i i值.

密钥树(The key tree)

下一步是级联几个CKD构造来构建一个树。我们从一个根开始,即主扩展密钥m。通过对i的几个值求值CKDpriv(m,i),我们得到了许多一级派生节点。由于这些密钥中的每一个都是扩展密钥,因此CKDpriv也可以应用于这些密钥。一个详细的秘钥派生树如下图所示:
在这里插入图片描述

树中的每个叶节点对应于一个实际的秘钥,而内部节点对应于从它们派生的键的集合。叶节点的链代码被忽略,只有它们嵌入的私钥或公钥是相关的。由于这种构造,知道扩展私钥允许重建所有子代私钥和公钥,知道扩展公钥允许重建所有非硬化公钥。

大多是翻译官方文档中的内容,掺杂了一点个人理解,有不对的地方请各位大神指教。

BIP0032文档:
数字钱包 HD Wallet(BIP32密钥派生)
EBCPA: Efficient Blockchain-Based Conditional Privacy-Preserving Authentication for VANETs

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/687763
推荐阅读
相关标签
  

闽ICP备14008679号