最近 V2 加密币圈热度很高,我对助记词生成模块 mnemonic 进行了阉割,只保留了核心的 助记词生成算法,支持 1224 个 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("请输入你的随机字符串: ")))
1 SodaPopBoy OP |
![]() | 2 AoEiuV020JP 45 天前 生成助记词这一步要安全还是比较容易的, 我比较在意你说的“软钱包的冷钱包模式”具体是什么, |
3 SodaPopBoy OP @AoEiuV020JP 有些软钱包有冷钱包模式,可以在不触网的情况下使用二维码扫码签名,比如 tronlink 、Ownbit 、imToken |