用父私鑰推導子私鑰,可以推導出兩種子私鑰,一種是普通的子私鑰,一種是增強型子私鑰。而題目裏說的相同的子公鑰其實只是普通的子公鑰。也就是說,用父公鑰是無法推導出相同的子公鑰的。
用普通父私鑰推導子私鑰的過程是這樣的:
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
而父私鑰+ 子擴展私鑰就等於子私鑰。
所以這二者就是相等的。
這裏要區分子擴展私鑰和子私鑰。
(全文完)