ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ECDSA 椭圆曲线签名:比 RSA 更短却更安全

2026/9/14 0:55:10 拓冰建站 浏览量
ECDSA 椭圆曲线签名:比 RSA 更短却更安全 ECDSA 椭圆曲线签名比 RSA 更短却更安全同样 128 位安全强度RSA 密钥要 3072 位ECDSA 只要 256 位——签名还快一到两个数量级。但它有一条致命红线nonce 一旦重复私钥瞬间泄漏。今天讲透原理与这条红线。一、背景与痛点你每天刷的 HTTPS、签的 Git commit、转的比特币很多都跑在 ECDSA 上。Bitcoin 从 2009 年起就用 secp256k1 上的 ECDSA 签名每一笔交易TLS 1.2 末期大量证书从 RSA 迁移到 ECDSA只因为它又小又快。同样的安全强度下RSA 需要 3072 位密钥、签名 256 字节而 ECDSA 用 256 位曲线、签名只有 64 字节私钥签名还快约两个数量级。对带宽和算力都敏感的移动端、物联网、区块链这个差距是决定性的。但 ECDSA 是把双刃剑它的安全性严重依赖一个叫 nonce临时随机数kkk的中间量。2010 年 Sony PS3 就是因为所有签名复用了同一个kkk攻击者从两条签名就还原出了索尼的私钥整个主机的安全体系崩塌。所以理解 ECDSA一半是理解椭圆曲线另一半是理解kkk绝对不能重复这条红线。二、核心原理1. 从 ECDH 到签名椭圆曲线密码学把 Diffie-Hellman 搬到了椭圆曲线群上。设EEE是Fp\mathbb{F}_pFp​上的曲线、GGG是阶为nnn的基点双方各选私钥a,ba,ba,b、计算公钥AaG, BbGAaG,\;BbGAaG,BbG并交换就能各自算出同一个共享秘密SaBa(bG)abGbAS aB a(bG) abG bASaBa(bG)abGbA外人只知道G,A,BG, A, BG,A,B想凑出SSS就得先求出aaa——这正是 ECDLP椭圆曲线离散对数难题。ECDSA 则用同一套群运算做签名私钥ddd、公钥QdGQdGQdG。2. 签名与验证公式对消息mmm先算散列zH(m)zH(m)zH(m)再选一个临时随机数kkk令(x1,y1)kG(x_1,y_1)kG(x1​,y1​)kG、rx1 mod nrx_1\bmod nrx1​modn则签名为sk−1(zr⋅d) mod n,签名(r,s)s k^{-1}(z r\cdot d)\bmod n, \qquad \text{签名} (r, s)sk−1(zr⋅d)modn,签名(r,s)验证方计算u1zs−1 mod nu_1zs^{-1}\bmod nu1​zs−1modn、u2rs−1 mod nu_2rs^{-1}\bmod nu2​rs−1modn再算(x1,y1)u1Gu2Q(x_1,y_1)u_1Gu_2Q(x1​,y1​)u1​Gu2​Q核对rx1 mod nr x_1\bmod nrx1​modn是否成立。它之所以成立全靠一次巧妙的抵消u1Gu2Qs−1(zrd)Gs−1(sk)GkGu_1G u_2Q s^{-1}(z rd)G s^{-1}(sk)G kGu1​Gu2​Qs−1(zrd)Gs−1(sk)GkG于是验证方算出的x1x_1x1​与签名时的x1x_1x1​完全一致验证通过。3. 致命红线nonce 重用kkk只要重复一次私钥就没了。假设两条不同消息用同一个kkk签名分别是(r,s1),(r,s2)(r,s_1),(r,s_2)(r,s1​),(r,s2​)注意它们的rrr相同s1−s2k−1(z1−z2) mod ns_1 - s_2 k^{-1}(z_1 - z_2)\bmod ns1​−s2​k−1(z1​−z2​)modn于是k(z1−z2)(s1−s2)−1 mod nk(z_1-z_2)(s_1-s_2)^{-1}\bmod nk(z1​−z2​)(s1​−s2​)−1modn再代回即可解出私钥d(s1k−z1)r−1 mod nd(s_1k-z_1)r^{-1}\bmod nd(s1​k−z1​)r−1modn。Sony PS3 就是栽在这里。工程上的标准解法是 RFC 6979不再用随机数发生器选kkk而是从私钥和消息确定性派生kHMAC_DRBG(d ∥ H(m))k \text{HMAC\_DRBG}(d \,\|\, H(m))kHMAC_DRBG(d∥H(m))这样同一消息永远得到同一个kkk既杜绝了重复也免疫了随机源太弱的隐患。4. 为什么 256 位就够ECDSA 的安全性建立在 ECDLP 之上目前求解它最强的通用算法是 Pollard rho需要约O(n)O(\sqrt{n})O(n​)步。256 位曲线的n≈2256n\approx 2^{256}n≈2256n≈2128\sqrt{n}\approx 2^{128}n​≈2128恰好对应 128 位安全强度而 RSA 要达到同样的强度模数得大到 3072 位。这正是 ECDSA 密钥更短、签名更快的根本原因——安全性来自求解起来困难的曲线群而不是更大的数字。签名时用 Montgomery ladder 等常数时间算法求kGkGkG还能顺带挡掉计时侧信道。三、代码实战下面在一条玩具曲线y2x3x32(mod101)y^2 x^3 x 32 \pmod{101}y2x3x32(mod101)基点G(4,10)G(4,10)G(4,10)阶n101n101n101上跑通 ECDSA并复现 nonce 重用攻击importhashlib,random p,a,b,n,G101,1,32,101,(4,10)defpadd(P,Q):ifPisNone:returnQifQisNone:returnP x1,y1P;x2,y2Qifx1x2and(y1y2)%p0:returnNoneifPQ:lam(3*x1*x1a)*pow(2*y1,-1,p)%pelse:lam(y2-y1)*pow((x2-x1)%p,-1,p)%p x3(lam*lam-x1-x2)%preturn(x3,(lam*(x1-x3)-y1)%p)defpmul(k,P):RNonewhilek:ifk1:Rpadd(R,P)Ppadd(P,P);k1returnRdefzhash(m):returnint(hashlib.sha256(m).hexdigest(),16)%nor1defsign(d,k,msg):zzhash(msg);rpmul(k,G)[0]%n spow(k,-1,n)*(zr*d)%nreturn(r,s)defverify(Q,msg,sig):r,ssig wpow(s,-1,n);u1zhash(msg)*w%n;u2r*w%n Ppadd(pmul(u1,G),pmul(u2,Q))returnPisnotNoneandrP[0]%n random.seed(7)drandom.randint(2,n-1);Qpmul(d,G)print(私钥 d ,d,公钥 Q ,Q)sigsign(d,42,btransfer 100 to Bob)print(签名 (r,s) ,sig,验证 ,verify(Q,btransfer 100 to Bob,sig))sig2sign(d,42,btransfer 100 to Eve)# 故意复用 k42print(第二个签名 ,sig2,r 相同?,sig[0]sig2[0])# 攻击者从两条签名恢复私钥z1zhash(btransfer 100 to Bob)z2zhash(btransfer 100 to Eve)k_rec(z1-z2)*pow(sig[1]-sig2[1],-1,n)%n d_rec(sig[1]*k_rec-z1)*pow(sig[0],-1,n)%nprint(恢复 k ,k_rec,恢复私钥 ,d_rec,正确?,d_recd)运行输出私钥 d 43 公钥 Q (56, 41) 签名 (r,s) (86, 1) 验证 True 第二个签名 (86, 45) r 相同? True 恢复 k 42 恢复私钥 43 正确? True签名验证顺利通过而一旦两条签名复用了同一个k42k42k42攻击者只靠这两条签名就在毫秒内反推出了私钥 43——这就是 Sony PS3 漏洞的完整复现。真实场景里nnn是 256 位大数但背后的数学原理一模一样。四、关键经验/避坑nonce 绝不能重复或可预测kkk泄漏等于私钥泄漏生产环境一律用 RFC 6979 确定性 nonce别用random.randint选kkk。拒绝无效曲线点验签前必须确认公钥真的在曲线上否则会遭遇 invalid curve 攻击攻击者用低阶点做 Pohlig-Hellman 反推私钥。实现要常数时间用常数时间的算法实现群运算避免 timing、缓存等侧信道泄漏私钥位。曲线参数别自己造用 NIST P-256、secp256k1、Curve25519 等标准曲线它们已避开 anomalous、低嵌入度等高危情形。ECDSA vs RSA 按场景选要短签名、高吞吐区块链、TLS选 ECDSA只有为兼容老系统才继续用 RSA。更现代的 Ed25519 用 Edwards 形式 确定性 nonce基本解决了 ECDSA 的工程痛点。五、完整系列推荐 本文选自《密码学与零知识证明》100 期系统教程第 034 期ECDH 密钥交换与 ECDSA 签名每期配可运行 Python 代码。完整系列100 期正文 3 篇番外每期文章代码已在 ima 知识号【Kruptos】持续更新 69 技术知识库计算机视觉、强化学习、推荐系统、大模型微调、操作系统、AI Agent……几乎覆盖全部软硬件技术栈 8 款 AI 技能系列生产、知识库管理、CMMI 受管开发、自进化 Agent 等已在 ima 技能广场上架即装即用✅ 全部免费订阅后续更新自动推送 订阅方式打开 ima腾讯智能工作台→ 搜索「Kruptos」→ 一键订阅或在 ima 内直接搜索《密码学与零知识证明》。作者Kruptos西电毕业13 年无线通信/DSP/嵌入式科研现深耕 AI 与云原生原创内容转载注明出处。