写点什么

ECDSA 安全漏洞深度解析:从非 ce 泄露到密钥恢复实战

作者:qife
  • 2025-08-02
    福建
  • 本文字数:738 字

    阅读完需:约 2 分钟

DSA 基础入门

ECDSA 是基于椭圆曲线群的数字签名算法(DSA)变种。DSA 包含三个核心算法:


  1. 密钥生成:随机选择私钥 x∈ℤq,计算公钥 y=gˣ mod p

  2. 签名生成:对消息 m,选择随机 nonce k,计算:

  3. r = (gᵏ mod p) mod q

  4. s = k⁻¹(H(m)+xr) mod q

  5. 签名验证:检查 r = (gᴴ⁽ᵐ⁾yʳ)ˢ⁻¹ mod p mod q

ECDSA 的特殊性

ECDSA 与 DSA 的核心区别在于使用椭圆曲线群而非乘法群:


  • 公钥 y=gˣ变为椭圆曲线点

  • r 值取椭圆曲线点 gᵏ的 x 坐标

  • 验证时计算椭圆曲线点(gᴴ⁽ᵐ⁾yʳ)ˢ⁻¹的 x 坐标

非 ce 重用导致密钥泄露

若两个签名使用相同 nonce k:


  1. 通过 s₁-s₂ = k⁻¹(H(m₁)-H(m₂))可解出 k

  2. 代入 x = r⁻¹(ks-H(m))即可恢复私钥


# 攻击示例代码k = (s1 - s2)^-1 * (H(m1) - H(m2)) % qx = (s1*k - H(m1)) * pow(r, -1, q) % q
复制代码

非 ce 部分泄露攻击

即使仅泄露少量 nonce 比特,也能通过格攻击恢复密钥:


  • Howgrave-Graham 和 Smart:3 比特泄露即可攻破 160-bit DSA

  • Nguyen 和 Shparlinski:扩展至 ECDSA

  • LadderLeak 攻击:仅需<1 比特泄露


# 格攻击矩阵构造示例matrix = [    [order, 0, 0, 0],    [0, order, 0, 0],    [r1*s1_inv, r2*s2_inv, 2^128/order, 0],    [msg1*s1_inv, msg2*s2_inv, 0, 2^128]]
复制代码

YubiKey 真实漏洞利用

当 nonce 存在 80 比特固定前缀时:


  1. 构造差值矩阵消除未知固定值

  2. 通过 LLL 算法获取 nonce 差值

  3. 代数推导恢复私钥:


x = (rn*s1 - r1*sn)^-1 * (sn*m1 - s1*mn - s1*sn*(k1-kn)) % order
复制代码

防护建议

  1. 首选 EdDSA:内置安全 nonce 生成

  2. 恒定时间实现:防止时序侧信道

  3. RFC 6979:确定性 nonce 生成标准

  4. 盲签名技术:隐藏算术操作


攻击所需签名数量与 nonce 泄露比特数的关系:



本文证明 ECDSA 的安全性极度依赖 nonce 的随机性,任何微小的偏差都可能导致整个签名体系崩溃。更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码

办公AI智能小助手
用户头像

qife

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
ECDSA安全漏洞深度解析:从非ce泄露到密钥恢复实战_密码学_qife_InfoQ写作社区