最近 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("请输入你的随机字符串: ")))
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.