BIP39 助记词 → BIP32 子私钥
把 12/15/18/21/24 个单词的助记词加上可选的 passphrase,算成 512 位 BIP39 种子,再沿着 BIP32 路径一层层走到叶子私钥 —— 途中每一步都给出链码与压缩公钥,最后落到 WIF 和一个真实可用的地址。
请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。
本页计算了什么
它把一句话的 BIP39 助记词加上可选的 passphrase 变成 512 位种子,然后沿着 BIP32 派生路径一层层走下去, 直到落在一个真实可用的私钥上——这个私钥同时带有 WIF、公钥、hash160 和地址。这里没有任何缓存:本页显示的每一个 数字都是用你输入的文本重新算出来的。
I = HMAC-SHA512(key = "Bitcoin seed", data = seed) → k主 = I[0..31],c主 = I[32..63]
BIP39 英文词表(2048 个单词)没有安装在本服务器上,因此本页无法校验助记词的校验和。 它同样无法从熵生成助记词,也无法把助记词还原成熵。它能做的,恰恰是 BIP39 规范里后半段的全部内容:PBKDF2 那一步。 这一步只是把整句话当成一个不透明的 UTF-8 字符串处理,从头到尾都不需要看单词。
后果很严重:一个拼错或记错的单词,依然会产出一个结构完全正确的 512 位种子和一整套看起来
完全有效的钱包 —— 只不过那不是你的钱包。把 abandon 打成 abandom,本页的每个
数字对那句「没人会接受」的短语而言都是对的,而你真正地址上的资金并不能这样找回。恢复钱包时,请务必使用
自带词表、会明确报出校验和错误的软件。
1. BIP39:128–256 位熵是怎么变成单词的
BIP39 助记词是「随机数」的一种人可以抄写的编码方式。编码流程是:
- 从密码学安全的随机源取
ENT位熵,其中ENT ∈ {128, 160, 192, 224, 256}。 - 令
CS = ENT / 32,取SHA-256(熵)的前CS位,这几位就是校验和。 - 拼接:总共
ENT ‖ CS位。 - 把这个比特串按 11 位一组切开。每组是一个
[0, 2047]的整数,也就是 2048 词词表的下标(2¹¹ = 2048,这正是每组 11 位的原因)。 - 按顺序写出单词,用单个空格连接。
有两个设计细节值得欣赏。第一,校验和不是单独一个单词:它被粘在熵的尾部,因此只有持有词表的人才能验证它。
4 位校验和能查出全部单词级错误,按 BIP 的说法也几乎能查出全部两词错误;钱包拒绝你的短语,通常就是在拒绝校验和。
第二,词表被设计成任意两个单词的前四个字母都不同 —— abandon、ability、
able、about……前四个字母就足以区分。这让短语对手写错误更鲁棒,允许钱包接受四字母缩写,
也使得每个单词的后三个字母在消歧上是冗余的。
| 单词数 | 熵 ENT | 校验和 CS = ENT/32 | 总位数 ENT+CS | 最后一个词承载的熵位数 | 最后一个词的可能取值数 |
|---|---|---|---|---|---|
| 12 | 128 | 4 | 132 | 7 | 128 |
| 15 | 160 | 5 | 165 | 6 | 64 |
| 18 | 192 | 6 | 198 | 5 | 32 |
| 21 | 224 | 7 | 231 | 4 | 16 |
| 24 | 256 | 8 | 264 | 3 | 8 |
最后一列解释了为什么 24 个词不是「24 个自由的词」:最后一个词必须承载 8 位校验和,只剩下 3 位真正的选择空间, 所以给定前 23 个词,最后一个词只有 8 个合法候选。因此「校验和失败」是一个很强的信号 —— 而这恰恰是本服务器 无法给出的信号。
2. BIP39 种子:PBKDF2,以及为什么从不直接哈希单词
助记词不是密钥。它是通过 PBKDF2-HMAC-SHA512 被拉伸成种子的,passphrase 在这里扮演盐的角色。 下面每个参数都由规范固定,正因如此,两个钱包在同样的单词和同样的 passphrase 下必然得到相同结果:
| 参数 | 取值 | 为什么重要 |
|---|---|---|
| 口令输入 | 助记词整句,UTF-8、NFKD 规范化、单词间单个空格 | 多一个空格或换个词序,种子就完全不同。 |
| 盐 | "mnemonic" ‖ passphrase(字面前缀 mnemonic,中间无分隔符) | 这就是「第 25 个词」的全部机制。 |
| 伪随机函数 | HMAC-SHA512 | 512 位输出,所以种子整整 512 位。 |
| 迭代次数 | 2048 | 在 2013 年是有意「便宜」的,如今已算不上壁垒,见第 5 节。 |
| 派生长度 | 64 字节(512 位) | 随后被拆成主密钥与链码。 |
BIP39 要求把助记词和 passphrase 都先规范化成 Unicode NFKD 形式,再送进 PBKDF2,这样两个「看起来一样但字节
编码不同」的字符串(例如带音标的 é 写成单码点还是 e + 组合音标)会得到相同的种子。
本服务器没有 intl 扩展,因此 Normalizer 不可用,这一步是被明确记录的
空操作。对纯 ASCII 的英文词表来说,这在数学上无害;但对非 ASCII 的 passphrase 就并非如此,
所以本页在检测到非 ASCII 输入时会给出警告。结果面板会如实说明使用的是哪种规范化状态。
需要明确种子不是什么:它不是私钥,不是 BIP32 密钥,本身也不是钱包备份。它只是下一步的输入。 还要注意依赖方向:助记词决定种子,种子决定其下所有密钥,而没有任何东西能从种子反推出助记词 (HMAC-SHA512 是单向的)。
3. BIP32:主密钥、链码,以及 CKD 派生函数
BIP32 用一次 HMAC-SHA512 建立树根,此后每层一次调用,把 64 字节种子变成一棵密钥树:
k主 = IL = I[0..31] c主 = IR = I[32..63]
链码 c 是 32 字节的额外「准秘密」熵,它跟着树上的每一个密钥一起传递,并被混进
每一次 HMAC。它不是能用来花钱的密钥,但它并不是公开信息:任何同时拿到链码与父公钥的人,都能推导出该父节点下
所有非硬化子公钥。每一步 CKDpriv 都是:
普通(i < 2³¹): I = HMAC-SHA512(c父, serP(K父) ‖ ser32(i))
k子 = (IL + k父) mod n c子 = IR
其中 ser256 是 32 字节大端私钥,serP 是 33 字节压缩公钥,而路径里的撇号
就是 i + 2³¹。子密钥是通过对 n 取模的标量相加得到的,这一步之所以安全,
是因为曲线上的恒等式 (a+b)·G = a·G + b·G。
为什么要有硬化派生
在普通派生里,HMAC 的输入只包含父节点的公钥。因此任何同时掌握链码、父公钥和任意一个子私钥的人,
都能反向算出 IL = k子 − k父,从而恢复
k父 = k子 − IL mod n —— 然后顺带拿到所有兄弟节点与堂表节点。
硬化派生把 0x00 ‖ k父 放进 HMAC,于是推导过程真的必须要有父私钥。这就是它的全部意义,
也是 m/44'/0'/0' 这几层硬化、而 /0/0 不硬化的原因。
扩展密钥:xprv 与 xpub
把密钥连同链码、加上版本字节一起序列化,就得到扩展密钥:xprv…(版本
0x0488ADE4)或 xpub…(版本 0x0488B21E);测试网用
tprv/tpub。xpub 泄漏等于把该子树下所有地址与余额交给攻击者,
而且一旦再泄漏任意一个非硬化子私钥,父私钥也会一起失守。xprv 泄漏更糟:整棵子树的可用密钥
被永久交出。永远不要把 xprv 粘贴到任何地方;请把 xpub 当作半机密信息对待。
| 字段 | 字节数 | 内容 |
|---|---|---|
| 版本 | 4 | 主网 0x0488ADE4(xprv)/0x0488B21E(xpub) |
| 深度 | 1 | 主密钥为 0,其余为层级序号 |
| 父指纹 | 4 | 父公钥 hash160 的前 4 字节;主密钥为 0x00000000 |
| 子序号 | 4 | 索引 i,含硬化位 |
| 链码 | 32 | 该节点的 c |
| 密钥数据 | 33 | xprv 为 0x00 ‖ ser256(k),xpub 为 serP(K) |
| 校验和 | 4 | Base58Check:SHA256d 的前 4 字节,编码前追加 |
4. 派生路径:BIP44、BIP49、BIP84、BIP86
BIP32 路径从左往右读,每一层都有约定含义。单密钥钱包的惯例是
m / purpose' / coin_type' / account' / change / address_index:
| 层级 | 含义 | 常见取值 | 是否硬化 |
|---|---|---|---|
m | 由种子得到的主密钥 | — | — |
| purpose | 该账户使用哪种地址标准 | 44 / 49 / 84 / 86 | 是 |
| coin_type | 哪条链(0 = 比特币,1 = 测试网,60 = 莱特币……) | 0 | 是 |
| account | 独立的「账户」或金库;换账户 = 换一条全新的硬化分支 | 0、1、2…… | 是 |
| change | 0 = 收款地址,1 = 内部找零地址 | 0 或 1 | 否 |
| address_index | 地址在该链中的序号(从 0 开始) | 0、1、2…… | 否 |
| BIP | purpose | 路径 | 地址类型 | 形如 |
|---|---|---|---|---|
| BIP44 | 44' | m/44'/0'/0'/0/0 | P2PKH(传统) | 1… |
| BIP49 | 49' | m/49'/0'/0'/0/0 | P2SH-P2WPKH(嵌套 SegWit) | 3… |
| BIP84 | 84' | m/84'/0'/0'/0/0 | P2WPKH(原生 SegWit) | bc1q… |
| BIP86 | 86' | m/86'/0'/0'/0/0 | P2TR key-path(Taproot) | bc1p… |
最后两层不硬化的意义在于:只读(watch-only)钱包可以只拿一个 xpub,就枚举出全部收款地址,完全不需要接触私钥。 这种便利的代价,正是上面描述的那种泄漏。
5. passphrase:所谓「第 25 个词」
BIP39 的 passphrase 既不属于词表,也不属于助记词 —— 它是 PBKDF2 的盐。对 24 词的助记词,人们叫它 第 25 个词,因为它的行为就像你必须凭记忆额外提供一个单词。由此产生三个推论,而它们每年都在毁掉资金:
- 不同的 passphrase 就是不同的钱包。 同样的 12 个词,passphrase 差一个字符,种子、所有密钥和 所有地址就全都不一样。不会有任何报错,也没有东西可供比对 —— 那个新钱包只是空的而已。
- 忘了它就等于全部丢失。 passphrase 不存放在任何地方;你的词表备份里没有它。找回它意味着 暴力搜索你自己的记忆,而且不存在任何客服渠道。
- 它并不是一个强口令 KDF。 2048 轮 PBKDF2-HMAC-SHA512 只是一道很矮的门槛;短或可猜的 passphrase 可以被离线攻破。
用得好,它确实有真实价值:一张被偷走的纸条会因此变得毫无用处。用得随意,它就是人们把自己锁在币门之外最常见的 原因。
6. 演示助记词的官方测试向量
输入框里的示例短语正是 BIP39 英文的第一条官方测试向量 —— 128 位全零熵的编码结果。官方为它配的 passphrase 是
TREZOR,这也是唯一一个能证明本页 PBKDF2 步骤正确的外部检查点:
| 输入 | 取值 |
|---|---|
| 助记词 | abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about |
| passphrase | TREZOR |
| 官方向量的种子 | c55257c360c07c72029aebc1b53c05ed0362ada38ead3e3e9efa3708e53495531f09a6987599d18264c1e1c92f2cf141630c7a3c4ab7c81b2f001698e7463b04 |
| 本页算出的结果 | 同样的 128 位十六进制 —— 本页上线前已与向量逐一核对 |
把短语和 TREZOR 填进表单,就能现场复现它。请注意这条测试向量与校验和验证无关:PBKDF2 对任何字符串
都会成功,这恰恰就是本页开头所述的那个局限。
7. 实例演算:演示助记词走 m/44'/0'/0'/0/0
在 passphrase 留空的情况下,演示短语会产出下面这些真实的值(上方表单会对它们逐一重算):
| 步骤 | 值 |
|---|---|
| 512 位种子 | 5eb00bbddcf069084889a8ab9155568165f5c453ccb85e70811aaed6f6da5fc19a5ac40b389cd370d086206dec8aa6c43daea6690f20ad3d8d48b2d2ce9e38e4 |
m —— 主私钥 | 1837c1be8e2995ec11cda2b066151be2cfb48adf9e47b151d46adab3a21cdf67 |
m —— 链码 | 7923408dadd3c7b56eed15567707ae5e5dca089de972e07f3b860450e2a3b70e |
| 主密钥的扩展密钥形式 | xprv9s21ZrQH143K3bVKuH7Zze1UdMjVNjJ3yB6in8So97Rf4QA7BC2jWbTnKegMrBVqF5nUbXC4NHUxPUjQRu8pc97VkYwn3UcZWMCoHRtiSnR |
m/44' | cd46049fb82a4fccbd967c5234e61152f4df87d01d1ef833420814c67ee4b7ea |
m/44'/0' | a7661fa497f67a7d5a17f299e76635e16d69aca8b89ac8022cabad47690f47f6 |
m/44'/0'/0' | fe64af825b5b78554c33a28b23085fc082f691b3c712cc1d4e66e133297da87a |
m/44'/0'/0'/0 | 83bda5c7add17ef9bbc1f03391913fe6cc947aa18c4a343607724e815c83eeb7 |
m/44'/0'/0'/0/0 —— 叶子私钥 | e284129cc0922579a535bbf4d1a3b25773090d28c909bc0fed73b5e0222cc372 |
| 叶子 WIF(压缩) | L4p2b9VAf8k5aUahF1JCJUzZkgNEAqLfq8DDdQiyAprQAKSbu8hf |
| 叶子公钥(压缩) | 03aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e |
| hash160 | d986ed01b7a22225a70edbf2ba7cfb63a15cb3aa |
| P2PKH 地址(BIP44) | 1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA |
| P2SH-P2WPKH(BIP49)/P2WPKH(BIP84)/P2TR(BIP86) | 3HkzTaFbEMWeJPLyNCNhPyGfZsVLDwdD3G/bc1qmxrw6qdh5g3ztfcwm0et5l8mvws4eva24kmp8m/bc1plguuppjuw5uk2rpyjnnzvwsuvy5ctswns9fsvhrvn4qt04ns4nmscf9eqf |
最后,用同样的十二个单词、同样的路径,演示 passphrase 存在的全部意义:
| passphrase | 种子(前 16 位 hex) | 叶子私钥 | 叶子地址 |
|---|---|---|---|
| (空) | 5eb00bbddcf06908… | e284129cc0922579… | 1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA |
correct horse battery staple | af1c9b2fb5ae8365… | 03b9ba9ccd649220… | 1KpKVJDi9siSpDoULuCgmEKYTfFU3Neg7a |
TREZOR | c55257c360c07c72… | cdd74cbef2372344… | 1PEha8dk5Me5J1rZWpgqSt5F4BroTBLS5y |
8. 常见错误
- 把真实助记词输入到网站里。 包括本页。一个网页对它可以做任何事。请使用硬件钱包自带的屏幕, 或你自己掌控的离线机器。
- 信任一个不校验校验和的钱包。 如果某个恢复工具默默接受了带拼写错误的短语 —— 就像本页因为 没有词表而不得不如此 —— 你可能最终盯着一个空钱包,然后以为币没了。
- 以为 passphrase 跟着助记词一起备份了。 按设计它没有。请单独记下来,或者干脆不用 —— 但必须是有意选择的结果。
- 把同一个 account 序号复用于不同用途。 account/change/address_index 是一套目录结构; 在不同标准之间复用序号,会把钱包看不见的密钥混在一起。
- 把各层概念混成一团。 BIP39 管单词;BIP32 管密钥树;BIP44/49/84/86 管路径约定; 每种地址标准又各自哈希自己那套公钥序列化。它们里没有任何一个等于「钱包」。
- 以为 2048 轮能保护弱 passphrase。 不能。安全性来自单词本身,passphrase 只是额外加了一层盐。
9. 速查表
| 项目 | 值 |
|---|---|
| 合法单词数 | 12、15、18、21、24 |
| 词表规模 | 2048 词 = 2¹¹ → 每词 11 位 |
| 校验和 | SHA-256(熵) 的前 ENT/32 位 |
| 种子派生 | PBKDF2-HMAC-SHA512,2048 轮,盐为 "mnemonic" ‖ passphrase,输出 64 字节 |
| 主密钥 | HMAC-SHA512("Bitcoin seed", seed) → 密钥 ‖ 链码 |
| 子密钥派生 | 硬化:0x00 ‖ k父 ‖ ser32(i);普通:serP(K父) ‖ ser32(i) |
| 硬化位 | i ≥ 2³¹,在路径里写作撇号 |
| 主网扩展密钥版本 | 0x0488ADE4(xprv)、0x0488B21E(xpub) |
| 默认 BIP44 路径 | m/44'/0'/0'/0/0 |
| 本页是否校验了校验和? | 没有 —— 本服务器上没有安装词表 |