BIP-39規範主要描述了基於助記詞(一組易於記憶的單字)產生確定性錢包的演算法和過程。
此規範由兩個主要部分組成:
如何產生助記詞。
如何將生成的助記詞轉換為二元種子。
以下先描述這兩部分,看看如何產生確定性錢包。
產生助記詞
產生助記詞的演算法流程如下:
流程如下:
建立 128 至 256 位元的隨機序列(熵)(步長為 32 位元)
將上一步驟產生的隨機序列進行SHA256產生Hash值,並將Hash值的前N位(熵長度/32,例如128位,則N=4)作為隨機序列的Checksum。
在第一步產生的隨機序列末尾加上 Checksum,因此對於圖中的範例,帶有 Checksum 的隨機序列為 128 + 4 = 132 位元。
將上一個步驟中的隨機序列分成 11 位元片段(分割),這樣對於 128 位元熵長度的序列,會產生 12 個片段(132 / 11 = 12)。
此時,將包含 11 位元段的每個值對應到包含 2048 個單字的預定義字典。
按照剪切順序產生的最後一組單字就是助記詞。
從助記符產生種子
助記詞產生後,我們可以使用金鑰產生函數PBKDF2演算法來產生種子。
PBKDF2 需要兩個參數:助記符和鹽。鹽的目的是讓破解變得更加困難,在 BIP-39 中我們可以引入密碼作為額外的安全因素來保護種子。
「PBKDF2 是 RSA 實驗室公鑰加密標準 (PKCS) 系列的一部分, 特別是 PKCS #5 v2.0,也作為互聯網工程任務組的 RFC 2898 發布。 」
經過上述助記詞生成後,下圖展示了種子生成的演算法。
PBKDF2的第一個參數就是上面產生的助記詞。
PBKDF2 的第二個參數是 salt,它通常由一個字串和使用者提供的密碼字串的可選串聯組成。
PBKDF2 使用 HMAC-SHA512 演算法,該演算法使用 2048 個雜湊值產生 512 位元值作為種子。
從種子生成HD錢包
上面產生的種子將作為 HD 錢包的 Root Seed,任何 HD 錢包的 Root Seed 都可以重新創建整個 HD 錢包。
將根種子輸入 HMAC-SHA512 演算法會產生 512 位元雜湊值,其中左側 256 位元用作主私鑰,右側 256 位元用作主鏈碼。之後,可以透過主私鑰m產生主公鑰(264位元)。
從上圖可以看出,HD key是透過以下參數產生的。
父私鑰或父公鑰; (兩者都是未壓縮的 256 位元 ECDSA 金鑰)。
256 位元的父鏈碼。
32 位元整數索引號。
另外,上述過程是遞歸的,圖中的子私鑰可以作為下一級的父私鑰。
透過在HMAC-SHA512演算法中輸入(Parent Publick Key、Parent Chain Code、Index Number),我們可以產生其子金鑰,並且我們可以調整Index Number來產生多個相同層級的子金鑰。
關於擴充密鑰
由於此金鑰派生功能是單向的,因此所有子金鑰都不能派生出其同級的父金鑰或姊妹金鑰,只能使用父金鑰和父鏈碼(由Parent的父級金鑰和鏈碼產生)來派生所有子金鑰和子鏈碼,並隨後產生對應的子公鑰和位址來簽署交易。
密鑰和鏈碼的組合稱為擴展密鑰,擴展密鑰可以用來產生從這裡開始向下的所有分支。
擴展金鑰中提供的金鑰可以是私鑰或公鑰,與分別稱為「擴展私鑰」和「擴展公鑰」的鏈碼組合,分別記為(k,c)和(K,c),其中公鑰K = point(k)。
我們可以從擴展私鑰推導出擴展公鑰,反之亦然,因此對於某些交易場景(例如電子商務),可以為每筆交易產生新的公鑰和地址來接收付款,而擴展私鑰可以儲存在紙錢包或硬體錢包中,用於安全離線簽署交易。可以看到,擴展公鑰的安全性比較高,下圖展示了擴展父公鑰推導子私鑰並產生子公鑰的傳輸機制:




