助记词碰撞器要真能撞到钱,得同时满足两个条件:程序试得足够快;有余额的助记词在全部组合里占得足够密。按助记词规范去算,后一个条件差得太远,12 个词的有效组合有 2 的 128 次方种,有余额的那一小部分放进去,稀到再快的机器也碰不上。
钱的去向反倒清楚。你先付了软件钱;要是还照它的要求填过自己的助记词,那组词可能已经到了别人手里。
助记词碰撞器的原理
助记词是一组单词。钱包软件里有一份词表,每个单词对应一个数字,整组单词能换算成一个数,钱包拿这个数当种子,生成全部密钥对(Bitcoin Wiki「Seed phrase」词条的简化说法)。所以谁拿到这组词,谁就拿到了整个钱包。
碰撞器想走的是另一条路:不等谁把助记词泄露出来,自己随机生成一组符合规范的,算出它对应的地址,再看这个地址上有没有余额。币一直记在链上,地址的余额谁都能查,原因见加密钱包里到底存了什么。查到有余额,就用这组词把币转走;没有,就换下一组。
它没有破解哪一个人的钱包,也不针对谁。打着「助记词破解」名号的软件,号称做的也是这件事:盲猜,然后指望猜中的那组恰好有人在用。
碰撞概率:12 个词有 2 的 128 次方种组合
助记词的生成办法写在 BIP-39(比特币改进提案第 39 号)里。先生成一段随机数,长度在 128 到 256 位之间、且是 32 的倍数;再对它做一次 SHA-256 哈希,取开头几位当校验位接在后面;然后每 11 位切成一组,每组是 0 到 2047 之间的一个编号,对应词表里的一个单词。编号有 2048 个,也就是 2 的 11 次方。
规范给出的几种长度如下,有效组合数由随机位数决定:
| 单词数 | 随机位 | 校验位 | 有效组合数 |
|---|---|---|---|
| 12 | 128 | 4 | 2 的 128 次方 |
| 15 | 160 | 5 | 2 的 160 次方 |
| 18 | 192 | 6 | 2 的 192 次方 |
| 21 | 224 | 7 | 2 的 224 次方 |
| 24 | 256 | 8 | 2 的 256 次方 |
12 个词是 128 + 4 = 132 位,正好 12 × 11。2 的 128 次方写出来是一个 39 位数,约 3.4 × 10³⁸。从词表里随手挑 12 个词,排法有 2048 的 12 次方即 2 的 132 次方种,其中校验位对得上的只占 16 分之一,剩下的连合规的助记词都算不上。
试一组也不是看一眼的事。按规范,助记词要先经过 2048 轮 HMAC-SHA512 运算才得到种子,种子再派生出密钥和地址,之后才轮到比对余额。
算例下面故意把条件往对碰撞器有利的方向放宽来算,两个数都是假设。速度取每秒 1 万亿组,即 10¹² 组。一年有 365 × 24 × 3,600 = 31,536,000 秒,约 3.15 × 10⁷ 秒,一年能试 3.15 × 10¹⁹ 组。把 12 个词的有效组合全部过一遍:3.4 × 10³⁸ ÷(3.15 × 10¹⁹)≈ 1.08 × 10¹⁹ 年,一千亿亿年出头。碰撞器不挑对象,撞中哪一组有余额的都算,于是再把有余额的助记词算成 10 亿组(10⁹):平均要试 3.4 × 10³⁸ ÷ 10⁹ = 3.4 × 10²⁹ 组才撞中一次,按这个速度是 3.4 × 10¹⁷ 秒,再除以 3.15 × 10⁷,约 1.08 × 10¹⁰ 年,合 108 亿年撞中一次。
把速度再提高一千倍,108 亿年变成 1,080 万年,仍然等不到。换成 24 个词,组合数是 2 的 256 次方,年数后面还要再添几十个零。
同一个 2 的 128 次方,放到钱包这一边就是安全的来源:钱包应用新建钱包时也是随机生成一组词,不必向谁登记、也不必查重,靠的就是两组词几乎撞不到一起。这组词在钱包应用里生成,只该出现在本机屏幕上,由你抄走。
助记词的最后一个词不能随便选:它带着校验位
前 11 个词可以是词表里的任意组合,最后一个词却要和它们对得上,因为校验位全落在最后一个词里。
拿 12 个词来数。每个词占 11 位,前 11 个词一共 11 × 11 = 121 位,全是随机数。128 位随机数还剩 128 − 121 = 7 位,和 4 位校验位拼在一起,正好是第 12 个词的 11 位。校验位取自那 128 位随机数的哈希,随机数定了,它就定了。所以前 11 个词给定之后,第 12 个词只有 7 位可以变,能通过校验的是 2 的 7 次方即 128 个,占词表 2048 个词的 16 分之一。
24 个词的校验位更长。前 23 个词占 23 × 11 = 253 位,256 位随机数只剩 3 位留给最后一个词,另外 8 位都是校验位,能通过校验的最后一个词只有 2 的 3 次方即 8 个。
校验位的用处是发现抄错、输错。钱包软件拿到一组助记词要先算一遍校验,对不上就必须给出警告(BIP-39 的要求)。它能做的也就到这一步:校验位很短,只能以不高的概率发现随机错误,每 256 个错误会漏掉 1 个,也帮不上纠错,这是规范自己列出的不足。8 位校验位对应的正是 2 的 8 次方等于 256;12 个词只有 4 位,一个词错成了别的词、还刚好通过校验的机会大约是 16 分之一。
恢复钱包时软件提示助记词无效,先回头对照纸上那份,逐词核对拼写和顺序。软件没报错,也要看一眼恢复出来的地址是不是原来那个。
助记词碰撞器是不是骗局,卖家靠什么赚钱
算下来撞不中,软件却还有人卖,收入就只能来自买的人。从机制上看有两笔。
看得见的一笔是买软件付的钱,付款时卖方就已经收到了,和之后撞没撞中无关。
还有看不见的一笔。碰撞器是跑在买家电脑上的一段程序,它在后台做什么,由写它的人决定。如果它要买家填入自己正在用的助记词,这组词就可能被发回给卖方,买家钱包里的资产随之可以被转走。即使没有填,程序和钱包装在同一台电脑上,它读了哪些文件,买家也无从确认。就算界面上跳出「发现余额」,那也是程序自己显示的内容,不等于链上发生过什么。
ethereum.org 的安全与防骗指南写到,合法的服务、支持人员和网站都不会向你索要助记词或私钥。一个软件开口要你自己的助记词,不管它自称是做什么的,都已经越过了这条线。
网页和陌生软件里的「助记词生成器」,能不能拿来建钱包
不建议。按 BIP-39 的写法,助记词的起点是一段随机数,后面的单词全由它换算出来。这组词安不安全,押在两件事上:那段随机数是真随机的;生成之后只有你自己见过。
钱包应用在本机生成助记词,显示在屏幕上让人抄下来,这两件事都由自己的设备完成。换成网页或来历不明的软件来生成,哪一件都没法确认。对方可能在生成的同时留了一份;也可能给出的根本不是随机结果,只是从事先备好的一批里发出一组。两种情况的后果一样:往这个钱包转入的资产,对方用同一组词就能转走。
助记词连输进网站都不行,让网站替你生成就更进了一步:那组词从一开始就不只在你一个人手里。
在钱包应用里新建钱包,这个动作本身就是在生成助记词,不需要另找生成器。
想让助记词和私钥从生成到签名都不碰联网的设备,是冷钱包在做的事。
自己编 12 个词当助记词行不行
不行,原因有两层。
头一层,多半过不了校验。从词表里随手挑 12 个词,校验位对得上的只占 16 分之一;对不上的那些,钱包软件要给出警告。
更要紧的一层在随机性。BIP-39 开头就划了范围:它做的是把电脑生成的随机数转写成人能读的单词,不是拿来把用户自己想的句子(所谓脑钱包)加工成钱包种子的。用不按规范生成的助记词,技术上做得到,规范的态度是不建议。Bitcoin Wiki 说得更直白:自己发明助记词不安全,因为人不擅长制造随机;最好的办法是让钱包软件生成一组,你照着抄下来。
碰撞器撞不中,前提是 128 位里每一位都随机。自己编的词哪怕刚好通过了校验,也没有这个前提:人挑出来的词谈不上随机,可能的范围就不再是 2 的 128 次方种。
把 12 个词拆成两半、分两处存放,同样不可取:其中 6 个词被人看到,剩下的就好猜得多。剩下的 6 个词占 66 位,扣掉 4 位校验位,还有 2 的 62 次方种,约 4.6 × 10¹⁸;仍按每秒 1 万亿组这个假设的速度,4.6 × 10⁶ 秒就能试完,合 53 天左右。想把保管分散开,Bitcoin Wiki 的建议是改用多重签名钱包。
下载过碰撞器、填过自己的助记词,现在该怎么办
把填过的那组助记词当作已经泄露。一组助记词派生出的私钥是固定的,泄露之后没法像改密码那样改掉,能做的只有换一组。建议按这个顺序处理:
- 换一个没装过这类软件的环境再往下做:在另一个浏览器(或另一个浏览器配置文件)里安装钱包,手机端换一台设备;原来那台电脑扫描一遍。
- 在钱包应用里新建一个钱包,得到一组新的助记词,用纸笔抄好并逐词核对(抄下来的纸放在哪里:私钥、助记词、地址的区别)。
- 把旧钱包各个地址上的资产转到新钱包的地址。不同的链、不同的币要分开转,每一笔都要付链上手续费。
- 旧助记词派生出的地址不再用来收款,也别把它导入新设备接着用。
只是下载运行过、没有填过助记词,但同一台电脑上装着钱包的,没法确认程序读过什么,照这个顺序做一遍更稳妥。新建钱包和转出资产的按钮在哪,各家钱包不一样,照你用的那款钱包的帮助文档来。
这几步只能让还在旧地址上的资产换个去处,已经被转走的部分换不回来。
常见疑问
助记词碰撞的概率到底有多大?
按 BIP-39 规范,12 个词的有效组合是 2 的 128 次方种,约 3.4 乘 10 的 38 次方。即使把有余额的助记词算成 10 亿组,随机生成一组恰好撞中其中一组的概率也只有 3.4 乘 10 的 29 次方分之一。
GitHub 上开源的助记词碰撞程序,代码公开就可信吗?
代码公开改变不了组合数,2 的 128 次方种组合对谁写的程序都一样。另一层风险在运行这一步:下载到电脑上的程序和公开的那份代码是不是同一份,你很难自己确认。不建议运行这类程序,更不要向它填入自己的助记词。
24 个词的助记词比 12 个词多出多少种组合?
按 BIP-39 规范,24 个词对应 256 位随机数,有效组合是 2 的 256 次方种;12 个词对应 128 位,是 2 的 128 次方种。前者是后者的 2 的 128 次方倍。对随机去撞的程序来说,两种长度都远在试得完的范围之外。
助记词应该在哪里生成?
在自己设备上的钱包应用里新建钱包时生成,然后用纸笔抄下。不建议用网页或来历不明的软件替自己生成:对方可能在生成的同时留了一份,也可能给出的根本不是随机结果。



