为什么会这样btclib.mnemonic来自原始熵声称我传递的信息少于128位熵?

2024-05-15 16:23:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做的是生成“虚拟”钱包,从原始熵中检索一个助记符密码短语和钱包,这个熵是使用secrets.randbits(128)生成的——产生一对有效的bip39密钥。你知道吗

我遇到的错误是:

ValueError: 125 bits provided; expected: (128, 160, 192, 224, 256)

它可以从122位到127位不等。它通常对一行中的多个错误表示相同的位数,即125 bits provided3次,然后切换到122 bits provided2次,然后在第6次尝试时工作。你知道吗

我正在使用btclib–完整的功能是

def create_passphrase():
    memo = bip39.mnemonic_from_raw_entropy(secrets.randbits(128) , 'en')

    print(mnemo) 
    return mnemo

对不起,我遗漏了一些明显的东西。你知道吗


Tags: 密码错误密钥provided助记符bitsexpectedsecrets
2条回答

这是btclib中的一个bug。你知道吗

函数^{}调用^{},后者调用^{}。你知道吗

调用entropy.str_from_entropy()时,使用整数作为其entr参数,它会尝试将该整数转换为表示位的字符串here

        entr = bin(entr)[2:] # remove '0b'

这是错误的:任何传入的整数,如果它是真正随机的,只会被转换为大约一半时间内所期望的位数。要了解原因,请考虑以下随机数据示例(为了简单起见,我将使用8位而不是128位,但原理是相同的):

>>> bin(0b10001011)[2:]
'10001011'
>>> bin(0b01010110)[2:]
'1010110'
>>> bin(0b00111011)[2:]
'111011'

如您所见,btclib使用的转换方法去掉了任何前导零,导致产生了长度错误的字符串。你知道吗

一种解决方法是自己将secrets.randbits(128)的结果转换为适当的字符串,并传递:

def create_passphrase(bits=128):
    bitstring = f'{secrets.randbits(bits):0{bits}b}'
    memo = bip39.mnemonic_from_raw_entropy(bitstring , 'en')
    print(memo) 
    return memo

…假设btclib里没有其他虫子等着咬你。你知道吗

谢谢你的报告。你知道吗

丢失前导零符合Electrum熵->;记忆行为,但导致BIP39出现错误。你知道吗

它现在固定在主分支上: https://github.com/dginst/btclib/commit/f0f802ef3e31ae74e84964f0ec04d1180f42da27

相关问题 更多 >