最近 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("请输入你的随机字符串: ")))
1
SodaPopBoy OP |
![]() |
2
AoEiuV020JP 9 天前
生成助记词这一步要安全还是比较容易的, 我比较在意你说的“软钱包的冷钱包模式”具体是什么,
|
3
SodaPopBoy OP @AoEiuV020JP 有些软钱包有冷钱包模式,可以在不触网的情况下使用二维码扫码签名,比如 tronlink 、Ownbit 、imToken
|