[TOC]
前言
原文地址:http://m.itdecent.cn/p/2472bb87f04b
作者:夢(mèng)幻艾斯
備注:歡迎轉(zhuǎn)載,請(qǐng)保留原文地址。
摘要
這個(gè)BIP描述了一個(gè)使用一組方便記憶的單詞(簡(jiǎn)稱助記詞)生成確定性錢包種子的方案
它由兩部分組成:
生成助記詞
-
將助記詞轉(zhuǎn)化成二進(jìn)制種子。
這個(gè)種子可以通過BIP-0032方法或者類似方法生成一個(gè)確定性錢包。
解決的問題
與處理錢包種子的原始二進(jìn)制或十六進(jìn)制表示相比,助記碼或句子對(duì)于人類更容易理解和記憶。助記詞可以寫在紙上或通過電話說出來。
本指南旨在將計(jì)算機(jī)生成的隨機(jī)性與人類可讀的轉(zhuǎn)錄相結(jié)合。這不是一種將用戶創(chuàng)建的句子(也稱為腦袋)處理成錢包種子的方式。
生成助記詞
助記詞必須將熵的長(zhǎng)度編碼為32的倍數(shù)。熵的長(zhǎng)度越長(zhǎng),安全系數(shù)越高,相應(yīng)的生成的助記詞長(zhǎng)度越長(zhǎng)。我們將初始熵的長(zhǎng)度稱為ENT。ENT允許的長(zhǎng)度是128-256位。
首先,生成一個(gè)ENTbits的熵。通過SHA256生成熵的hash,取<pre>ENT / 32</pre> bits當(dāng)作checksum。這個(gè)checksum加在初始熵的后面。
接下來,這些連接的比特被分成11位的組,每個(gè)編碼從0到2047的數(shù)字,用作詞表中的索引。最后,我們將這些數(shù)字轉(zhuǎn)換成單詞,并將這些連詞作為助記句。
下表描述了 初始化熵長(zhǎng)度 (ENT), checksum 長(zhǎng)度 (CS) 和 生成的助記詞長(zhǎng)度
(MS) 之間的關(guān)系
<pre>
CS = ENT / 32
MS = (ENT + CS) / 11
| ENT | CS | ENT+CS | MS |
+-------+----+--------+------+
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
</pre>
疑問:
-
為什么將ENT+CS分割成11位的組?
因?yàn)?11等于2048,助記詞單詞列表的個(gè)數(shù)為2048個(gè)。所以11位長(zhǎng)度就可以完全覆蓋單詞列表的索引。
-
為什么ENT的長(zhǎng)度是32的倍數(shù)
通過公式我們得出MS = (ENT + CS) / 11=(ENT + ENT / 32) / 11得到最終結(jié)果:
3ENT = 32 MS
因?yàn)镋NT和MS都是整數(shù),所以得出ENT是32的倍數(shù),MS是3的倍數(shù)
單詞表
理想的單詞列表具有以下特征:
-
最好的單詞選擇方式
選擇的單詞最好只需要輸入單詞的前4位就可以唯一標(biāo)識(shí)單詞
-
避免類似單詞
像"build" 和 "built", "woman" 和 "women", 或者 "quick" 和 "quickly"這類單詞容易記錯(cuò)或者寫錯(cuò)。應(yīng)該避免使用
-
單詞排好序
- 單詞列表被排序,允許更高效地查找代碼單詞
(即實(shí)現(xiàn)可以使用二分搜索而不是線性搜索) - 這也允許使用trie(前綴樹),例如為了更好的壓縮
- 單詞列表被排序,允許更高效地查找代碼單詞
單詞列表可以包含本地字符,但它們必須使用規(guī)范化表單兼容性分解(NFKD)以UTF-8編碼。
從助記詞生成種子
用戶應(yīng)該使用密碼來保護(hù)他們的助記詞。如果用戶沒有提供密碼,程序?qū)?huì)用空字符串""代替。
為了從助記詞中生成二進(jìn)制的種子。我們使用PBKDF2函數(shù),以一個(gè)助記詞句子(以UTF-8 NFKD表示)為參數(shù),使用"mnemonic" + 密碼作為鹽(以UTF-8 NFKD表示)。迭代次數(shù)設(shè)置為2048次,HMAC-SHA512函數(shù)作為為隨機(jī)函數(shù)。生成的密鑰長(zhǎng)度為512位(等于64字節(jié))。
鹽格式示例:
- 密碼為空時(shí)鹽="mnemonic"
- 密碼為"111111"時(shí),鹽="mnemonic111111"
這個(gè)種子可以在后續(xù)使用BIP-0032或類似方法生成確定性錢包。
助記詞的選擇和助記詞生成種子的方法是獨(dú)立的。這樣做使得代碼變得很簡(jiǎn)單。由于對(duì)助記詞句子對(duì)結(jié)構(gòu)沒有約束,客戶端可以自用的實(shí)現(xiàn)他們的單詞列表或者助記詞生成器。從而簡(jiǎn)稱拼寫錯(cuò)誤或者其它需求。
雖然使用不是由“生成助記符”部分中描述的算法生成的助記符是可能的,但不建議這樣做,并且軟件必須使用單詞表計(jì)算助記符句子的校驗(yàn)和,并且如果它無效則發(fā)出警告。
所描述的方法還提供了合理的可否認(rèn)性,因?yàn)槊總€(gè)密碼短語(yǔ)都會(huì)生成有效的種子(因此也就是確定性的錢包),但只有正確的種子才能使所需的錢包可用。
助記詞單詞列表
這里是這種語(yǔ)言作為助記詞單詞列表的使用方式,客戶端可以根據(jù)需求定制自己的助記詞單詞列表。