BIP-0032 HD Wallet
Posted mutourend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BIP-0032 HD Wallet相关的知识,希望对你有一定的参考价值。
1. 引言
HD Wallet:Hierarchical deterministic wallet,可用于:与多个不同的系统部分或完全分享,可为每个系统分别分配具有 可spend 或 不可spend 的能力。
HD Wallet中通常包含的是a single “chain” of keypairs。
1.1 相关定义
Bitcoin中采用secp256k1 curve,其field和curve参数遵循 SEC 2: Recommended Elliptic Curve Domain Parameters 中的推荐值。
变量通常具有如下形式之一:
- module n n n的整数( n n n为curve的order)
- 曲线上的point坐标
- byte sequences
2个coordinate pair 的加法定义为EC group operation。 ∣ ∣ || ∣∣表示byte sequence的拼接。
标准转换函数有:
- p o i n t ( p ) point(p) point(p):返回的为 p ∗ G p*G p∗G的结果,其中 G G G为曲线的base point, p p p为整数。
- s e r 32 ( i ) ser_{32}(i) ser32(i):对32位unsigned整数 i i i 序列化为 4-byte sequence,最高有效byte排在最前面。
- s e r 256 ( p ) ser_{256}(p) ser256(p):将整数 p p p序列化为32-byte sequence,最高有效byte排在最前面。
- s e r p ( P ) ser_{p}(P) serp(P):将point P = ( x , y ) P=(x,y) P=(x,y) 按 SEC 1: Elliptic Curve Cryptography的压缩格式 序列化为byte sequence: ( 0 x 02 or 0 x 03 ) ∣ ∣ s e r 256 ( x ) (0x02\\ \\text{or}\\ 0x03) || ser_{256}(x) (0x02 or 0x03)∣∣ser256(x),即第一个byte为 0 x 02 0x02 0x02还是 0 x 03 0x03 0x03具体取决于 y y y坐标的正负极。
- p a r s e 256 ( p ) parse_{256}(p) parse256(p):将32-byte sequence解析为256-bit number,最高有效byte排在最前面。
当根据一个parent key 派生出 多个child keys,为了防止单纯依赖于parent key本身,可为public key和private key额外引入256 bit的entropy,额外引入的256 bit称为chain code,与公私钥一样,也为32 byte。
extended private key表示为:
- ( k , c ) (k,c) (k,c):其中 k k k为正常的私钥, c c c为chain code。
extended public key表示为:
- ( K , c ) (K,c) (K,c):其中 K = p o i n t ( k ) K=point(k) K=point(k)为正常的公钥, c c c为chain code。
每个extended key有:
- 2 31 2^{31} 231个normal child keys。其序号为 0 0 0 到 2 31 − 1 2^{31}-1 231−1。通常用 i i i来表示normal child key的序号。
- 2 31 2^{31} 231个hardened child keys。其序号为 2 31 2^{31} 231 到 2 32 − 1 2^{32}-1 232−1。为了简化,通常用 i H i_H iH数字来表示hardened child key的序号, i H = i + 2 31 i_H=i+2^{31} iH=i+231。
2. Child key derivation (CDK)函数
已知:
- a parent extended key
- 和 an index i i i。 i ≥ 2 31 i\\geq 2^{31} i≥231表示child为hardended key。
可计算出相应的child extended key。
具体的child key派生(CDK)函数有:
- Private parent key → private child key:根据父私钥,派生子私钥。
- Public parent key → public child key:根据父公钥,派生子公钥。
- Private parent key → public child key:根据父私钥,派生子公钥。
- Public parent key → private child key:无法根据父公钥派生子私钥。
HMAC相关知识可参看:密码学中的MAC(message authentication code)
2.1 Private parent key → private child key
C K D p r i v ( ( k p a r , c p a r ) , i ) → ( k i , c i ) CKD_{priv}((k_{par},c_{par}),i)\\rightarrow (k_i,c_i) CKDpriv((kpar,cpar),i)→(ki,ci),可根据parent extend private key计算出child extend private key:
- 1)判断
i
≥
2
31
i\\geq 2^{31}
i≥231(即child是否为hardened key):
- 若是hardened child key,则:令 I = HMAC-SHA512 ( Key = c p a r , Data = 0 x 00 ∣ ∣ s e r 256 ( k p a r ) ∣ ∣ s e r 32 ( i ) ) I=\\text{HMAC-SHA512}(\\text{Key} = c_{par}, \\text{Data} = 0x00 || ser_{256}(k_{par}) || ser_{32}(i)) I=HMAC-SHA512(Key=cpar,Data=0x00∣∣ser256(kpar)∣∣ser32(i))。注意,此处为父私钥pad了 0 x 00 0x00 0x00,使其长度为33 bytes。
- 若是normal child key,则:令 I = HMAC-SHA512 ( Key = c p a r , Data = s e r p ( p o i n t ( k p a r ) ) ∣ ∣ s e r 32 ( i ) ) I=\\text{HMAC-SHA512}(\\text{Key} = c_{par}, \\text{Data} = ser_{p}(point(k_{par})) || ser_{32}(i)) I=HMAC-SHA512(Key=cpar,Data=serp(point(kpar))∣∣ser32(i))。
- 2)将 I I I切分为2个32 byte sequence I L , I R I_L,I_R IL,IR。
- 3)返回child key 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(modn)。
- 4)返回chain code c i = I R c_i=I_R ci=IR。
- 5)若
p
a
r
s
e
256
(
I
L
)
≥
n
parse_{256}(I_L)\\geq n
parse256(IL以上是关于BIP-0032 HD Wallet的主要内容,如果未能解决你的问题,请参考以下文章
请问一体机显卡HD610的跟HD4600的区别?像买个一体机,普通玩玩游戏就可以。
错误::文件`/boot/grub/i386-pc/normal.mod未找到并且ls显示(hd0),(hd0,msdos1),(hd0,msdos5)[关闭]