Wallets

是否可以從 Pk 和 Sk 對繼續 BIP32/BIP39 算法並“爬”到助記符種子?

  • May 26, 2018

幾天閱讀有關 BIP 算法和密鑰對生成的資訊。

BIP 32 論文中發現:

在此處輸入圖像描述

子密鑰派生 (CKD) 函式 給定父擴展密鑰和索引 i,可以計算相應的子擴展密鑰。這樣做的算法取決於孩子是否是硬化密鑰(或者,等效地,i ≥ 231),以及我們談論的是私鑰還是公鑰。

父私鑰 → 子私鑰 函式 CKDpriv((kpar, cpar), i) → (ki, ci) 從父擴展私鑰計運算元擴展私鑰:

檢查i是否≥231(孩子是否是硬鍵)。如果是這樣(硬化的孩子):讓 I = HMAC-SHA512(密鑰 = cpar,數據 = 0x00 || ser256(kpar) || ser32(i))。(注意:0x00 填充私鑰使其長度為 33 個字節。)如果不是(普通子):讓 I = HMAC-SHA512(Key = cpar, Data = serP(point(kpar)) || ser32(i) )。將 I 拆分為兩個 32 字節的序列,IL 和 IR。返回的子密鑰 ki 是 parse256(IL) + kpar (mod n)。返回的鏈碼 ci 是 IR。在 parse256(IL) ≥ n 或 ki = 0 的情況下,生成的鍵是無效的,應該繼續 i 的下一個值。(注意:這在 2127 中的機率低於 1。) HMAC-SHA512 函式在 RFC 4231 中指定。公鑰父密鑰 → 公鑰子密鑰 函式 CKDpub((Kpar, cpar), i) → (Ki, ci) 計算來自父擴展公鑰的子擴展公鑰。

檢查i是否≥231(孩子是否是硬鍵)。如果是(硬化子):返回失敗如果不是(正常子):讓 I = HMAC-SHA512(Key = cpar, Data = serP(Kpar) || ser32(i))。將 I 拆分為兩個 32 字節的序列,IL 和 IR。返回的子鍵 Ki 是 point(parse256(IL)) + Kpar。返回的鏈碼 ci 是 IR。如果 parse256(IL) ≥ n 或 Ki 是無窮遠點,則生成的鍵無效,應該繼續 i 的下一個值。

我當時想知道,如果助記符種子只讓你訪問第一個密鑰對,然後那個密鑰對給你下一個。

這意味著您可以從屬於由助記符種子標記的層次結構的 Pk、Sk 組合執行 BIP 32 算法。

所以我想知道是否可以從 Pk、Sk 對擴展到助記符種子(字典中的 12 或 15 個單詞)。

有人知道嗎?

謝謝。

如果我正確理解您的問題,您是在詢問是否可以從層次結構中的任何密鑰對返回原始種子。

這是不可能的,因為層次結構的每一步都是一個 HMAC-SHA512,它只是一個 SHA512 散列,還有一點額外的。SHA512 是一種單向函式,因此您不能將其反轉,也就是在層次結構中上升。

甚至主密鑰也是原始種子(助記詞)的 HMAC-512,因此甚至不可能從主密鑰回到原始種子。

編輯:

HMAC-SHA512 是不可逆的,因為底層函式 SHA512 是雜湊函式,而不是像橢圓曲線技術那樣的密碼。雜湊函式在設計上是不可逆的,因為它們將大的輸入空間映射到較小的輸出空間,從而產生衝突,即。不同的輸入產生相同的輸出。因此,當您只有散列函式的輸出時,不可能找到確定的原始輸入。

此外,SHA512 是一種加密散列函式,這意味著前映像抗性。這意味著在給定任意輸出時生成任何(可能是多個)輸入是不可行的。

HMAC-SHA512 指定為:

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-SHA512 的輸出,這是不可逆的,因此整個密鑰推導也是不可逆的。

引用自:https://ethereum.stackexchange.com/questions/49233