【翻译】BIP39协议:使用助记词生成确定性钱包
BIP39协议:使用助记词生成确定性钱包
BIP:39
层:应用层
标题:使用助记词生成确定性钱包秘钥
作者:Marek Palatinus <[email protected]>
Pavol Rusnak <[email protected]>
Aaron Voisine <[email protected]>
Sean Bowe <[email protected]>
状态:已经被提议
类型:标准化跟踪
创建日期:2013-09-10
译者:kimziv
摘要
这个BIP描述了使用助记码或者助记句子(简称助记词)--一组便于记忆的单词来生成确定性钱包。
这个BIP由两部分构成:生成助记词和把生成的助记词转化成一个二进制种子。这个种子后面会更急类似于BIP32的方法生成确定性钱包。
动机
与处理原始的二进制或者十六进制的钱包种子相比,在人机交互过程中助记词是更胜一筹的。这些助记单词可以被写在纸上或者通过电话说出来。
本指南旨在通过人类可读的转录来传输计算机生成的随机性。并不是将用户创建的句子(也称为脑钱包)处理到钱包种子中的方法。
生成助记词
助记符必须以32位的倍数编码熵。随着熵的安全性提高,同时句子的长度也在增加。我们将初始熵长度称为ENT。ENT允许的大小为128-256位。
首先,生成ENT位的初始熵。通过取第一个生成的校验和
ENT/32
它的SHA256哈希的位。该校验和附加到初始熵的末尾。接下来,这些连接的比特位被分成多个11位的组,每个组用从0-2047的数字编码,用作单词表的索引。最后,我们将这些数字转换为单词,并将加入的所有单词组成助记句。
下表描述了初始熵长度(ENT),校验和长度(CS)和生成助记词(MS)的长度之间的关系。
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 |
单词表
理想的单词列表具有以下特点:
a)智能选词
- 单词列表以这种方式创建:输入前四个字母来就足以明确地标识这个单词;
b)避免相似的单词
- "build" and "built", "woman" and "women", or "quick" and "quickly"
这样的词对,不仅使记忆困难,而且更容易出错,更难猜到;
c)排序的单词列表
- 排序的单词列表允许更有效地查找代码字(即,实现可以使用二分搜索而不是线性搜索)
- 这也允许使用字典树(前缀树),例如用于更好的压缩
单词表可以包含本土字符,但必须使用规范化形式兼容性分解(NFKD)以UTF-8编码。
从助记词到种子
用户可以决定用密码保护他们的助词。如果密码不存在,则使用空字符串“”代替。
要通过助记词创建一个二进制种子,我们使用助记符作为密码(UTF-8 NFKD)和字符串“mnemonic”+ passphrase 作为盐(再次以UTF-8 NFKD)来调用PBKDF2函数。迭代计数设置为2048,HMAC-SHA512用作伪随机函数。派生密钥的长度为512位(= 64字节)。
该种子可以随后用于使用BIP-0032或类似方法产生确定性钱包。
助记词转换为二进制种子完全独立于生成这个助记词。这导致相当简单的代码; 助记词结构没有约束,客户可以自由地实现自己的单词列表,甚至是整个助记词的生成器,允许字典列表中的输入错误检测或其他用途的灵活性。
虽然使用的助记词可能不是通过“生成助记词”部分中描述的算法生成的,但这是不建议的,软件必须使用单词表计算助记词的校验和,如果无效则发出警告。
所描述的方法还提供似乎可信的可否认性,因为每个密码短语产生一个有效的种子(因此产生确定性钱包),但是只有正确的那一个才能使所需的钱包可用。
单词列表
测试向量
测试矢量包括输入熵,助记词和种子。密码“TREZOR”用于所有向量载体。
https://github.com/trezor/python-mnemonic/blob/master/vectors.json另请参阅:
https://github.com/bip32JP/bip32JP.github.io/blob/master/test_JP_BIP39.json
(日语单词列表测试与严格归一化的符号作为密码)
参考实现
包括单词列表的参考实现:
http://github.com/trezor/python-mnemonic
其他实现
- 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
good job.resteem and upvote you. follow @cryptomaker
good job