写点什么

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

作者:qife
  • 2025-07-26
    福建
  • 本文字数:748 字

    阅读完需:约 2 分钟

DSA 基础

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


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

  2. 签名生成:选择随机数 k(nonce),计算 r = (gᵏ mod p) mod q,s = k⁻¹(H(m) + xr) mod q

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

ECDSA 的致命弱点

非 ce 重用攻击

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


k = (s₁ - s₂)⁻¹(H(m₁) - H(m₂))x = r⁻¹(ks - H(m))
复制代码

部分比特泄露攻击

  • 仅泄露 3 个 nonce 比特即可破解 160 位 DSA

  • LadderLeak 攻击表明:泄露<1 比特即可恢复密钥

  • 随机数生成器仅 4 比特偏差也能导致 256 位 ECDSA 被攻破

实战格攻击(100 行 Python)

import ecdsa, olll
# 生成含偏差nonce的签名gen = ecdsa.NIST256p.generatororder = gen.order()priv_key = ecdsa.ecdsa.Private_key(pub_key, secret)nonces = [random.getrandbits(128) + (fixed_bits << 128) for _ in range(6)]sigs = [priv_key.sign(msgs[i], nonces[i]) for i in range(6)]
# 构建格矩阵matrix = [ [order, 0, 0, 0], [0, order, 0, 0], [r1*s1_inv, r2*s2_inv, 2^128/order, 0], [m1*s1_inv, m2*s2_inv, 0, 2^128]]
# LLL格基约简new_matrix = olll.reduction(matrix, 0.75)
# 从格向量恢复私钥for row in new_matrix: potential_key = (rns1 - r1sn)⁻¹ * (snm1 - s1mn - s1sn*k_diff) if verify(potential_key): print("密钥恢复成功!")
复制代码

防护措施

  1. 首选 EdDSA:内置确定性 nonce 生成

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

  3. 恒定时间实现:防止侧信道泄露

  4. 随机数增强:避免偏差产生


本文演示的攻击在以下场景有效:

  • Nonce 重用(100%成功率)

  • 80 比特固定 nonce(需 5 个签名)

  • 仅 4 比特偏差(需约 4000 个签名)更多精彩内容 请关注我的个人公众号 公众号(办公 AI 智能小助手)公众号二维码

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

qife

关注

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

还未添加个人简介

评论

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