本研究论文对比特币协议数字签名实现中的关键漏洞进行了全面的密码分析研究,即 幽灵签名攻击 (CVE-2025-29774)以及根本性的 SIGHASH_SINGLE 处理错误。研究表明,交易签名机制中对密码学原语的不正确处理,为加密货币钱包所有者在不知情的情况下完全泄露其私钥创造了条件。该攻击利用了原始中本聪客户端中的一个遗留缺陷:当交易输入和输出数量不匹配时,系统不会拒绝签名,而是返回一个通用哈希值 “1”(uint256)。
研究的实践部分涉及使用 KeyFuzzMaster 密码学工具 ,用于系统性地识别签名验证代码、椭圆曲线运算和交易哈希函数中的漏洞。文中给出了通过 secp256k1 曲线上 ECDSA 算法中 nonce(k 参数)重用恢复私钥的数学公式。讨论了 ECDSA(椭圆曲线数字签名算法) 算法 在 secp256k1 椭圆曲线上的密码学原语。比特币中的数字签名承担三重功能:授权支出、不可否认性和保证交易完整性。
然而,为保持向后兼容性而维持的 遗留架构解决方案,导致出现了隐蔽且可能造成灾难性后果的密码学漏洞。其中, SIGHASH_SINGLE 漏洞 尤为突出 ——这是签名哈希生成机制中的一个根本性缺陷,源自原始 Bitcoin Core 实现,并被整合进网络共识。
| CVE 标识符 | 组件 | CVSS 分数 | 严重性 |
|---|---|---|---|
| CVE-2025-29774 | xml-crypto / SIGHASH_SINGLE | 9.3 | 严重 |
| CVE-2025-29775 | xml-crypto DigestValue 绕过 | 9.3 | 严重 |
| CVE-2025-48102 | GoUrl 比特币支付网关(存储型 XSS) | 5.9 | 中等 |
| CVE-2025-26541 | CodeSolz WooCommerce 网关(反射型 XSS) | 6.1 | 中等 |
比特币 使用由 SECG(高效密码学标准组织)标准定义的 secp256k1 椭圆曲线。该曲线由有限域上的魏尔斯特拉斯方程定义:
曲线方程:
y² ≡ x³ + ax + b (mod p)
对于 secp256k1:
y² ≡ x³ + 7 (mod p),其中 a = 0,b = 7
secp256k1 曲线的参数由元组 T = (p, a, b, G, n, h) 决定:
secp256k1 参数:
p = 2²⁵⁶ − 2³² − 977 (定义有限域的素数)
n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
(曲线点群的阶,即生成元 G 的整数阶)
G = (Gₓ, Gᵧ) — 固定基点(生成元)
ECDSA 算法 使用私钥 d 对消息 M 生成签名。签名过程涉及以下数学运算:
步骤 1:生成随机 nonce k
选择一个加密强度高的随机数 k ∈ [1, n-1]
步骤 2:计算点 R
R = k × G(生成元点的标量乘法)
步骤 3:计算参数 r
r = Rₓ mod n(点 R 的 x 坐标对 n 取模)
步骤 4:计算参数 s
s = k⁻¹ × (H(M) + r × d) mod n
结果:签名 (r, s)
其中 H(M) 是消息 M 的哈希(在比特币中使用双重 SHA-256),d 是所有者私钥。
公钥与私钥之间的关系由以下关系确定:
Q A = d A × G
其中 是公钥(曲线上的点), 是私钥 (256 位整数) , 是曲线生成元。QAdAG
比特币 协议 提供了若干 SIGHASH 类型 (签名哈希类型),用于确定交易的哪些组成部分被包含在签名哈希中:
| SIGHASH 类型 | 含义(十六进制) | 描述 |
|---|---|---|
| SIGHASH_ALL | 0x01 | 对交易的所有输入和输出进行签名。 |
| SIGHASH_NONE | 0x02 | 所有输入均已签名,输出未签名。 |
| SIGHASH_SINGLE | 0x03 | 仅对与输入具有相同索引的输出进行签名。 |
| SIGHASH_ANYONECANPAY | 0x80 | 修饰符:仅对当前输入进行签名 |