十六进制私钥 → 全部格式、地址与 WIF
总计算器:粘贴一个 64 位十六进制私钥,一次得到这个数字的全部表示形式(十进制、256 位二进制、Base64、ASCII)、两种 WIF、两种公钥序列化、secp256k1 上的点、两个 hash160 值、主网全部五类地址,以及对应的测试网地址。
请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。
本页计算了什么
这是整套工具的总计算器。你给它一个 256 位整数 —— 私钥 k
—— 它就给出这个整数的全部标准表示形式、两种 WIF 字符串、两种公钥序列化、背后的椭圆曲线点、两个
hash160 承诺值,以及十个地址(主网 5 个、测试网 5 个)。
本页一切都只是 k 的纯函数。没有种子、没有口令、没有服务器状态、没有任何网络请求。
两个人输入同样的 64 位十六进制数,在任何计算机上、任何时候得到的都是逐字节相同的结果。
1. 私钥:一个数字,多种写法
私钥不是文件、不是字符串、也不是一团随机字节。它是一个整数(标量),区分两把私钥的唯一 依据就是它的数值大小。你怎么把这个数字写下来,属于表示形式问题,而不是「不同的私钥」:
| 表示形式 | 演示私钥长什么样 | 它为什么存在 |
|---|---|---|
| 十六进制(64 位) | 0824c314…07a171ca |
一字节两位,字节边界一眼可见。链上分析、区块浏览器、bitcoin-cli 显示的都是它。 |
| 十进制(76 位) | 3683455675284633286911943861444039993120875154046227415438637967083965608394 |
人类说「一个数字」时指的就是它。适合做算术和范围检查,但完全看不出字节结构。 |
| 二进制(256 位) | 00001000 00100100 11000011 … |
一个字符对应一个比特。只有用它,「到底哪一位决定了哪个地址」才能靠眼睛回答。 |
| Base64(44 字符) | CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco= |
同样 32 字节原始数据的紧凑文本形式。某些钱包把二进制私钥当文本导出时用它;它不是 WIF。 |
| WIF(51 或 52 字符) | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG |
0x80 ‖ k ‖ [0x01] 的 Base58Check。真正往钱包里粘贴的格式,额外带网络字节与压缩标志,纯 hex 私钥没有这些。 |
| ASCII 视图 | \x08$\xc3\x14w+,(Y\xc8\x89… |
把这 32 字节强行当文本文件读出来会看到什么。几乎全是不可打印字符 —— 这正是私钥从不以「文本」形式保存的原因。 |
由于上面这些指的都是同一个数字,hex 与十进制之间的转换是无损、可逆的。而 Base64 和 WIF 混入了第二种 成分(原始字节,或者字节加版本号加校验和),所以它们不是「另一种进制」—— 详见第 4 节。
2. 为什么正好是 256 位,以及为什么 k 不能是 0 或 n
secp256k1 定义在 256 位素域上,由 G 生成的群是阶为 n 的循环群。于是出现三条
硬边界:
k = 0意味着0 · G,即无穷远点。它没有 x、y 坐标,无法序列化成 公钥,所有校验器都会拒绝。k ≥ n会绕回来:n · G = ∞,所以(n+1) · G = G。一个等于n + 1的 32 字节数值看起来毫无异常,行为上却等同于私钥1。- 32 字节能装下的最大数
2256 − 1不是合法私钥:它比n大。
| 边界 | 十六进制 | 十进制 |
|---|---|---|
| 最小合法私钥 | 0000…0001 | 1 |
| 最大合法私钥(n−1) | fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140 | 115792089237316195423570985008687907852837564279074904382605163141518161494336 |
| 曲线阶 n(非法) | fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141 | 115792089237316195423570985008687907852837564279074904382605163141518161494337 |
| 2256 − 1(非法,> n) | ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff | 115792089237316195423570985008687907853269984665640564039457584007913129639935 |
最后两行之间的差额是 432420386565659656852420866394968145598,一个 39 位数。落在这个
区间里的私钥不会表现出任何异常,所以人们往往要等到某个校验器抛错才意识到问题。
因为 n − 1 ≡ −1 (mod n),私钥 1 与 n − 1 分别对应点
G 与 −G。这两点共享同一个 x 坐标,所以它们的 Taproot 地址
完全相同(bc1pmfr3p9j00pfxjh0zmgp99y8zftmd3s5pmedqhyptwy6lm87hf5sspknck9),
而 P2PKH 地址却截然不同(1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH 对
1GrLCmVQXoyJXaPJQdqssNqwxvha1eUo2E),因为 P2PKH 会把 y 的奇偶前缀一起哈希进去。
这一对私钥把「一个私钥、多个地址」演示得淋漓尽致。
3. 从数字到点:公钥
把生成元 G 乘以 k,得到曲线 y² = x³ + 7 (mod p) 上的点
P = (X, Y),这就是公钥。它有两个坐标,因此有多种序列化方式,而选哪一种会改变之后所有的
地址。
| 形式 | 排布 | 长度 | 演示值 |
|---|---|---|---|
| 非压缩 | 04 ‖ X ‖ Y | 65 字节(130 位 hex) | 04ff812e26…32b424ae |
| 压缩,Y 为偶 | 02 ‖ X | 33 字节(66 位 hex) | 02ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80 |
| 压缩,Y 为奇 | 03 ‖ X | 33 字节(66 位 hex) | 本私钥不适用 —— 它的 Y 是偶数 |
| x-only(BIP340) | X | 32 字节(64 位 hex) | ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80 |
压缩是无损的,因为 Y 可以从 X 完整恢复:方程 Y² = X³ + 7 恰好
有两个解 Y 与 p − Y,而它们的奇偶性必然相反。于是只需 1 个比特回答「取哪一个」,
这个比特就是 02/03 前缀。恢复过程有闭式解(因为
p ≡ 3 (mod 4)):Y = (X³ + 7)(p+1)/4 mod p,若奇偶性不符再取负。
4. WIF:带网络标识与校验和的同一个私钥
WIF 意为 Wallet Import Format(钱包导入格式),本质是对一小段载荷做 Base58Check:
压缩: 0x80 ‖ k(32 字节) ‖ 0x01 → 34 字节载荷 → 52 个字符
非压缩:0x80 ‖ k(32 字节) → 33 字节载荷 → 51 个字符
校验和 = SHA256(SHA256(载荷)) 的前 4 字节,编码前追加在末尾
| 属性 | 压缩 WIF | 非压缩 WIF |
|---|---|---|
| 演示值 | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG | 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU |
| 载荷(hex) | 800824c314…07a171ca01 | 800824c314…07a171ca |
| 载荷长度 | 34 字节 | 33 字节 |
| 校验和(hex) | 3a0a0417 | b6f3d7f5 |
| 首字符 | K 或 L | 5 |
| 它隐含哪个地址 | 压缩那一组 | 非压缩那一组 |
私钥本身不知道自己「是否压缩」。是结尾那个 01 决定了钱包要哈希哪一种
公钥编码,从而决定它去看哪一个地址。把压缩 WIF 导入钱包,而币其实躺在非压缩 P2PKH 地址上(对演示私钥
来说是 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G),钱包会若无其事地显示余额为零。币并没有丢,
只是钱包哈希的是另外 33 个字节。像本页这样能同时列出五个地址的工具,就是用来把它们找回来的。
5. hash160:20 字节的承诺值
对演示私钥,把中间值也列出来,绝无隐藏:
| 输入 | SHA-256(32 字节) | RIPEMD-160 = hash160(20 字节) |
|---|---|---|
压缩公钥 02ff812e…ee80 |
067eb00a0b9864633b020eef374476142daba913c5481ad6a4741cc8ab702617 |
21f57b6debcfc5b67182dfb4af1641f0a8189012 |
非压缩公钥 04ff812e…24ae |
30c812bb6ef97f95538e2423f944d056d0cefc28021113de143e56d2c9d11900 |
3f0e966dc089c611a9c1d03bd4f69ea53b0223f9 |
把公钥先哈希再放进地址,通常有两个理由。第一,缩短地址:20 字节代替 33 或 65 字节。第二,在链上给 公钥前面加一层哈希,于是从未花费过的地址可以一直隐藏自己的公钥 —— 这一点很重要,因为公钥正是 运行 Shor 算法的量子计算机可以直接攻击的对象。代价是 160 位承诺值的抗碰撞强度(约 280) 远低于曲线的 256 位安全强度,但仅靠碰撞并不能让攻击者花掉你的币。
6. 一个私钥,五个地址
五种主网地址类型都由同一个私钥算出。它们不是同一个值的五种编码:它们承诺的是不同的字节, 并且由不同的脚本决定能否花掉。
| 徽标 | 类型 | scriptPubKey(花费条件) | 大小 | 编码 | 演示地址 |
|---|---|---|---|---|---|
| C | P2PKH 压缩 | OP_DUP OP_HASH160 <h160(pub_c)> OP_EQUALVERIFY OP_CHECKSIG |
25 B | Base58Check,版本 0x00 |
146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT |
| U | P2PKH 非压缩 | 同一个脚本,但承诺的是 h160(pub_u) |
25 B | Base58Check,版本 0x00 |
16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G |
| S | P2SH-P2WPKH(嵌套 SegWit) | OP_HASH160 <h160(0x0014‖h160(pub_c))> OP_EQUAL |
23 B | Base58Check,版本 0x05 |
3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw |
| W | P2WPKH(原生 SegWit) | OP_0 <20 字节 witness 程序 = h160(pub_c)> |
22 B | Bech32,witness v0,hrp bc |
bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6 |
| T | P2TR(Taproot,key path) | OP_1 <32 字节 x-only 输出公钥> |
34 B | Bech32m,witness v1,hrp bc |
bc1pmsrhxnvmj8tjxxu9wj69ntvwvhvr28qufyc26tshz3rjj777tx3sh54u63 |
- C 与 U 是同一种脚本类型,只是承诺值不同。历史上两者都是标准形式;SegWit 之后 witness 程序只接受压缩公钥,如今几乎所有钱包都推导 C。U 之所以还存在,是因为 2009–2012 年间确实 有币被支付到它上面,而你至今仍必须能花掉那些币。
- S 是一层包装。那 22 字节脚本
0x0014 ‖ h160是 redeemScript,P2SH 地址 承诺的是它的哈希。它存在的意义是让只认识3…地址的钱包也能支付进 SegWit。花费时会 暴露 redeemScript,之后的行为与 W 相同。 - W 是现代单密钥钱包的默认选择:地址本身就是 witness 程序,scriptPubKey 最短,前四种 里手续费最低。
- T 是完全不同的构造。x-only 内部公钥先用
TapTweak调整;对演示私钥, tweak 是bae9168523281e7f9e91d897a8d23f7ae6fe66d61854019dcb8abb5185e8fa4d,输出公钥是dc07734d9b91d7231b8574b459ad8e65d8351c1c4930ad2e171447297bde59a3。Taproot 不会把公钥哈希成 20 字节值,这也是为什么纯 hash160 工具无法生成这类地址。
7. 校验和:防止手滑的最后一道防线
| 家族 | 校验和 | 演示证据 |
|---|---|---|
Base58Check(1…、3…、5…、K…) |
编码前追加 4 字节,取 SHA256(SHA256(载荷)) 的前 4 字节 |
P2PKH 地址载荷 0021f57b6d…a8189012 的校验和为 cbd7667e;P2SH 地址为 acbfef44 |
Bech32 / Bech32m(bc1q…、bc1p…) |
6 个数据字符,由 hrp 扩展加数据做的 BCH 式 polymod 产生;witness v0 用 bech32 常量,v1+ 用 bech32m | bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6 解出 32 个数据字 y86hkm0telzmvuvzm76279jp7z5p3yqj;Taproot 那个解出 52 个数据字,以 …777tx3s 结尾 |
Base58Check 只能检错而不能纠错:它能告诉你打错了,但猜不出你本来想打什么。Bech32 还额外禁止大小写混用、限制总长 90 字符 —— 这两条纯粹是为了让抄写错误更容易被发现。
8. 测试网:同一个私钥,不同的前缀
测试网(以及 regtest/signet 用的地址格式)只是版本字节不同,密码学上毫无区别。演示私钥在测试网上:
| 项目 | 主网 | 测试网 |
|---|---|---|
| P2PKH 版本字节 | 0x00(地址以 1 开头) | 0x6f(以 m 或 n 开头) |
| P2SH 版本字节 | 0x05(以 3 开头) | 0xc4(以 2 开头) |
| WIF 版本字节 | 0x80(以 5/K/L 开头) | 0xef(以 9/c 开头) |
| Bech32 可读部分 | bc | tb |
| P2PKH(压缩) | 146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT | micWfnN6LUy38jVRPD2Mw7YMa873zjixGw |
| P2PKH(非压缩) | 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G | mmGNLhorkVyMfskQg8gKEgiRCAXAGnxeBv |
| P2SH-P2WPKH | 3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw | 2N57fAqFzwS7SCYdU23JFkrkx6QdZKurmpU |
| P2WPKH | bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6 | tb1qy86hkm0telzmvuvzm76279jp7z5p3yqjemzsdf |
| P2TR | bc1pmsrhxnvmj8tjxxu9wj69ntvwvhvr28qufyc26tshz3rjj777tx3sh54u63 | tb1pmsrhxnvmj8tjxxu9wj69ntvwvhvr28qufyc26tshz3rjj777tx3squrnq7 |
| WIF(压缩) | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG | cMrXo27C3vhsunWQmL5sEDAPKhMiz5WinDHywShwrUkrr1RkCJ4i |
| WIF(非压缩) | 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU | 91eWBRijNxfiSZ4VVd3Tnb2Dm7RdhaCGMfakiLRELNF1saLqhym |
注意 146ZNjH7… 和 micWfnN6… 承诺的是同一个 20 字节 hash160,只有版本字节
不同。把测试网币发到主网地址会得到一个「看起来很正常」的错误网络地址,不手工重新编码脚本就取不回来。
请把前缀当作付款指令的一部分,而不是装饰。
9. 完整实例演算
下表中每一个值都是本页用示例私钥
0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca 实际算出来的。点「填入
示例」后,你看到的应该就是这些字符串。
| 步骤 | 值 |
|---|---|
| k(hex,32 字节) | 0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca |
| k(十进制) | 3683455675284633286911943861444039993120875154046227415438637967083965608394 |
| k(二进制前两字节) | 00001000 00100100 —— 4 个前导零比特,256 位中共有 116 个 1 |
| k(Base64) | CCTDFHcrLChZyIlHE5Cja/ZuU6HKFkL5bw8skwehcco= |
| P = k·G 的 X | ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80 |
| P = k·G 的 Y | 8f49cde13c7ffd64f1d730bf87a743a578eda4971ddac4a08118160732b424ae |
| Y 的奇偶性 | 末位 hex 是 e → 偶数 → 压缩前缀 02 |
| 压缩公钥 | 02ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80 |
| 非压缩公钥 | 04ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee808f49cde13c7ffd64f1d730bf87a743a578eda4971ddac4a08118160732b424ae |
| hash160(压缩) | 21f57b6debcfc5b67182dfb4af1641f0a8189012 |
| hash160(非压缩) | 3f0e966dc089c611a9c1d03bd4f69ea53b0223f9 |
| P2SH 脚本哈希 | 823333d5fd23a83661e8e47629552c4a5bfc8b6e = hash160(0014‖21f57b6d…) |
| 压缩 WIF | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG |
| 非压缩 WIF | 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU |
| 地址 C | 146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT |
| 地址 U | 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G |
| 地址 S | 3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw |
| 地址 W | bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6 |
| 地址 T | bc1pmsrhxnvmj8tjxxu9wj69ntvwvhvr28qufyc26tshz3rjj777tx3sh54u63 |
10. 推导链上的下一步
- 十进制私钥 —— 同一个私钥写成 76 位十进制数。
- 二进制私钥 —— 同一个私钥写成 256 个比特,并标出位号。
- Base64 私钥 —— 针对那些把原始字节当文本导出的钱包。
- WIF → 私钥 —— 反方向,包含校验和验证。
- 私钥 → 压缩公钥 —— 把 P = k·G 这一步单独讲透。
- hash160 → 地址 与 Bech32 解码 —— 哈希之后发生的事。
11. 安全须知
尽管本页所有计算都在服务端完成、不写日志、没有对外网络请求,但这个私钥仍然以 URL 参数的形式经过了 HTTP、经过了 Web 服务器的访问日志、也经过了本服务器的内存。绝不要用这类工具(包括本页)处理保护真实 资金的私钥 —— 除非你在自己掌控的离线机器上操作,并且事后彻底删除该私钥。真实私钥的正确工作流是硬件 钱包或气隙签名设备;而这类页面的正确用途,是用一次性测试私钥来学习和验证格式。
- 靠熵,不靠小聪明。私钥必须来自密码学安全随机源、硬件随机数发生器或 BIP39 助记词。 人为挑的口令、时间戳、计数器,以及「看起来随机」的图案,全部是可枚举的。
- 地址复用是隐私泄漏。从某个地址花费会公开它的公钥,并把该私钥之后所有付款都关联到 你的身份上。现代钱包会为每一笔收款派生新地址(BIP32/44/84/86)。
- 核对地址要看原文,不要看截图。替换剪贴板内容的恶意软件就是在地址层面下手的,这是 当今自托管资产被盗最常见的路径。
- 测试网私钥不可公开。主网私钥的「测试网版本」是同一个标量,变的只是前缀。
12. 常见错误
- 以为只有一个地址。一个私钥产生 5 个主网地址和 5 个测试网地址;钱包只显示它被设计 用来显示的那一类。
- 该填 hex 的地方粘了 WIF。
K…/5…字符串是 Base58Check 编码,不是 hex,必须先解码(见 WIF → 私钥)。 - 丢掉前导零。把
0824c314…写成824c314…会让每个字节错位 半个字节。本页会自动左补零,反而掩盖了这个错误 —— 请务必逐位比对 64 位字符串。 - 以为校验和通过就说明地址是你的。校验和只说明这串字符没被写坏。
1BgGZ9tcN4rm9KBzDn7KprQz87SZ26SAMH是完全合法的地址,它的私钥就是1, 而且早就被扫走了。 - 把公钥当成地址。地址承诺的是(编码后)公钥的哈希,或由它派生出的脚本/witness 程序。 转换是单向的。
- 把域素数 p 和曲线阶 n 搞混。坐标对
p = FFFF…FC2F取模,私钥则落在[1, n−1],其中n = FFFF…4141。
13. 速查表
| 项目 | 取值 / 规则 |
|---|---|
| 输入 | 十六进制私钥,期望 64 位;接受 0x 前缀、空格,大小写均可 |
| 合法范围 | 1 … n−1,n = 0xFFFF…4141 |
| 私钥长度 | 256 位 = 32 字节 = 64 位十六进制 |
| 公钥长度 | 压缩 33 字节、非压缩 65 字节、x-only 32 字节 |
| 一个私钥的地址数量 | 主网 5 个 + 测试网 5 个 |
| 地址编码 | Base58Check(C、U、S)与 Bech32/Bech32m(W、T) |
| 可逆吗 | 表示形式之间可逆;地址反推私钥不可行(ECDLP + 哈希) |
| 可以公开吗 | 地址与公钥可以;WIF、hex、十进制、二进制、Base64 一律不可以 |