用父私钥推导子私钥,可以推导出两种子私钥,一种是普通的子私钥,一种是增强型子私钥。而题目里说的相同的子公钥其实只是普通的子公钥。也就是说,用父公钥是无法推导出相同的子公钥的。
用普通父私钥推导子私钥的过程是这样的:
childExtendKey = HMAC-SHA256(父公钥 | 子索引号,父链码)
而childExtendKey由64字节组成,前32字节是子扩展私钥,后32字节是子链码
子私钥 = 父私钥 + 子扩展私钥
子公钥 = (子私钥 mod secp256k1.N)*secp256k1.G
父公钥推导子公钥的过程是这样的:
childExtendKey = HMAC-SHA256(父公钥 | 子索引号,父链码)
而childExtendKey由64字节组成,前32字节是子扩展私钥,后32字节是子链码
子扩展公钥 = 子扩展私钥*G
子公钥 = Add(父公钥, 子扩展私钥)
所以观察上面两个过程,就知道差别在最后两个步骤。也就是为什么
子公钥 = (子私钥 mod secp256k1.N)*G
子公钥 = Add(父公钥, 子扩展私钥)
这上下两个式子会相等。
其实这就是密码学中的椭圆曲线的特性。
我们都知道私钥和公钥的推导公式
PubKey = PrivKey*G, 其中G是基点。
而两个公钥相加,其实就是椭圆曲线上的两个点相加
Add(父公钥, 子扩展公钥) = 父私钥*G + 子扩展私钥*G
根据椭圆曲线在离散有限循环域上的满足乘法结合律,上面的等式等同于下面的等式
Add(父公钥, 子扩展公钥) = ((父私钥+ 子扩展私钥)mod secp256k1.N)*secp256k1.G
而父私钥+ 子扩展私钥就等于子私钥。
所以这二者就是相等的。
这里要区分子扩展私钥和子私钥。
(全文完)