Private-Key

BIP 39 助記符是如何工作的?

  • October 13, 2021

正如我已經理解的那樣,助記符是以 12 個單詞分隔的私鑰,它們以相同的順序連接在一起產生私鑰。

  1. 助記詞是如何產生的?
  2. 為什麼 Ledger 助記符有 24 個單詞?
  3. 這些單詞如何轉換為私鑰?

助記符是用 12 個單詞分隔的私鑰,它們以相同的順序連接在一起產生私鑰

這是不正確的。助記符表示一個熵,該熵傳遞給 PBKDF2 密鑰拉伸函式,經過 2048 輪散列以生成 512 位種子。然後這個種子就像一個用於生成不同密鑰的鑰匙串。檢查答案的最後一部分,了解如何從種子生成私鑰。

助記詞是如何產生的?

如上所述,助記符是熵和校驗和的表示。第一步涉及決定您認為多少熵對您的操作安全。假設,現在您已經決定使用 128 位熵。以下是將這個熵轉換為助記符的步驟。

  1. 使用一些加密安全的熵生成器來生成 128 位的熵。
  2. 計算SHA256熵。
  3. 在熵的末尾附加熵的第一位entropy_length/32SHA256例如,在我們的例子中,我們會將 的前 4 位附加SHA256(entropy)到熵中,因為我們的熵是 128 位。
  4. 助記符的每個字代表 11 位。因此,如果您檢查單詞表,您會發現 2048 個唯一單詞。現在,將它們entropy + checksum分成 11 位的部分。
  5. 將此 11 位片段與單詞列表中查找表中的單詞進行匹配。由於我們使用了 128 位熵,我們的校驗和為 4 位。所以我們的熵和校驗和一共代表了 132 位。因此我們的助記符將是 12 個單詞。

如果您使用了 256 位熵,那麼您的校驗和將是 (256/32 =) 8 位。那將代表 (264/11) = 24 個單詞。

需要注意的一點是,任何 12/24 的單詞都不能用作助記符。最後一個單詞的某些“部分”通常包含所選單詞的校驗和,因此必須進行計算。也不鼓勵直接從思想中生成單詞並使用安全的密碼功能來這樣做。

為什麼 Ledger Mnemonics 有 24 個單詞?

這是安全性的設計選擇。詞數越多,熵就越高。24 個字將提供 256 位熵。同樣重要的是要注意,助記詞不能在不同數量的單詞之間來回使用。例如,您不能將 24 個單詞的表示形式轉換為 12 個單詞,反之亦然。

這些單詞如何轉換為私鑰?

助記符通過 2048 輪散列傳遞給鍵拉伸函式 PBKDF2。PBKDF2 函式還可以採用“鹽”作為可選密碼。此密碼提供了額外的安全層,並防止使用查找表進行暴力攻擊。該函式的輸出是一個 512 位的種子。

HMAC-SHA512然後將此種子與密鑰“比特幣種子”一起傳遞給。生成的雜湊用於創建主私鑰 (m) 和主鏈程式碼 (c)。結果雜湊的左 256 位表示m,而右 256 位表示c。然後使用主私鑰m生成主公鑰M( M = m*G)。

從這裡開始,存在用於不同錢包的許多派生路徑。最常見的一種是BIP 44中指定的硬化派生方法。本質上,硬化密鑰使用雜湊函式中的父私鑰生成子私鑰,而非硬化密鑰使用雜湊函式中的父公鑰。這提高了生成子密鑰的安全性。在下面的推導中,k 和 K 分別代表私鑰和相關的公鑰。

我們首先需要證明我們使用了 BIP 44 派生路徑。這可以通過索引號來完成,並生成一個比主私鑰更深一層的私鑰。更深一層的子私鑰由以下方式生成:kchild = kpar + hash(kpar, cpar, i)其中i是索引號。對於 BIP 44 的硬化推導,i將是0x80000044(我們使用索引號的後 2 31一半進行硬化推導)。這個結果會給我們一個 512 位的數字。左邊 256 位代表子私鑰,右邊 256 位代表子鏈碼。

下一個級別代表硬幣。對於比特幣,那是00x80000000在硬化派生中。然後,您使用上面的公式計算更深一層的子私鑰和子鏈程式碼。

下一個級別代表帳戶。您可以使用多個賬戶來代表不同的功能並幫助更好地管理您的資金。您可以使用上述邏輯生成賬戶私鑰和鏈碼。同樣,這是硬化派生,因此第一個帳戶的索引號為0x80000000.

從這裡開始,我們不再使用硬化派生。下一個級別代表接收地址與更改。這允許您擁有不同的密鑰束來接收私鑰和不同的密鑰束來更改私鑰。我們將用來從父級生成子私有的函式將是kchild = kpar + hash(Kpar, cpar, i):現在i0x00000000接受和0x00000001改變。另請注意,現在我們在散列函式中有公鑰而不是私鑰,這表明這不是強化派生。

現在,在下一個級別,我們使用這些接收和更改密鑰束來生成單獨的私鑰。使用上述生成私鑰和鏈碼並將它們傳遞給上述函式kchild = kpar + hash(Kpar, cpar, i)以生成單獨的密鑰。的每一個增量i都會給你一個不同的私鑰。

現在使用這些私鑰生成比特幣地址。

引用自:https://bitcoin.stackexchange.com/questions/89814