HD錢包的助記詞與密鑰生成原理

HD錢包的助記詞與密鑰生成原理

塊連線

有態度/有深度/有溫度

關注

文 | 字裡行間

來源 | 區塊鏈兄弟

原文鏈接:http://t.cn/Re8Ly7y

區塊鏈相關的話題持續發酵之時,應該不少人知道加密貨幣錢包,錢包是普通用戶與加密貨幣系統交互的入口,各種形態的錢百花齊放,手機錢包、桌面錢包、硬件錢包、網頁錢包和紙質錢包等。通過錢包可以無國界無限制地轉移你的數字資產。從開發者的角度看,錢包的作用是管理用戶的私鑰、通過私鑰簽名交易管理用戶在區塊鏈上的數字貨幣。

Bitcoin Address + Private key = Bitcoin Wallet

根據密鑰之間是否有關聯可把錢包分為兩類:nondeterministic wallet deterministic wallet

nondeterministic wallet:密鑰對之間沒有關聯。

deterministic wallet: 密鑰對由一個原始的種子主密鑰推導而來。最常見的推導方式是樹狀層級推導 (hierarchical deterministic) 簡稱 HD。

比特幣錢包 (Bitcoin Core) 生成密鑰對之間沒有任何關聯,屬於 nondeterministic wallet ,這種類型的錢包如果想備份導入是比較麻煩的,用戶必須逐個操作錢包中的私鑰和對應地址。deterministic wallet 基於 BIP32 (Bitcoin Improvement Proposal 32) 標準實現,通過一個共同的種子維護 n 多私鑰,種子推導私鑰採用不可逆哈希算法,在需要備份錢包私鑰時,只備份這個種子即可(大多數情況下的種子是通過 BIP44 生成了助記詞,方便抄寫),在支持 BIP32, BIP44 標準的錢包只需導入助記詞即可導入全部的私鑰。

principle of avoiding address reuse: 提倡避免地址重複使用,當數字貨幣地址已經發生過一次轉賬就存在私鑰洩漏的可能性。

HD錢包的助記詞與密鑰生成原理

符合 BIP-32/BIP-44 標準的 HD 錢包

上文提到 Deterministic wallets 能夠通過一個種子推導出很多密鑰,它基於 BIP32 標準實現,種子能夠推導出主密鑰 (master key), 主密鑰推導出子密鑰 (children keys),子密鑰推導出孫密鑰 (grandchildren keys), 以此遞推。

有樹狀特徵的 HD 錢包非常適用於有組織結構的公司使用。

HD 錢包能夠在不需知道私鑰的前提下生成大量的公鑰,非常適用於只負責收款的服務。

BIP32 標準的種子是一個隨機 16 字節的 16 進制的字符串。如果能夠適用英文單詞作為助記詞無疑會降低種子備份及恢復錢包難度,BIP39 標準就是為了解決助記詞的需求,通過隨機生成 12 ~ 24 個容易記住的單詞,單詞序列通過 PBKDF2 與 HMAC-SHA512 函數創建出隨機種子作為 BIP32 的種子。

HD錢包的助記詞與密鑰生成原理

BIP32/BIP39 標準詳解

BIP39 標準定義了錢包助記詞和種子生成規則。

通過九個步驟即可生成錢包助記詞和種子:

步驟 1~6 生成助記詞

步驟 7~9 把前六步生成的助記詞轉化為 BIP32 種子

HD錢包的助記詞與密鑰生成原理

生成助記詞

規定熵的位數必須是 32 的整數倍,所以熵的長度取值位 128 到 256 之間取 32 的整數倍的值,分別為 128, 160, 192, 224, 256;

校驗和的長度為熵的長度/32 位, 所以校驗和長度可為 4,5,6,7,8 位;

助記詞庫有 2048 個詞,用 11 位可全部定位詞庫中所有的詞,作為詞的索引,故一個詞用 11 位表示,助記詞的個數可為 (熵+校驗和)/11,值為 12,15,18,21,24

熵(bits)校驗和(bits)熵 + 校驗和 (bits)助記詞長度128413212160516515192619818224723121256826424

生成一個長度為 128~256 位 (bits) 的隨機序列(熵)

取熵哈希後的前 n 位作為校驗和 (n= 熵長度/32)

隨機序列 + 校驗和

把步驟三得到的結果每 11 位切割

步驟四得到的每 11 位字節匹配詞庫的一個詞

步驟五得到的結果就是助記詞串

HD錢包的助記詞與密鑰生成原理

HD錢包的助記詞與密鑰生成原理

通過助記詞生成種子

助記詞由長度為 128 到 256 位的隨機序列(熵)匹配詞庫而來,隨後採用 PBKDF2 function 推導出更長的種子(seed)。生成的種子被用來生成構建 deterministic Wallet 和推導錢包密鑰。

在密碼學中,Key stretching 技術被用來增強弱密鑰的安全性,增加了暴力破解 (Brute-force attack) 對每個可能密鑰嘗試攻破的時間,增強了攻擊難度。各種編程語言原生庫都提供了 key stretching 的實現。PBKDF2 (Password-Based Key Derivation Function 2) 是常用的 key stretching 算法中的一種。基本原理是通過一個為隨機函數(例如 HMAC 函數),把明文和鹽值作為輸入參數,然後重複進行運算最終產生密鑰。

為了從助記詞中生成二進制種子,BIP39 採用 PBKDF2 函數推算種子,其參數如下:

  • 助記詞句子作為密碼
  • "mnemonic" + passphrase 作為鹽
  • 2048 作為重複計算的次數
  • HMAC-SHA512 作為隨機算法
  • 512 位(64 字節)是期望得到的密鑰長度

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

HD錢包的助記詞與密鑰生成原理

BIP32 標準定義了 HD 錢包的生成規則。HD 錢包中的所有層級密鑰都是由根種子推導而來,通常根種子由上述步驟 BIP39 生成。所以只需通過助記詞就能備份和恢復錢包,這也是 HD 錢包的缺陷,如果你的根種子洩漏,那麼全部密鑰隨之都洩漏。

HD錢包的助記詞與密鑰生成原理

主私鑰和主鏈碼

首先是從根種子生成主密鑰 (master key) 和主鏈碼 (master chain code)

HD錢包的助記詞與密鑰生成原理

上圖中根種子通過不可逆 HMAC-SHA512 算法推算出 512 位的哈希串,左 256 位是 Master Private key(m), 右 256 位是 master chain code, 通過 m 結合推導公鑰的橢圓曲線算法能推導出與之對應的 264 位 master public Key (M)。chain code 作為推導下級密鑰的熵。

HD錢包的助記詞與密鑰生成原理

子私鑰推導

HD 錢包使用 CKD(child key derivation) 函數從父密鑰(parent keys)推導子密鑰(child keys),CKD 由下列三個要素做單向散列哈希(one way hash function) 。

  • 1.父密鑰 (沒有壓縮過的橢圓曲線推導的私鑰或公鑰 ECDSA uncompressed key)
  • 2.鏈碼作為熵 (chain code 256 bits)
  • 3.子代索引序號 (index 32 bits)
HD錢包的助記詞與密鑰生成原理

索引號個數為 2 的 32 次方,每個父級密鑰能推導出該數目一半的子密鑰 (索引號從 0x00 到 0x7fffffff (0 to 2 的 21 次方減 1) 會生成正常的密鑰;索引號從 0x80000000 到 0xffffffff 會生成增強密鑰)。CKD 採用不可逆的 HMAC-SHA512 不可逆加密算法,子密鑰不能向上推導出父密鑰、同時也不能水平推導出同一級的密鑰。

HD錢包的助記詞與密鑰生成原理

擴展密鑰

CKD 推導子密鑰的三個元素中,其中父密鑰和鏈碼結合統稱為擴展密鑰 (Extended keys)。

256 位的密鑰和 256 位的鏈碼串聯起來的 512 位就是擴展密鑰。

  • 1.包含私鑰的擴展密鑰用以推導子私鑰,從子私鑰又可推導對應的公鑰和比特幣地址。
  • 2.包含公鑰的擴展密鑰用以推導子公鑰。

擴展密鑰使用 Base58Check 算法加上特定的前綴編碼,編碼得到的包含私鑰的前綴為 xprv, 包含公鑰的擴展密鑰前綴為 xpub,相比比特幣的公私鑰,擴展密鑰編碼之後得到的長度為 512 或 513 位。

HD錢包的助記詞與密鑰生成原理

子公鑰推導

上述方法中通過推導出的私鑰可推導出對應公鑰,但 HD 錢包非常好用的特徵之一就是在隱藏私鑰的前提下通過公鑰推導出子公鑰,極大加強安全性。在只需要生成地址接受比特幣而無權消費的場景下非常有用,通過公鑰擴展密鑰能生成無窮盡的公鑰和比特幣地址。

HD 錢包通過公鑰推導子公鑰的使用場景:在接受數字貨幣支付的電商系統中,Web 服務中集成了比特幣擴展公鑰服務,系統為客戶的每筆訂單生成一個接受比特幣支付的地址,不涉及到私鑰的 web 服務極大地減低了被盜幣的可能性。如果不採用 HD 錢包,通常都是在物理隔絕的服務器中批量生成比特幣地址,然後再導入到電商系統,這種方式需要定時生成並導入地址維護防止 web 服務系統把預先導入的地址用完。

子私鑰推導流程和子公鑰流程基本一樣,差異之處有兩點:

  • 把子私鑰推導過程中私鑰替換為公鑰。
  • 子公鑰推導出對應出與之的子鏈碼
HD錢包的助記詞與密鑰生成原理

HD錢包的助記詞與密鑰生成原理

增強擴展密鑰推導

密鑰需加強保管以免洩漏,洩漏私鑰意味著對應的地址上的幣可被轉走、洩漏公鑰意味著 HD 錢包的隱私被洩漏。增強密鑰推導 (Hardened child key derivation) 解決下述兩個問題:

  • 1.雖然洩漏公鑰並不會導致丟幣,但含有公鑰的擴展密鑰洩漏會導致以此為根節點推導出來的擴展公鑰全部洩漏,一定程度上破壞了隱私性。
  • 2.洩漏擴展公鑰加上該公鑰推導出的後任一代擴展公鑰對應的私鑰有被推導出該擴展公鑰的所有後代私鑰的可能性

於此,BIP32 協議把 CKD 函數改為 HKD (hardened key derivation formula) 生成增強密鑰推導函數。

CKD 函數以推導擴展密鑰的序列號 ( 0x00 到 0x7fffffff)、父鏈碼和父公鑰生或父私鑰成子鏈碼和子公鑰,子私鑰從父私鑰推導;而 HKD 通過父私鑰、父鏈碼和推導增強擴展密鑰的序列號 (0x80000000 到 0xffffffff) 增強子私鑰和增強子鏈碼。

HD錢包的助記詞與密鑰生成原理

HD錢包的助記詞與密鑰生成原理

HD 錢包密鑰路徑表示

HD 路徑密鑰描述m/0從主私鑰(m) 推導出的第一代的第一個子私鑰m/0/0從第一代子密鑰m(0)推導出的第二代第一個孫私鑰m/0'/0從第一代增強密鑰 (m/0')推導出得第二代第一個孫密鑰m/1/0從第一代的第二個子密鑰推導出的第二代第一個孫密鑰

HD錢包的助記詞與密鑰生成原理

PBKDF2 算法概述

分層確定性錢包 HD Wallet 介紹

Bitcoin developer-guide#wallets

Working with Bitcoin HD wallets II: Deriving public keys

文章發佈只為分享區塊鏈技術內容,版權歸原作者所有,觀點僅代表作者本人。

HD錢包的助記詞與密鑰生成原理

END


分享到:


相關文章: