mirror of
				https://github.com/bitcoin/bips.git
				synced 2025-11-03 14:19:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			146 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
<pre>
 | 
						|
  BIP: 39
 | 
						|
  Layer: Applications
 | 
						|
  Title: Mnemonic code for generating deterministic keys
 | 
						|
  Author: Marek Palatinus <slush@satoshilabs.com>
 | 
						|
          Pavol Rusnak <stick@satoshilabs.com>
 | 
						|
          Aaron Voisine <voisine@gmail.com>
 | 
						|
          Sean Bowe <ewillbefull@gmail.com>
 | 
						|
  Comments-Summary: Unanimously Discourage for implementation
 | 
						|
  Comments-URI: https://github.com/bitcoin/bips/wiki/Comments:BIP-0039
 | 
						|
  Status: Final
 | 
						|
  Type: Standards Track
 | 
						|
  Created: 2013-09-10
 | 
						|
  License: MIT
 | 
						|
</pre>
 | 
						|
 | 
						|
==Abstract==
 | 
						|
 | 
						|
This BIP describes the implementation of a mnemonic code or mnemonic sentence --
 | 
						|
a group of easy to remember words -- for the generation of deterministic wallets.
 | 
						|
 | 
						|
It consists of two parts: generating the mnemonic and converting it into a
 | 
						|
binary seed. This seed can be later used to generate deterministic wallets using
 | 
						|
BIP-0032 or similar methods.
 | 
						|
 | 
						|
==Copyright==
 | 
						|
 | 
						|
This BIP falls under the MIT License.
 | 
						|
 | 
						|
==Motivation==
 | 
						|
 | 
						|
A mnemonic code or sentence is superior for human interaction compared to the
 | 
						|
handling of raw binary or hexadecimal representations of a wallet seed. The
 | 
						|
sentence could be written on paper or spoken over the telephone.
 | 
						|
 | 
						|
This guide is meant to be a way to transport computer-generated randomness with
 | 
						|
a human-readable transcription. It's not a way to process user-created
 | 
						|
sentences (also known as brainwallets) into a wallet seed.
 | 
						|
 | 
						|
==Generating the mnemonic==
 | 
						|
 | 
						|
The mnemonic must encode entropy in a multiple of 32 bits. With more entropy
 | 
						|
security is improved but the sentence length increases. We refer to the
 | 
						|
initial entropy length as ENT. The allowed size of ENT is 128-256 bits.
 | 
						|
 | 
						|
First, an initial entropy of ENT bits is generated. A checksum is generated by
 | 
						|
taking the first <code>ENT / 32</code> bits of its SHA256 hash. This checksum is
 | 
						|
appended to the end of the initial entropy. Next, these concatenated bits
 | 
						|
are split into groups of 11 bits, each encoding a number from 0-2047, serving
 | 
						|
as an index into a wordlist. Finally, we convert these numbers into words and
 | 
						|
use the joined words as a mnemonic sentence.
 | 
						|
 | 
						|
The following table describes the relation between the initial entropy
 | 
						|
length (ENT), the checksum length (CS), and the length of the generated mnemonic
 | 
						|
sentence (MS) in words.
 | 
						|
 | 
						|
<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>
 | 
						|
 | 
						|
==Wordlist==
 | 
						|
 | 
						|
An ideal wordlist has the following characteristics:
 | 
						|
 | 
						|
a) smart selection of words
 | 
						|
   - the wordlist is created in such a way that it's enough to type the first four
 | 
						|
     letters to unambiguously identify the word
 | 
						|
 | 
						|
b) similar words avoided
 | 
						|
   - word pairs like "build" and "built", "woman" and "women", or "quick" and "quickly"
 | 
						|
     not only make remembering the sentence difficult but are also more error
 | 
						|
     prone and more difficult to guess
 | 
						|
 | 
						|
c) sorted wordlists
 | 
						|
   - the wordlist is sorted which allows for more efficient lookup of the code words
 | 
						|
     (i.e. implementations can use binary search instead of linear search)
 | 
						|
   - this also allows trie (a prefix tree) to be used, e.g. for better compression
 | 
						|
 | 
						|
The wordlist can contain native characters, but they must be encoded in UTF-8
 | 
						|
using Normalization Form Compatibility Decomposition (NFKD).
 | 
						|
 | 
						|
==From mnemonic to seed==
 | 
						|
 | 
						|
A user may decide to protect their mnemonic with a passphrase. If a passphrase is not
 | 
						|
present, an empty string "" is used instead.
 | 
						|
 | 
						|
To create a binary seed from the mnemonic, we use the PBKDF2 function with a mnemonic
 | 
						|
sentence (in UTF-8 NFKD) used as the password and the string "mnemonic" + passphrase (again
 | 
						|
in UTF-8 NFKD) used as the salt. The iteration count is set to 2048 and HMAC-SHA512 is used as
 | 
						|
the pseudo-random function. The length of the derived key is 512 bits (= 64 bytes).
 | 
						|
 | 
						|
This seed can be later used to generate deterministic wallets using BIP-0032 or
 | 
						|
similar methods.
 | 
						|
 | 
						|
The conversion of the mnemonic sentence to a binary seed is completely independent
 | 
						|
from generating the sentence. This results in a rather simple code; there are no
 | 
						|
constraints on sentence structure and clients are free to implement their own
 | 
						|
wordlists or even whole sentence generators, allowing for flexibility in wordlists
 | 
						|
for typo detection or other purposes.
 | 
						|
 | 
						|
Although using a mnemonic not generated by the algorithm described in "Generating the
 | 
						|
mnemonic" section is possible, this is not advised and software must compute a
 | 
						|
checksum for the mnemonic sentence using a wordlist and issue a warning if it is
 | 
						|
invalid.
 | 
						|
 | 
						|
The described method also provides plausible deniability, because every passphrase
 | 
						|
generates a valid seed (and thus a deterministic wallet) but only the correct one
 | 
						|
will make the desired wallet available.
 | 
						|
 | 
						|
==Wordlists==
 | 
						|
 | 
						|
Since the vast majority of BIP39 wallets supports only the English wordlist,
 | 
						|
it is '''strongly discouraged''' to use non-English wordlists for generating
 | 
						|
the mnemonic sentences.
 | 
						|
 | 
						|
If you still feel your application really needs to use a localized wordlist,
 | 
						|
use one of the following instead of inventing your own.
 | 
						|
 | 
						|
* [[bip-0039/bip-0039-wordlists.md|Wordlists]]
 | 
						|
 | 
						|
==Test vectors==
 | 
						|
 | 
						|
The test vectors include input entropy, mnemonic and seed. The
 | 
						|
passphrase "TREZOR" is used for all vectors.
 | 
						|
 | 
						|
https://github.com/trezor/python-mnemonic/blob/master/vectors.json
 | 
						|
 | 
						|
Also see https://github.com/bip32JP/bip32JP.github.io/blob/master/test_JP_BIP39.json
 | 
						|
 | 
						|
(Japanese wordlist test with heavily normalized symbols as passphrase)
 | 
						|
 | 
						|
==Reference Implementation==
 | 
						|
 | 
						|
Reference implementation including wordlists is available from
 | 
						|
 | 
						|
http://github.com/trezor/python-mnemonic
 |