BIP 39 助記符是如何工作的?
正如我已經理解的那樣,助記符是以 12 個單詞分隔的私鑰,它們以相同的順序連接在一起產生私鑰。
- 助記詞是如何產生的?
- 為什麼 Ledger 助記符有 24 個單詞?
- 這些單詞如何轉換為私鑰?
助記符是用 12 個單詞分隔的私鑰,它們以相同的順序連接在一起產生私鑰
這是不正確的。助記符表示一個熵,該熵傳遞給 PBKDF2 密鑰拉伸函式,經過 2048 輪散列以生成 512 位種子。然後這個種子就像一個用於生成不同密鑰的鑰匙串。檢查答案的最後一部分,了解如何從種子生成私鑰。
助記詞是如何產生的?
如上所述,助記符是熵和校驗和的表示。第一步涉及決定您認為多少熵對您的操作安全。假設,現在您已經決定使用 128 位熵。以下是將這個熵轉換為助記符的步驟。
- 使用一些加密安全的熵生成器來生成 128 位的熵。
- 計算
SHA256
熵。- 在熵的末尾附加熵的第一位
entropy_length/32
。SHA256
例如,在我們的例子中,我們會將 的前 4 位附加SHA256(entropy)
到熵中,因為我們的熵是 128 位。- 助記符的每個字代表 11 位。因此,如果您檢查單詞表,您會發現 2048 個唯一單詞。現在,將它們
entropy + checksum
分成 11 位的部分。- 將此 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 位代表子鏈碼。下一個級別代表硬幣。對於比特幣,那是
0
或0x80000000
在硬化派生中。然後,您使用上面的公式計算更深一層的子私鑰和子鏈程式碼。下一個級別代表帳戶。您可以使用多個賬戶來代表不同的功能並幫助更好地管理您的資金。您可以使用上述邏輯生成賬戶私鑰和鏈碼。同樣,這是硬化派生,因此第一個帳戶的索引號為
0x80000000
.從這裡開始,我們不再使用硬化派生。下一個級別代表接收地址與更改。這允許您擁有不同的密鑰束來接收私鑰和不同的密鑰束來更改私鑰。我們將用來從父級生成子私有的函式將是
kchild = kpar + hash(Kpar, cpar, i)
:現在i
是0x00000000
接受和0x00000001
改變。另請注意,現在我們在散列函式中有公鑰而不是私鑰,這表明這不是強化派生。現在,在下一個級別,我們使用這些接收和更改密鑰束來生成單獨的私鑰。使用上述生成私鑰和鏈碼並將它們傳遞給上述函式
kchild = kpar + hash(Kpar, cpar, i)
以生成單獨的密鑰。的每一個增量i
都會給你一個不同的私鑰。現在使用這些私鑰生成比特幣地址。