从BIP39(助记符)到BIP32(公用/专用密钥)

时间:2019-01-13 23:01:37

标签: python cryptography bitcoin cryptocurrency mnemonics

我正在寻找开发一些代码,该代码从助记符创建比特币私钥和公钥。我目前对该过程的理解是:

entropy > nmemonic > seed > public/private keys > public address

我在代码中使用Trezor's nmemonic librarymoneywagon

import string
from random import SystemRandom, randrange
from binascii import hexlify, unhexlify
from moneywagon import generate_keypair
from mnemonic import mnemonic

def gen_rand():
    foo = SystemRandom()
    length = 32
    chars = string.hexdigits
    return ''.join(foo.choice(chars) for _ in range(length))

mnemo = mnemonic.Mnemonic('english')

entropy = gen_rand()
# entropy = '00000000000000000000000000000000'

words = mnemo.to_mnemonic(unhexlify(entropy))
seed = hexlify(mnemo.to_seed(words, passphrase='apassphrase'))
address = generate_keypair('btc', seed)

print(words)  
print(seed)
print(address['public']['address'])
print(address['private']['hex'])

如果注释掉上面的熵行并运行代码,则会得到:

abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
b'05de15fb96dc0ab9f03c9d411bf84c586c72e7c30bddd413a304896f9f994ea65e7fcafd2c6b796141e310850e5f30b6abc2e6aec79a8ff81f4ba38fde81c403'
15GyM1xxxxxxxxxxxxxxxxxxxxxxTXrrvG
8ede10xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcae501

我的问题是,iancoleman.io/bip39bip32jp.github.io都没有反映出用于生成助记码和公钥/私钥的情况。

我要去哪里错了?

1 个答案:

答案 0 :(得分:1)

给定助记符,这两个站点都会生成与您相​​同的种子:

abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about

另外https://bip32jp.github.io/english/给出您的强制熵

entropy = '00000000000000000000000000000000'

(您必须选择以16为基数的编码,因为您对unhexlify的调用将这样解释该字符串)

第一个站点https://iancoleman.io/bip39/#english似乎通过启发式方法确定了熵的字符串编码,并将其识别为二进制。因此,这产生了另一个结果。

的值

address['public']['address']
address['private']['hex']

在两个页面上都与您的页面有所不同,因为这些页面与moneywagon使用不同的推导算法。 Moneywagon使用不鼓励使用的算法BIP38。我认为这是两个网站都不提供的原因。