随机数耗尽(Nonce Exhaustion)
一句话定义: 在密码学场景(如 ECDSA)中重复使用或不当生成随机数,会泄露私钥。
「随机数耗尽」指密码学意义上的灾难:签名随机数被重复、可预测或以其他方式出问题——私钥会作为直接的数学后果泄露。
比特币里存在两种完全互不相干的随机数:
- 挖矿随机数。 区块头里那个 32 位字段,矿工迭代它来找有效哈希。公开、每次尝试理应不同,不泄露任何秘密。
- 签名随机数(
k)。 ECDSA 和 Schnorr 签名中每次签名用的秘密值。签名者把k、私钥和消息哈希组合生成签名。如果同一个私钥对两条不同消息用了同一个k,几行算术就能恢复私钥。
恢复数学(ECDSA 版):给定两条不同消息 m1、m2 上的签名 (r, s1) 和 (r, s2)(相同的 r 即证明随机数被复用),私钥 = (m1 - m2) * (s1 - s2)^-1 mod n。轻而易举。
现实中的著名事故:
- 索尼 PS3 ECDSA 泄密(2010):索尼固件签名代码对每条签名用同一个固定随机数。ECDSA 签名私钥在公开固件签名被披露后数周内即被完整恢复。
- 安卓比特币钱包漏洞(2013):安卓上一个坏的随机数生成器导致部分钱包复用签名随机数。研究者识别出受影响钱包并演示了密钥提取。
- 各类区块链分析论文:识别出了其他通过链上随机数复用泄露密钥的钱包。
修复方案是 RFC 6979 确定性随机数:从私钥和消息本身确定性推导 k(HMAC-SHA256 构造)。同一私钥、同一消息、同一 k;消息不同则 k 必不同。签名时不再依赖随机数生成器。Bitcoin Core 和所有现代比特币库都用 RFC 6979 或其 Schnorr 等价物(BIP 340 的签名方案)。
硬件钱包还在固件层强制随机数唯一性——通常同时用 RFC 6979 推导和一个额外的防重放计数器。
对用户而言这一切不可见:任何实现正确的钱包早已解决随机数问题。对库和钱包作者而言,它仍是少数几种「一旦出错即刻致命、且无声无息直到币消失」的密码学错误之一。
相关词条: 难度调整(Difficulty Retargeting) · 随机数(Nonce) · 工作量证明(PoW)