[加密货币] 十行代码,生成绝对安全助记词

·

最近 V2 加密币圈热度很高,我对助记词生成模块 mnemonic 进行了阉割,只保留了核心的 助记词生成算法,支持 12–24 个 BIP39 标准助记词,无依赖,可以在任何 python 环境执行,在不触网的情况下运行,理论上绝对安全。

在原有算法基础上,增加了 用户输入熵 + 时间熵,防止运行环境的随机函数有后门。
生成的助记词可以直接导入硬件钱包或者软钱包的冷钱包模式,野路子硬件钱包用的放心点。


import hashlib,secrets,time,os

# BIP39 英文单词表( 2048 个,这里自己补全)
wordlist = ['abandon', 'ability', 'able', 'about', 'above', 'absent', 'absorb']
        
def generate(strength: int = 128, extra_entropy: str = "") -> str:
    if strength not in [128, 160, 192, 224, 256]:
        raise ValueError("strength 必须是 [128,160,192,224,256]")
    sys_entropy = secrets.token_bytes(strength // 8)
    user_entropy = extra_entropy.encode("utf-8") if extra_entropy else os.urandom(16)
    time_entropy = str(time.time_ns()).encode("utf-8")
    combined = hashlib.sha256(sys_entropy + user_entropy + time_entropy).digest()
    data = combined[: strength // 8]
    h = hashlib.sha256(data).hexdigest()
    b = (
        bin(int.from_bytes(data, byteorder="big"))[2:].zfill(len(data) * 8)
        + bin(int(h, 16))[2:].zfill(256)[: len(data) * 8 // 32]
    )
    result = []
    for i in range(len(b) // 11):
        idx = int(b[i * 11 : (i + 1) * 11], 2)
        result.append(wordlist[idx])
    return " ".join(result)

if __name__ == "__main__":
    #默认 12 个助记词
    print(generate(128, input("请输入你的随机字符串: ")))

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *