HD钱包子公钥生成原理

HD钱包即分层确定性钱包,是指比特币钱包的一种管理方式

具体的HD钱包内容可以参考《精通比特币》第四章
https://github.com/tianmingyun/MasterBitcoin2CN/blob/master/ch04.md

这里主要记录一下在书中没有解释的很清楚的子公钥生成部分

根据书中的介绍,HD钱包在非硬化衍生的情况下,可以在不暴漏衍化子私钥的情况下,得到衍化子公钥
衍化子私钥的过程如下图


衍化子私钥

衍化子公钥的过程如下图


衍化子私钥

这里的问题是,为什么可以得到这种效果

参考BIP0032标准
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

衍生公钥的生成方式为:
计算 CKDpub((K_{par}, c_{par}), i) → (K_i, c_i)
I = HMAC-SHA512(Key = c_{par}, Data = ser_p(K_{par}) || ser_{32}(i))
其中 ser_{p} 的作用是将数字转化为字符串,用于做hash
则子公钥为 K_i = I_L*G + K_{par} ,其中 I_r为左256位
子链编码为 c_i = I_R,其中 I_r 为右256位

衍生私钥的生成方式为:
计算 CKDpriv((k_{par}, c_{par}), i) → (k_i, c_i)
I = HMAC-SHA512(Key = c_{par}, Data = ser_p(G*k_{par}) || ser_{32}(i))
则子私钥为 k_i=I_L+k_{par}
子链编码为 c_i = I_R

结合上面的内容,可以得到
K_i=G*I_L + K_{par} = G*I_L + G*k_{par} = G*(I_L+k_{par}) = G*k_i
即衍生子公钥与衍生子私钥是相对应的一对公私钥对

所以HD钱包可以在不暴漏衍生子私钥的情况下,无限生成衍生子公钥,可以在不安全的环境下用于首款,而子私钥则可以在安全的环境中,用于付款,增加安全性

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容