錢包原理 助記詞與公私鑰

2021-10-06 09:00:49 字數 3680 閱讀 4870

目前錢包分為兩種:

一種是非確定性(隨機)的錢包,就是隨機生成多個私鑰,錢包管理這些私鑰。如果需要成千上萬的位址,通過隨機的方式來生成私鑰,這就需要儲存那麼多無規律的私鑰,這樣就很麻煩不好管理。

另一種是確定性(種子)的錢包,就是通過種子可以生成無數的私鑰,我們只需要記住種子就可以了。我們在使用錢包時記住的助記詞可以生成種子,只要我們保管好助記詞,我們的幣就能找回來。用一句話來解釋助記詞:它是私鑰的明文顯示。

1、隨機生成128到258位的隨機數,稱作熵;

2、熵經過一定處理方法,生成助記詞;

3、助記詞經過金鑰延伸函式pbkdf2,生成種子;

4、種子經過hmac-sha512演算法,生成母金鑰;

5、通過ckd(child key derivation)函式,母金鑰生成眾多子金鑰。

1、生成乙個128到256位的數字,叫做熵,熵的長度是32的整數倍,分別為 128, 160, 192, 224, 256,也就是我們私鑰的長度。

2、熵通過sha256雜湊得到乙個值,取前面的幾位(熵長/32),稱為校驗和, 所以校驗和長度可為 4,5,6,7,8 位。

3、校驗和加入熵的末尾,組成乙個新的序列。

4、將新序列以11位為一部分,與已經預先定義2048個單詞的字典做對應。

5、生成的有順序的單詞組就是助記詞。

通過使用金鑰延伸函式pbkdf2,熵被用於匯出較長的(512位)種子。

pbkdf2的基本原理是通過乙個偽隨機函式(例如hmac-sha512函式),把明文和乙個鹽值作為輸入引數,然後重複進行運算,並最終產生金鑰。如果重複的次數足夠大,破解的成本就會變得很高。而鹽值的新增也會增加「彩虹表」攻擊的難度。

dk =

pbkdf2

(prf, password, salt, c, dklen)

prf是乙個偽隨機函式,例如hash_hmac函式,它會輸出長度為hlen的結果。

password是用來生成金鑰的原文密碼。

salt是乙個加密用的鹽值。

c是進行重複計算的次數。

dklen是期望得到的金鑰的長度。

dk是最後產生的金鑰。

dk的值由乙個以上的block拼接而成。block的數量是dklen/hlen的值。就是說如果prf輸出的結果比期望得到的金鑰長度要短,則要通過拼接多個結果以滿足金鑰的長度:

dk = t1 || t2 || … || tdklen/hlen

而每個block則通過則通過函式f得到:

ti = f(password, salt, c, i)

在函式f裡,prf會進行c次的運算,然後把得到的結果進行異或運算,得到最終的值。

f(password, salt, c, i) = u1 ^ u2 ^ … ^ uc

第一次,prf會使用password作為key,salt作為鹽值進行運算。

u1 = prf(password, salt)

而後續的c-1次則會使用上次得到的結果作為鹽值。

這個最終生成的值就是種子。

種子通過不可逆 hmac-sha512 演算法推算出 512 位的雜湊串,左 256 位是主私鑰master private key(m), 右 256 位是主鏈碼 master chain code, 通過 m 結合推導公鑰的橢圓曲線演算法能推導出與之對應的 264 位主公鑰master public key (m)。chain code 作為推導下級金鑰的熵。

使用 ckd(child key derivation) 函式從父金鑰(parent keys)推導子金鑰(child keys),ckd 由下列三個要素做單向雜湊雜湊(one way hash function) 。

•父金鑰 (沒有壓縮過的橢圓曲線推導的私鑰或公鑰 ecdsa uncompressed key)

•鏈碼作為熵 (chain code 256 bits)

•子代索引序號 (index 32 bits)

索引號個數為 2 的 32 次方,每個父級金鑰能推導出該數目一半的子金鑰。

索引號從 0x00 到 0x7fffffff (0 to 2 的 21 次方減 1) 會生成正常的金鑰;索引號從 0x80000000 到 0xffffffff 會生成增強金鑰 )。

通過sha512雜湊生成的字串,又進一步拆分成左右兩個部分,左部分與父私鑰相加,成為子私鑰;右部分直接作為主鏈碼,用於生成下一級的子私鑰。

ckd 採用不可逆的 hmac-sha512 不可逆加密演算法,子金鑰不能向上推導出父金鑰、同時也不能水平推導出同一級的金鑰。

ckd 推導子金鑰的三個元素中,其中父金鑰和鏈碼結合統稱為擴充套件金鑰 (extended keys)。256 位的金鑰和 256 位的鏈碼串聯起來的 512 位就是擴充套件金鑰

1.包含私鑰的擴充套件金鑰用以推導子私鑰,從子私鑰又可推導對應的公鑰和位元幣位址

2.包含公鑰的擴充套件金鑰用以推導子公鑰

擴充套件金鑰使用 base58check 演算法加上特定的字首編碼,編碼得到的包含私鑰的字首為 xprv, 包含公鑰的擴充套件金鑰字首為 xpub,相比位元幣的公私鑰,擴充套件金鑰編碼之後得到的長度為 512 或 513 位。

上述方法中通過推導出的私鑰可推導出對應公鑰,但在隱藏私鑰的前提下同樣可以通過公鑰推導出子公鑰,極大加強安全性。在只需要生成位址接受位元幣而無權消費的場景下非常有用,通過公鑰擴充套件金鑰能生成無窮盡的公鑰和位元幣位址。

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

1.把子私鑰推導過程中私鑰替換為公鑰。

2.子公鑰推導出對應出與之的子鏈碼

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

1.雖然洩漏公鑰並不會導致丟幣,但含有公鑰的擴充套件金鑰洩漏會導致以此為根節點推導出來的擴充套件公鑰全部洩漏,一定程度上破壞了私隱性。

2.洩漏擴充套件公鑰加上該公鑰推導出的後任一代擴充套件公鑰對應的私鑰有被推導出該擴充套件公鑰的所有後代私鑰的可能性。

於此,bip32 協議把 ckd 函式改為 hkd (hardened key derivation formula) 生成增強金鑰推導函式。

ckd 函式以推導擴充套件金鑰的序列號 ( 0x00 到 0x7fffffff)、父鏈碼和父公鑰生或父私鑰成子鏈碼和子公鑰,子私鑰從父私鑰推導;而 hkd 通過父私鑰、父鏈碼和推導增強擴充套件金鑰的序列號 (0x80000000 到 0xffffffff) 增強子私鑰和增強子鏈碼。

位元幣以太坊數字貨幣錢包安全助記詞安全問題

位元幣以太坊數字貨幣錢包安全助記詞安全問題 一 為什麼一定要備份助記詞?2.明文私鑰的安全等級和助記詞是一樣的,都是未經加密的私鑰,但是明文私鑰非常不便於使用者進行抄寫記憶,私鑰一旦出現抄寫錯誤,那麼就會發生丟幣的現象,所以我們不建議備份或者傳輸明文私鑰。3.助記詞可以管理多鏈的錢包,備份乙個助記詞...

五筆字根助記詞

字根鍵 助記詞 g 王旁青頭戔 兼 五一 兼 與 戔 同音 f 土士二幹十寸雨 可別忘了革字底 d 大犬三羊古石廠 羊底龍頭套上套下 s 木丁西 a 工戈草頭右框七 右框 即 匚 h 目具上止卜虎皮 具上 指具字的上部 j 日早兩豎與蟲依 k 口與川,字根稀 l 田甲方框四車力 方框 即 口 m 山...

以太坊ETH開發3(助記詞 賬戶匯入 賬戶匯出)

public void nem string pwd 建立賬戶 param pwd return mnemonic 助記詞 privatekey 私鑰 publickey 公鑰 address 位址 accountfilepath 賬戶檔案路徑 public map createaccount st...