<p>这是btclib中的一个bug。你知道吗</p>
<p>函数<a href="https://github.com/fametrano/btclib/blob/master/btclib/bip39.py#L63" rel="nofollow noreferrer">^{<cd1>}</a>调用<a href="https://github.com/fametrano/btclib/blob/master/btclib/bip39.py#L57" rel="nofollow noreferrer">^{<cd2>}</a>,后者调用<a href="https://github.com/fametrano/btclib/blob/master/btclib/entropy.py#L21" rel="nofollow noreferrer">^{<cd3>}</a>。你知道吗</p>
<p>调用<code>entropy.str_from_entropy()</code>时,使用整数作为其<code>entr</code>参数,它会尝试将该整数转换为表示位的字符串<a href="https://github.com/fametrano/btclib/blob/master/btclib/entropy.py#L44" rel="nofollow noreferrer">here</a>:</p>
<pre><code> entr = bin(entr)[2:] # remove '0b'
</code></pre>
<p>这是错误的:任何传入的整数,如果它是真正随机的,只会被转换为大约一半时间内所期望的位数。要了解原因,请考虑以下随机数据示例(为了简单起见,我将使用8位而不是128位,但原理是相同的):</p>
<pre><code>>>> bin(0b10001011)[2:]
'10001011'
>>> bin(0b01010110)[2:]
'1010110'
>>> bin(0b00111011)[2:]
'111011'
</code></pre>
<p>如您所见,btclib使用的转换方法去掉了任何前导零,导致产生了长度错误的字符串。你知道吗</p>
<p>一种解决方法是自己将<code>secrets.randbits(128)</code>的结果转换为适当的字符串,并传递:</p>
<pre><code>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
</code></pre>
<p>…假设btclib里没有其他虫子等着咬你。你知道吗</p>