Private Key Tools

私钥 → 压缩公钥

在 secp256k1 曲线上把生成元 G 乘以私钥标量 k,再把得到的点序列化成以 02 或 03 开头的 33 字节形式。这一步是「秘密数字」变成「可以公开的东西」的分界线,比特币里所有其它地址类型都建立在它之上。

64 位十六进制 = 32 字节 = 256 位。允许 0x 前缀、空格与大写字母,不足 64 位会自动左补 0。数值必须落在 [1, n−1] 区间内。
还没有输入

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

技术原理详解

本页计算了什么

你给它一个 256 位的数字 —— 私钥 k —— 它算出压缩公钥。 在服务器内部,这就是一次运算:

P = k · G   (secp256k1 点乘)
私钥 k→ k · G→ 点 (X, Y)→ 02/03 ‖ X→ 33 字节公钥

1. 私钥到底是什么

比特币私钥不是文件、不是密码、也不是一坨随机字节。它是一个整数 —— 用椭圆曲线密码学的 术语说,是一个标量 —— 并且必须满足:

1 ≤ k ≤ n − 1   其中 n = 0xFFFF…4141(secp256k1 的阶)

两个边界值被排除在外,这在实践中非常关键:

所以可用私钥总数是 n − 1 ≈ 1.158 × 1077 个。有人算过:就算用每秒一万亿个的 速度去撞,也需要大约 1058 年。

属性取值
长度256 位 / 32 字节 / 64 位十六进制
合法范围1 … n−1
盲猜命中概率约 1 / 2256(约 1.16 × 1077 个可能值)
它必须是什么均匀随机的,或由均匀随机的熵推导而来
它绝不能是什么人为选择的一句话的哈希、计数器、时间戳、书里的句子
「随机」这两个字承担了太多

历史上每一桩与「机器被入侵」无关的大额比特币失窃,根源都是私钥可预测:用时钟做种子的弱随机数 发生器、脑钱包口令、用手机序列号造出来的密钥。这里的数学是破不开的,出问题的永远是它周围的熵源。 请使用 random_bytes(32)(本服务器就是这么做的)或硬件钱包的安全芯片。

2. 曲线:为什么公钥是一个「点」

比特币使用的曲线叫 secp256k1,定义在模素数 p 的整数域上:

y² = x³ + 7  (mod p)

任何满足这个方程的 (x, y) 都是曲线上的一个点。由于方程是模 p 的,这条「曲线」并不是 一条光滑的弧线,而是散布在 256 位宽有限网格上的一堆离散点 —— 但它依然构成一个数学上的群, 正是这一点让密码学得以建立其上。

点可以相加(几何上:过两点作直线,找到第三个交点,再沿 x 轴翻转),因此也可以把一个点 反复与自身相加,实现「整数乘法」。这套群运算就是比特币密钥推导的全部引擎。

常量取值
域素数 p0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
曲线阶 n0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
生成元 Gx0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798
生成元 Gy0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8
余因子 h1(群大小相同,不需要防范小子群攻击)

注意 p 和 n 是两个不同的数,新手常把它们搞混。 p 约束的是坐标的取值范围,n 约束的是私钥的取值范围。

3. P = k·G 到底怎么算

没有闭式捷径。标准做法是倍点-加点(double-and-add),从高位到低位遍历 k 的 256 个比特:

R = 无穷远点
for bit in bits_of(k):        # 256 次循环
    R = double(R)             # R = R + R
    if bit == 1:
        R = add(R, G)         # R = R + G
return R

大约是 256 次倍点和 128 次加点,几百次有限域运算 —— 所以现代笔记本每秒能算几万次,而本项目的 纯 PHP + GMP 实现大约每秒 80 次。

为什么反方向是不可能的

从 k 算到 P 只要 256 步。但从 P 反推 k —— 这就是 椭圆曲线离散对数问题 —— 目前没有任何高效算法:最通用的方法(Pollard rho)需要大约 √n ≈ 2128 次运算量级。正是这种不对称性,让公钥可以被安全地公开。

侧信道

上面的朴素循环会根据私钥比特走不同分支,于是运行时间和功耗都会泄漏信息。生产级实现会使用 常数时间标量乘与随机盲化。本页面是教学工具;真要管钱请用 libsecp256k1 或硬件钱包。

4. 点的序列化:33 字节还是 65 字节

一个点有两个 256 位坐标,所以最直白的编码是 64 字节再加上一个标志位。SEC1 标准定义了几种方式:

形式编码长度首字节
非压缩04 ‖ X ‖ Y65 字节(130 位 hex)04
压缩(Y 为偶)02 ‖ X33 字节(66 位 hex)02
压缩(Y 为奇)03 ‖ X33 字节(66 位 hex)03
混合(历史遗留)06/07 ‖ X ‖ Y65 字节06/07
x-only(BIP340 / Taproot)X32 字节(64 位 hex)无

5. 奇偶性技巧:为什么 32 字节就够了

压缩并不是「有损的取巧」,它是精确无损的 —— 因为 Y 可以从 X 完全恢复出来。 给定 X,曲线方程给出

Y² = X³ + 7 (mod p)

它恰好有两个解:Y 和 p − Y。这两个根奇偶性必然相反:一个为偶数, 另一个为奇数(因为 p 是奇数,p − Y ≡ −Y 会翻转最低位)。所以只要 1 个比特 —— 「Y 是奇数还是偶数?」—— 就足以在两者之间做出选择。这个比特正是 02/03 前缀 所保存的信息。

因此解压缩是一次真刀真枪的计算:把 X 的三次方加 7,再做模平方根(由于 p ≡ 3 (mod 4), 有闭式解 Y = (X³+7)(p+1)/4 mod p),最后若奇偶性与请求不符则取负。

6. 实例演算

下面就是本页对示例私钥 0824c314…171ca 实际算出的值:

步骤值
k0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca
P = k·G 的 Xff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80
P 的 Y8f49cde13c7ffd64f1d730bf87a743a578eda4971ddac4a08118160732b424ae
Y 的奇偶性末位十六进制是 e → 偶数,故前缀为 02(若为奇数则前缀是 03)
压缩公钥02ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80
非压缩公钥04ff812e…8f49cd…b424ae(65 字节)
hash160(压缩)21f57b6debcfc5b67182dfb4af1641f0a8189012
hash160(非压缩)3f0e966dc089c611a9c1d03bd4f69ea53b0223f9
P2PKH 地址(压缩 C)146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT
P2PKH 地址(非压缩 U)16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G

请留意最后两行:同一个私钥,两个完全不同的地址。本页的结果面板会实时重算以上全部值, 你可以自己验证这个结论。

7. 压缩 vs 非压缩 —— 到底有什么区别

两种编码描述的是同一个点,签名上也都能用,但它们导向不同的地址,后果非常实际。

压缩(C)非压缩(U)
公钥长度33 字节65 字节
hash160 的输入02/03‖X04‖X‖Y
得到的 P2PKH 地址146ZNjH7…2UqT16kR3eis…WG2G
WIF 前缀K…/L…(载荷 33 字节 + 01 标志)5…
花费时 scriptSig 大小约 107 字节约 139 字节
引入时间Bitcoin 0.6(2012 年)中本聪最初的客户端
现状所有地方都在用历史遗留,仅为找回旧资金而保留
最经典的丢币方式

私钥本身不知道自己「是不是压缩的」。这个标志位存在 WIF 字符串里,不在私钥里。 如果你把一个压缩 WIF 导入钱包,而币实际上躺在非压缩地址上(或者反过来),钱包就会去看错误的 地址、显示余额为零,然后你就以为钱没了。通常并没有丢 —— 但你需要一个能同时推导两种形式的钱包, 或者像本页这样的工具,才能查清楚币到底在哪个地址上。

8. 压缩公钥接下来会变成什么

压缩公钥→ SHA-256→ RIPEMD-160→ hash160(20 字节)→ Base58Check / Bech32→ 地址

9. 安全须知

10. 常见错误

11. 速查表

项目值
公式secp256k1 上的 P = k · G
输入长度32 字节(接受任意长度,自动左补零)
输出长度压缩 33 字节 / 非压缩 65 字节
压缩前缀02 = Y 为偶,03 = Y 为奇
解压缩公式Y = (X³+7)^((p+1)/4) mod p,再按奇偶性修正
可逆吗不可逆 —— 这是单向函数(ECDLP)
能公开吗可以,公钥本身就是用来公开的