Private Key Tools

私钥 → P2PKH 非压缩地址

同一把私钥的另一个 1… 地址:这次哈希的是完整的 65 字节公钥 04‖X‖Y。这是 2012 年以前所有钱包使用的格式,今天依然合法、依然可以花费,也是大量老币真正所在的地址。

本页由它推导出 65 字节公钥 04‖X‖Y,再做 hash160。允许 0x 前缀、空格与大写字母,不足 64 位会左补 0。数值必须落在 [1, n−1] 区间内。
还没有输入

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

技术原理详解

本页计算了什么

输入与压缩版页面相同的私钥,但哈希的是 65 字节非压缩公钥 04 ‖ X ‖ Y。地址公式完全一样 —— 变的只是送入哈希的字节:

address = Base58Check( 0x00 ‖ RIPEMD160(SHA256(非压缩公钥)) )
私钥 k→ k · G→ 65 字节 04‖X‖Y→ SHA-256→ RIPEMD-160→ hash160(20 字节)→ 0x00 ‖ hash160 ‖ 校验和→ 1… 地址

这两个地址外形相同、长度相同、版本字节相同,但绝不能互换。币只存在于某一个具体地址上, 只有用当初收款时那一串确切字节的哈希,才能认出它们。

1. 非压缩公钥:04 ‖ X ‖ Y

SEC1 标准定义了点在小曲线上的多种序列化方式。最早的那种把一切都写明白:一个 04 标志,然后 32 字节的 X 坐标,再然后 32 字节的 Y 坐标。没有任何压缩,也不需要重算 —— 验证方从数据里直接读出两个坐标。

形式标志内容长度使用者
非压缩04X(32 字节)‖ Y(32 字节)65 字节 / 130 位 hex中本聪时代的客户端、本页
压缩,Y 为偶02X(32 字节)33 字节 / 66 位 hex2012 年之后的一切
压缩,Y 为奇03X(32 字节)33 字节 / 66 位 hex2012 年之后的一切
x-only(BIP340)—X(32 字节)32 字节 / 64 位 hexTaproot 输出公钥

两种形式描述的是同一条曲线上同一个点。压缩不是什么「另一把密钥」,不是另一条派生路径,更不是数学上 的「兼容模式」—— 它只是一种更短的写法,之所以可能,是因为 Y 可以从 X 加一个奇偶位完整恢复出来(推导见 压缩公钥页面)。

私钥本身没有「压缩标志」

那 32 字节的标量就是一个数字。「压缩」是钱包如何序列化公钥的属性,除了记录在 WIF 字符串里 (5… = 非压缩,K…/L… = 压缩),就只存在于钱包自己的元数据中。 正是这一个事实,造就了下面所有「我的币不见了」的故事。

2. 哈希为什么不同 —— 地址为什么不同

hash160 是它所吃进的那串确切字节的函数,而不是它所代表的点的函数。65 字节输入与 33 字节输入的长度 不同、首字节不同,摘要自然完全不同。两个结果之间没有任何数学关系:它们是两个彼此独立的 160 位值。

步骤压缩(C)非压缩(U)
公钥02ff812e…8c67ee80(33 字节)04ff812e…32b424ae(65 字节)
它的 SHA-256067eb00a0b9864633b020eef374476142daba913c5481ad6a4741cc8ab70261730c812bb6ef97f95538e2423f944d056d0cefc28021113de143e56d2c9d11900
hash160(20 字节)21f57b6debcfc5b67182dfb4af1641f0a81890123f0e966dc089c611a9c1d03bd4f69ea53b0223f9
带版本字节的载荷0021f57b…12003f0e96…f9
校验和(4 字节)cbd7667e3b0b7cbd
P2PKH 地址146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G
对应的 WIFKwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG(K…)5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU(5…)

两行都正确、都能花费、都属于同一个 256 位秘密。链上没有任何标记说明它们相关 —— 这正是它成为互操作陷阱而不是 冷知识的原因。

3. 历史时间线

非压缩不是「坏掉的遗留格式」,它是最初的格式。

时间发生了什么
2009 年 1 月Bitcoin v0.1 发布。密钥按非压缩方式序列化;最早的币大多是 P2PK 输出,里面直接装着完整的 65 字节公钥。
2009 – 2011所有钱包(包括参考客户端)都哈希 65 字节形式。这个时期几乎每一个地址都是非压缩 P2PKH 地址。
2012 年 3 月参考客户端 0.6 系列加入压缩公钥支持:新生成的密钥使用 02/03,WIF 也开始出现 K…/L… 前缀。BIP16(P2SH)也在同一时期于 2012 年 4 月 1 日激活。
2013 – 2014HD 钱包(BIP32/BIP44)成为标准,并为每个派生地址默认使用压缩公钥。非压缩退化为仅供导出的格式。
2017 年 8 月 24 日SegWit 激活。witness 类地址强制要求压缩公钥,分裂从此定型。
今天非压缩 P2PKH 依然合法、依然能被中继,也依然装着真实资产 —— 大多自 2009–2011 年起就未曾动过。

4. 钱包恢复:为什么老地址上的币,新钱包看不到

这正是本页存在的理由。你恢复了助记词,或导入了私钥,钱包却显示余额为零 —— 而区块浏览器明明显示有一笔币 安安静静躺在一个 1… 地址上,你确信那属于你。问题同时出在三处:

  1. 钱包只算一种序列化。 遵循 BIP44/BIP49/BIP84/BIP86 的现代钱包按约定派生压缩 公钥,哈希的是 33 字节形式,得到压缩的 hash160,然后去查 146ZNjH7…。而币在 16kR3eis… 上 —— 那个值钱包根本不会算,自然也不会向网络查询它。
  2. 恢复了种子,不等于恢复了钱包。 种子确定性地产生私钥,但地址约定属于客户端软件, 不属于数学。同一个种子在 2009 年的客户端和 2024 年的客户端上,会得到两组完全不相交的地址。
  3. 决定一切的是 WIF 标志,不是私钥。 当密钥以 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU(前缀 5)导出时,钱包 应当按非压缩处理。如果你把它当成 K…/L… 导入,或把裸 hex 粘进一个默认压缩的 钱包,那么币会从视野中消失 —— 尽管它们一动没动。
真正可行的恢复办法

为你手上的每一把密钥同时推导两个地址,并专门去查那个非压缩的。能做到这一点的工具:提供 「非压缩 / 遗留」导入选项的离线钱包、会扫描两种 hash160 形式的清空(sweep)工具,或者像本页 这样的页面配合离线浏览器核对。在你确认能用老私钥签名之前,不要草率地把老地址上的币「搬到」新地址 —— 控制源地址的仍是同一把私钥,签名本身没问题;真正的风险是你误以为钱没了,然后做出激进操作。

5. 非压缩形式在链上还有效吗

有效。共识规则没有任何一条禁止它,由非压缩公钥建立的 P2PKH 输出今天依然可以花费:

没有任何东西需要「修」

非压缩 P2PKH 地址没有被弃用,也没有坏掉:它是一个普普通通、完全可花费的输出。要让这类输出无法花费, 必须做一次软分叉,而至今无人提出这样的方案,所以无论你什么时候去处理,币都还在那里。真正存在的只有现实层面的 期限 —— 密钥暴露在弱随机与钓鱼风险中的时间越长,攻击者的机会就越多。

永远不要用非压缩公钥构造 SegWit 地址

把 hash160(非压缩公钥) 喂给 P2WPKH 或 P2SH-P2WPKH 编码器,会得到一个语法上完美无缺的地址, 但你可能无法通过正常中继花掉它,因为 witness 里必须携带 65 字节公钥。如果有工具提议把老密钥「升级」到 SegWit,它必须从同一标量推导出的压缩公钥出发 —— 对任何 witness 地址类型来说,非压缩的哈希就是 错误的 20 字节。

6. 经济账:脚本更大,手续费更高

花掉一个非压缩 P2PKH 输出更贵,因为解锁脚本必须多带 32 个字节:完整的 Y 坐标。两个地址在收款方看来毫无 区别,差异只在币移动时才显现。

项目压缩非压缩
scriptSig 里的公钥33 字节 + 1 字节压入前缀 = 34 字节65 字节 + 1 字节压入前缀 = 66 字节
签名压入(典型)1 + 70…72 字节 + 1 字节 sighash ≈ 73 字节同样 ≈ 73 字节
scriptSig 合计≈ 107 字节≈ 139 字节
整个输入(txid + vout + 脚本 + sequence)32 + 4 + 1 + 107 + 4 = 148 字节32 + 4 + 1 + 139 + 4 = 180 字节
每个输入多出的重量—+32 字节 = +32 vB
按 10 sat/vB 多付的手续费—每个输入 +320 sat

按 10 sat/vB 计算,每笔输入大约多付 320 聪;若一次清空 50 个老输入,这就是约 16 000 聪的纯开销,而且手续费 一涨,差距还会拉大。这确实是真金白银的成本,但它也是搬走那些币的唯一方式:这笔费用不是可选项、也无法 规避,因为多出来的字节正是让哈希对得上的东西。

7. 主网与测试网的版本字节

网络P2PKH 版本P2PKH 前缀P2SH 版本WIF 版本Bech32 hrp
主网0x001…0x050x80bc
测试网0x6Fm… / n…0xC40xEFtb

对同一个 hash160,两条链之间唯一不同的就是版本字节:上面那个非压缩 hash160 在主网得到 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G,在测试网得到 mmGNLhorkVyMfskQg8gKEgiRCAXAGnxeBv。版本字节也是主网地址以 1 开头的唯一原因 —— Base58 会把每个前导 0x00 写成字面字符 1。

8. 用演示私钥做的实例演算

步骤取值
私钥 k0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca
非压缩公钥(65 字节)04ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee808f49cde13c7ffd64f1d730bf87a743a578eda4971ddac4a08118160732b424ae
它的 SHA-256(32 字节)30c812bb6ef97f95538e2423f944d056d0cefc28021113de143e56d2c9d11900
hash160(20 字节)3f0e966dc089c611a9c1d03bd4f69ea53b0223f9
载荷 = 00 ‖ hash160(21 字节)003f0e966dc089c611a9c1d03bd4f69ea53b0223f9
校验和(4 字节)3b0b7cbd
P2PKH 地址(非压缩)16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G
同一私钥的压缩地址146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT
对应的 scriptPubKey(25 字节)76a9143f0e966dc089c611a9c1d03bd4f69ea53b0223f988ac

表中每个值都由结果面板实时重算,你可以亲自确认那两个 hash160、进而两个地址,彼此毫无关系。

9. 这一步在推导链上的位置

10. 安全须知

2009–2011 年造的密钥至今仍是活靶子

非压缩地址与早期高价值币高度绑定,而一些早期密钥是用弱随机数生成的(以时钟为种子的可预测随机数发生器, 或者干脆是手写的脑钱包)。一个挂在「富豪榜」上的非压缩地址会吸引大量暴力尝试。如果你掌握这类币,请把它们 转移 —— 但要转得正确:先用 5… WIF 清空非压缩地址,再整合到一个由可靠随机种子导出的 全新现代地址上。

11. 常见错误

12. 速查表

项目取值
公式Base58Check(0x00 ‖ hash160(非压缩公钥))
哈希输入65 字节公钥 04 ‖ X ‖ Y(130 位十六进制)
哈希函数hash160 = RIPEMD160(SHA256(x)),20 字节
版本字节主网 0x00,测试网 0x6F
被编码的载荷25 字节 = 1 + 20 + 4
花费时的 scriptSig约 139 字节(压缩约 107 字节)
对应的 WIF5…(非压缩)
兼容 SegWit 吗不兼容 —— witness 程序按策略只接受压缩公钥
演示地址16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G
还能花吗能 —— 共识与中继策略都接受