python - 为什么 btclib.mnemonic_from_raw_entropy 声称我传递给它的熵少于 128 位?

标签 python python-3.x cryptography bitcoin entropy

我正在做的是生成“虚拟”钱包,从原始熵中检索助记密码和钱包,这是使用 secrets.randbits(128) 生成的 - 从而产生有效的 bip39 对键。

我得到的错误是这样的:

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

它可以在 122 到 127 位之间变化。通常表示连续多个错误的位数相同,即 3 次 125 位提供,然后切换到 122 位提供 2 次,然后工作在第6次尝试。

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

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

    print(mnemo) 
    return mnemo

抱歉,如果我遗漏了一些明显的东西。

最佳答案

这是 btclib 中的一个错误。

函数 bip39.mnemonic_from_raw_entropy() 来电 bip39.entropy_from_raw_entropy() ,它调用 entropy.str_from_entropy() .

何时 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 中没有其他错误等着咬你。

关于python - 为什么 btclib.mnemonic_from_raw_entropy 声称我传递给它的熵少于 128 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55211270/

相关文章:

security - 最好的核导弹加密系统是什么?

ssl - 如何识别 SSL 中使用的证书的 PKCS?

security - 为什么 Kerberos 协议(protocol)不具有完美的前向保密性?

python - 转换日期格式保持其类型python

python - Django TypeError : argument of type 'PosixPath' is not iterable

python - 使用 NumPy 。关于数字或替代数组的 binary_repr - Python

python - Imagemagick 或类似的脚本图像增强

python-3.x - 使用 ffmpeg-python 创建隔行扫描视频

python - 如何解析分层的 XML 字符串

python - 给定一个 Redis Broker 和一个数据库后端,Celery Task 请求首先写入哪里?