Private Key Tools

BIP39 助记词 → BIP32 子私钥

把 12/15/18/21/24 个单词的助记词加上可选的 passphrase,算成 512 位 BIP39 种子,再沿着 BIP32 路径一层层走到叶子私钥 —— 途中每一步都给出链码与压缩公钥,最后落到 WIF 和一个真实可用的地址。

要被钱包接受的短语,单词数必须是 12、15、18、21 或 24。多余空白会被压缩成单个空格。本服务器没有 BIP39 词表,因此无法校验校验和;一个拼写错误会悄悄产出一个「看起来有效但完全不对」的钱包。
留空即得到标准种子。它是 PBKDF2 的盐:"mnemonic" ‖ passphrase。不同的 passphrase 会得到完全不同的钱包,忘了它就等于全部丢失。表单会去掉首尾空白,中间的空格有意义。上方示例为 correct horse battery staple,而计算永远只用你实际输入的内容。
必须以 m 开头。' 或 h 表示硬化派生。常见变体:m/49'/0'/0'/0/0(P2SH-P2WPKH)、m/84'/0'/0'/0/0(P2WPKH)、m/86'/0'/0'/0/0(Taproot)。留空表示使用本默认路径。
还没有输入

请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。

技术原理详解

本页计算了什么

它把一句话的 BIP39 助记词加上可选的 passphrase 变成 512 位种子,然后沿着 BIP32 派生路径一层层走下去, 直到落在一个真实可用的私钥上——这个私钥同时带有 WIF、公钥、hash160 和地址。这里没有任何缓存:本页显示的每一个 数字都是用你输入的文本重新算出来的。

seed = PBKDF2-HMAC-SHA512(口令 = 助记词, 盐 = "mnemonic" ‖ passphrase, 迭代 = 2048, 输出 = 64 字节)
I = HMAC-SHA512(key = "Bitcoin seed", data = seed)  →  k主 = I[0..31],c主 = I[32..63]
助记词 + passphrase→ PBKDF2(2048 轮)→ 512 位种子→ BIP32 主密钥 + 链码→ 逐层 CKDpriv→ 叶子私钥→ WIF / 公钥 / 地址
本服务器没有 BIP39 词表 —— 请看下面这段再决定信不信本页结果

BIP39 英文词表(2048 个单词)没有安装在本服务器上,因此本页无法校验助记词的校验和。 它同样无法从熵生成助记词,也无法把助记词还原成熵。它能做的,恰恰是 BIP39 规范里后半段的全部内容:PBKDF2 那一步。 这一步只是把整句话当成一个不透明的 UTF-8 字符串处理,从头到尾都不需要看单词。

后果很严重:一个拼错或记错的单词,依然会产出一个结构完全正确的 512 位种子和一整套看起来 完全有效的钱包 —— 只不过那不是你的钱包。把 abandon 打成 abandom,本页的每个 数字对那句「没人会接受」的短语而言都是对的,而你真正地址上的资金并不能这样找回。恢复钱包时,请务必使用 自带词表、会明确报出校验和错误的软件。

1. BIP39:128–256 位熵是怎么变成单词的

BIP39 助记词是「随机数」的一种人可以抄写的编码方式。编码流程是:

  1. 从密码学安全的随机源取 ENT 位熵,其中 ENT ∈ {128, 160, 192, 224, 256}。
  2. 令 CS = ENT / 32,取 SHA-256(熵) 的前 CS 位,这几位就是校验和。
  3. 拼接:总共 ENT ‖ CS 位。
  4. 把这个比特串按 11 位一组切开。每组是一个 [0, 2047] 的整数,也就是 2048 词词表的下标(2¹¹ = 2048,这正是每组 11 位的原因)。
  5. 按顺序写出单词,用单个空格连接。
熵(ENT 位)‖ SHA-256(熵)[0 .. ENT/32 − 1]  ⟶  ENT+CS 位  ⟶  (ENT+CS)/11 个单词

有两个设计细节值得欣赏。第一,校验和不是单独一个单词:它被粘在熵的尾部,因此只有持有词表的人才能验证它。 4 位校验和能查出全部单词级错误,按 BIP 的说法也几乎能查出全部两词错误;钱包拒绝你的短语,通常就是在拒绝校验和。 第二,词表被设计成任意两个单词的前四个字母都不同 —— abandon、ability、 able、about……前四个字母就足以区分。这让短语对手写错误更鲁棒,允许钱包接受四字母缩写, 也使得每个单词的后三个字母在消歧上是冗余的。

单词数熵 ENT校验和 CS = ENT/32总位数 ENT+CS最后一个词承载的熵位数最后一个词的可能取值数
1212841327128
151605165664
181926198532
212247231416
24256826438

最后一列解释了为什么 24 个词不是「24 个自由的词」:最后一个词必须承载 8 位校验和,只剩下 3 位真正的选择空间, 所以给定前 23 个词,最后一个词只有 8 个合法候选。因此「校验和失败」是一个很强的信号 —— 而这恰恰是本服务器 无法给出的信号。

2. BIP39 种子:PBKDF2,以及为什么从不直接哈希单词

助记词不是密钥。它是通过 PBKDF2-HMAC-SHA512 被拉伸成种子的,passphrase 在这里扮演盐的角色。 下面每个参数都由规范固定,正因如此,两个钱包在同样的单词和同样的 passphrase 下必然得到相同结果:

参数取值为什么重要
口令输入助记词整句,UTF-8、NFKD 规范化、单词间单个空格多一个空格或换个词序,种子就完全不同。
盐"mnemonic" ‖ passphrase(字面前缀 mnemonic,中间无分隔符)这就是「第 25 个词」的全部机制。
伪随机函数HMAC-SHA512512 位输出,所以种子整整 512 位。
迭代次数2048在 2013 年是有意「便宜」的,如今已算不上壁垒,见第 5 节。
派生长度64 字节(512 位)随后被拆成主密钥与链码。
Unicode 规范化(NFKD)—— 以及它在本机为何是空操作

BIP39 要求把助记词和 passphrase 都先规范化成 Unicode NFKD 形式,再送进 PBKDF2,这样两个「看起来一样但字节 编码不同」的字符串(例如带音标的 é 写成单码点还是 e + 组合音标)会得到相同的种子。 本服务器没有 intl 扩展,因此 Normalizer 不可用,这一步是被明确记录的 空操作。对纯 ASCII 的英文词表来说,这在数学上无害;但对非 ASCII 的 passphrase 就并非如此, 所以本页在检测到非 ASCII 输入时会给出警告。结果面板会如实说明使用的是哪种规范化状态。

需要明确种子不是什么:它不是私钥,不是 BIP32 密钥,本身也不是钱包备份。它只是下一步的输入。 还要注意依赖方向:助记词决定种子,种子决定其下所有密钥,而没有任何东西能从种子反推出助记词 (HMAC-SHA512 是单向的)。

3. BIP32:主密钥、链码,以及 CKD 派生函数

BIP32 用一次 HMAC-SHA512 建立树根,此后每层一次调用,把 64 字节种子变成一棵密钥树:

I = HMAC-SHA512(key = "Bitcoin seed"(12 个 ASCII 字节), data = seed)
k主 = IL = I[0..31]    c主 = IR = I[32..63]

链码 c 是 32 字节的额外「准秘密」熵,它跟着树上的每一个密钥一起传递,并被混进 每一次 HMAC。它不是能用来花钱的密钥,但它并不是公开信息:任何同时拿到链码与父公钥的人,都能推导出该父节点下 所有非硬化子公钥。每一步 CKDpriv 都是:

硬化(i ≥ 2³¹):  I = HMAC-SHA512(c父,  0x00 ‖ ser256(k父) ‖ ser32(i))
普通(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
密钥数据33xprv 为 0x00 ‖ ser256(k),xpub 为 serP(K)
校验和4Base58Check: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……是
change0 = 收款地址,1 = 内部找零地址0 或 1否
address_index地址在该链中的序号(从 0 开始)0、1、2……否
BIPpurpose路径地址类型形如
BIP4444'm/44'/0'/0'/0/0P2PKH(传统)1…
BIP4949'm/49'/0'/0'/0/0P2SH-P2WPKH(嵌套 SegWit)3…
BIP8484'm/84'/0'/0'/0/0P2WPKH(原生 SegWit)bc1q…
BIP8686'm/86'/0'/0'/0/0P2TR key-path(Taproot)bc1p…

最后两层不硬化的意义在于:只读(watch-only)钱包可以只拿一个 xpub,就枚举出全部收款地址,完全不需要接触私钥。 这种便利的代价,正是上面描述的那种泄漏。

5. passphrase:所谓「第 25 个词」

BIP39 的 passphrase 既不属于词表,也不属于助记词 —— 它是 PBKDF2 的盐。对 24 词的助记词,人们叫它 第 25 个词,因为它的行为就像你必须凭记忆额外提供一个单词。由此产生三个推论,而它们每年都在毁掉资金:

用得好,它确实有真实价值:一张被偷走的纸条会因此变得毫无用处。用得随意,它就是人们把自己锁在币门之外最常见的 原因。

6. 演示助记词的官方测试向量

输入框里的示例短语正是 BIP39 英文的第一条官方测试向量 —— 128 位全零熵的编码结果。官方为它配的 passphrase 是 TREZOR,这也是唯一一个能证明本页 PBKDF2 步骤正确的外部检查点:

输入取值
助记词abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about
passphraseTREZOR
官方向量的种子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'/083bda5c7add17ef9bbc1f03391913fe6cc947aa18c4a343607724e815c83eeb7
m/44'/0'/0'/0/0 —— 叶子私钥e284129cc0922579a535bbf4d1a3b25773090d28c909bc0fed73b5e0222cc372
叶子 WIF(压缩)L4p2b9VAf8k5aUahF1JCJUzZkgNEAqLfq8DDdQiyAprQAKSbu8hf
叶子公钥(压缩)03aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e
hash160d986ed01b7a22225a70edbf2ba7cfb63a15cb3aa
P2PKH 地址(BIP44)1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA
P2SH-P2WPKH(BIP49)/P2WPKH(BIP84)/P2TR(BIP86)3HkzTaFbEMWeJPLyNCNhPyGfZsVLDwdD3G/bc1qmxrw6qdh5g3ztfcwm0et5l8mvws4eva24kmp8m/bc1plguuppjuw5uk2rpyjnnzvwsuvy5ctswns9fsvhrvn4qt04ns4nmscf9eqf

最后,用同样的十二个单词、同样的路径,演示 passphrase 存在的全部意义:

passphrase种子(前 16 位 hex)叶子私钥叶子地址
(空)5eb00bbddcf06908…e284129cc0922579…1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA
correct horse battery stapleaf1c9b2fb5ae8365…03b9ba9ccd649220…1KpKVJDi9siSpDoULuCgmEKYTfFU3Neg7a
TREZORc55257c360c07c72…cdd74cbef2372344…1PEha8dk5Me5J1rZWpgqSt5F4BroTBLS5y

8. 常见错误

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
本页是否校验了校验和?没有 —— 本服务器上没有安装词表