以太坊系統學習教程:
https://www.netkiller.cn/blockchain/bip39.htmlhtml
1.16. BIP39協議:使用助記詞生成肯定性錢包python
BIP:39
層:應用層
標題:使用助記詞生成肯定性錢包祕鑰
做者:Marek Palatinus slush@satoshilabs.com
Pavol Rusnak stick@satoshilabs.com
Aaron Voisine voisine@gmail.com
Sean Bowe ewillbefull@gmail.com
狀態:已經被提議
類型:標準化跟蹤
建立日期:2013-09-10
譯者:kimzivgit
1.16.1. 摘要
這個BIP描述了使用助記碼或者助記句子(簡稱助記詞)--一組便於記憶的單詞來生成肯定性錢包。github
這個BIP由兩部分構成:生成助記詞和把生成的助記詞轉化成一個二進制種子。這個種子後面會更急相似於BIP32的方法生成肯定性錢包。算法
1.16.2. 動機
與處理原始的二進制或者十六進制的錢包種子相比,在人機交互過程當中助記詞是更勝一籌的。這些助記單詞能夠被寫在紙上或者經過電話說出來。npm
本指南旨在經過人類可讀的轉錄來傳輸計算機生成的隨機性。並非將用戶建立的句子(也稱爲腦錢包)處理到錢包種子中的方法。安全
1.16.3. 生成助記詞
助記符必須以32位的倍數編碼熵。隨着熵的安全性提升,同時句子的長度也在增長。咱們將初始熵長度稱爲ENT。ENT容許的大小爲128-256位。函數
首先,生成ENT位的初始熵。經過取第一個生成的校驗和學習
ENT/32ui
它的SHA256哈希的位。該校驗和附加到初始熵的末尾。接下來,這些鏈接的比特位被分紅多個11位的組,每一個組用從0-2047的數字編碼,用做單詞表的索引。最後,咱們將這些數字轉換爲單詞,並將加入的全部單詞組成助記句。
下表描述了初始熵長度(ENT),校驗和長度(CS)和生成助記詞(MS)的長度之間的關係。
CS = ENT / 32
MS = (ENT + CS) / 11
128 4 132 12
160 5 165 15
192 6 198 18
224 7 231 21
256 8 264 24
1.16.4. 單詞表
理想的單詞列表具備如下特色:
智能選詞
單詞列表以這種方式建立:輸入前四個字母來就足以明確地標識這個單詞;
避免類似的單詞
"build" and "built", "woman" and "women", or "quick" and "quickly" 這樣的詞對,不只使記憶困難,並且更容易出錯,更難猜到;
排序的單詞列表
排序的單詞列表容許更有效地查找代碼字(即,實現可使用二分搜索而不是線性搜索)
這也容許使用字典樹(前綴樹),例如用於更好的壓縮
單詞表能夠包含本土字符,但必須使用規範化形式兼容性分解(NFKD)以UTF-8編碼。
1.16.5. 從助記詞到種子
用戶能夠決定用密碼保護他們的助詞。若是密碼不存在,則使用空字符串「」代替。
要經過助記詞建立一個二進制種子,咱們使用助記符做爲密碼(UTF-8 NFKD)和字符串「mnemonic」+ passphrase 做爲鹽(再次以UTF-8 NFKD)來調用PBKDF2函數。迭代計數設置爲2048,HMAC-SHA512用做僞隨機函數。派生密鑰的長度爲512位(= 64字節)。
該種子能夠隨後用於使用BIP-0032或相似方法產生肯定性錢包。
助記詞轉換爲二進制種子徹底獨立於生成這個助記詞。這致使至關簡單的代碼; 助記詞結構沒有約束,客戶能夠自由地實現本身的單詞列表,甚至是整個助記詞的生成器,容許字典列表中的輸入錯誤檢測或其餘用途的靈活性。
雖然使用的助記詞可能不是經過「生成助記詞」部分中描述的算法生成的,但這是不建議的,軟件必須使用單詞表計算助記詞的校驗和,若是無效則發出警告。
所描述的方法還提供彷佛可信的能否認性,由於每一個密碼短語產生一個有效的種子(所以產生肯定性錢包),可是隻有正確的那一個才能使所需的錢包可用。
1.16.6. 單詞列表
https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md
若是一個 HD 錢包助記詞是 12 個單詞,一共有 2048 個單詞可能性,如何算出隨機的生成的助記詞可能性是一個排列問題,根據公式: n!/( n - r )! ,既 2048!/(2048-12)! = 5.2715379713014884760003093175282e+39。
Wordlists
English https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt
Japanese https://github.com/bitcoin/bips/blob/master/bip-0039/japanese.txt
Korean https://github.com/bitcoin/bips/blob/master/bip-0039/korean.txt
Spanish https://github.com/bitcoin/bips/blob/master/bip-0039/spanish.txt
Chinese (Simplified) https://github.com/bitcoin/bips/blob/master/bip-0039/chinese_simplified.txt
Chinese (Traditional) https://github.com/bitcoin/bips/blob/master/bip-0039/chinese_traditional.txt
French https://github.com/bitcoin/bips/blob/master/bip-0039/french.txt
Italian https://github.com/bitcoin/bips/blob/master/bip-0039/italian.txt
1.16.7. 開發庫
1.16.7.1. Node.js
https://www.npmjs.com/package/bip39
1.16.7.2. Python
https://github.com/trezor/python-mnemonic
1.16.7.3. 其餘實現
Elixir: https://github.com/izelnakri/mnemonic
Objective-C: https://github.com/nybex/NYMnemonic
Haskell: https://github.com/haskoin/haskoin
.NET C# (PCL): https://github.com/Thashiznets/BIP39.NET
.NET C# (PCL): https://github.com/NicolasDorier/NBitcoin
JavaScript: https://github.com/bitpay/bitcore-mnemonic, https://github.com/bitcoinjs/bip39 (used by blockchain.info)
Ruby: https://github.com/sreekanthgs/bip_mnemonic
Rust: https://github.com/infincia/bip39-rs
Swift: https://github.com/CikeQiu/CKMnemonic
C++: https://github.com/libbitcoin/libbitcoin/blob/master/include/bitcoin/bitcoin/wallet/mnemonic.hpp
C (with Python/Java/Javascript bindings): https://github.com/ElementsProject/libwally-core
1.16.8. Netkiller 助記詞詞庫
HD Wallet 採用 2048 個單詞,或者漢字做爲助記詞,這些詞庫對外公開,不少錢包僅僅使用path第一個地址而且沒有加密。若是你知道某個用戶的助記詞中的11各詞的排列順序,那麼咱們就能夠經過窮舉方法,算出全部地址的私鑰,若是碰巧找到了已經在使用的地址。就能夠將裏面的ETH所有轉走。
爲了增長 HD Wallet 的安全,我作了一個詞庫,這個詞庫不對外公開,而且使用的漢字均是不經常使用漢字。只能複製粘貼,幾乎很難使用輸入法輸入該漢字。
同時path 還作了分層,和索引地址。分層採用時間維度,索引採用隨機數, Seed 作加密處理。助記詞共 15 個漢字。
效果以下
漢字助記詞:欈 戀 髎 響 麢 戵 邎 蠢 鶖 躒 蠈 鰘 譥 趲 巆
地址:0x4949225eab0121d1e0b0eeb286a12b04ff596471
私鑰:b5ce4ac958fbdcd385d6ae850c1870c6da7b990981363c25036a31ba06be6636
漢字助記詞:霼 彎 曤 纀 鸇 鷔 鶹 纚 鱱 讁 艣 鼴 黭 纒 贛
地址:0x430097d16819108068a7af22a116285e54bc3e6b
私鑰:3b78431a43a2c69e861870f0eff1d54d3965247ca5e588a9f907904f9ea5b822
漢字助記詞:聾 鱦 驥 鬘 鰕 蘲 韃 鏻 雤 鑀 瓤 蘣 壥 躠 罋
地址:0x641fd58728cf08bc8795d41cfd3885a4f1c8dced
私鑰:b7c2ff2a39e3a534e6e89288b05b4a283b10b34b2dfca2b336676729c7a68ad1
漢字助記詞:轕 鶼 瀝 钁 麝 鸑 灙 纞 躐 嚹 櫞 鱁 贑 癠 躤
地址:0xae6ad7cf3e31556bc7262e25fba2ebad9954d08b
私鑰:c989fe5c108b0bd33e5731919e09c30c639a4ff29fb4e66fe3052975855181f6
漢字助記詞:鰵 鐗 鱇 彏 鱞 鷮 鼯 矃 曟 鬙 衢 斅 櫜 鸒 襨 地址:0x7fc6bca55c51ab3b4266d8f67d63c196ac874d93 私鑰:53e755075653a64867f885e702ca0a2612bdd13ec2bed0df647bf568a639bc46