几天阅读BIP算法和生成密钥对。
在BIP 32纸上发现:

子密钥派生(CKD)函数给定父扩展密钥和索引i,可以计算相应的子扩展密钥。这样做的算法取决于子密钥是否是硬密钥(或者等效地说,是i≥231),以及我们讨论的是私钥还是公钥。函数CKDpriv((kpar,cpar),i)→(ki,ci)从父扩展私钥计算子扩展私钥:检查i≥231 (子键是否是硬密钥)。如果是这样的话(硬子):让i=HMAC 512(Key= cpar,Data = 0x00 \ ser256(kpar) \{e76f} ser32(i))。(注意: 0x00为私钥提供33字节长。)如果不是(正常的子级):让i=HMAC 512(Key= cpar,Data = serP(point(kpar)) cpar/ ser32(i))。把I分成两个32字节的序列,IL和IR.返回的子键ki是parse256(IL) + kpar (mod n)。返回的链码ci是IR。在parse256(IL)≥n或ki = 0的情况下,生成的密钥无效,因此应该继续使用i的下一个值(注意:这在2127中的概率低于1)。HMAC- The 512函数在RFC 4231中指定.CKDpub((Kpar,cpar),i)→(Ki,ci)从父扩展公钥计算子扩展公钥。它只为未硬化的子键定义。检查我是否≥231 (子键是否是硬键)。如果是这样(硬子):返回失败如果不是(普通子):让i=HMAC 512(Key= cpar,Data = serP(Kpar) x ser32(i))。把I分成两个32字节的序列,IL和IR.返回的子键Ki是point(parse256(IL)) + Kpar。返回的链码ci是IR。如果parse256(IL)≥n或Ki是无穷大的点,则生成的键无效,因此应该继续使用i的下一个值。
我想知道,如果助记符种子只允许你访问第一个密钥对,然后,那个密钥对,给你下一个密钥。
所以我想知道是否有可能从Pk,Sk对扩展到助记符种子(字典中的12个或15个单词)。
有人知道这件事吗?
谢谢。
发布于 2018-05-26 18:48:46
如果我正确地理解了你的问题,你是在问你是否可以从层次结构中的任何一对密钥回到原始的种子。
这是不可能的,因为层次结构的每一步都是一个HMAC- the 512,这只是一个带有一些额外内容的SHA512哈希。SHA512是一个单向函数,所以在层次结构中也不能逆转它。
即使是主键也是原始种子(助记符短语)的HMAC-512,所以甚至不可能从主键返回原始种子。
HMAC- the 512是不可逆的,因为底层函数SHA512是哈希函数,而不是像椭圆曲线技术那样的密码。通过设计哈希函数是不可逆的,因为它们将一个大的输入空间映射到一个较小的输出空间中,从而产生冲突。产生相同输出的不同输入。因此,当您只有哈希函数的输出时,不可能找到最终的原始输入。
此外,SHA512是一个密码散列函数,它意味着图像前电阻.这意味着在给定任意输出时生成任何(可能是多个)输入是不可行的。
HMAC-HMAC 512被指定为:
HMAC-SHA512(Key, Data) = SHA512((Key xor opad) | SHA512((Key xor ipad) | Data)其中opad和ìpad是常量。
在BIP32中,密钥派生类似于(取决于具体场景):
let I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) | ser32(i)).
// proceed to get the new key pair and chain code from I...因此,新的密钥对和链码都完全依赖HMAC- So 512的输出,这是不可逆的,因此整个密钥推导也是不可逆的。
https://ethereum.stackexchange.com/questions/49233
复制相似问题