Lec 6 数字签名:RSA
MIT 6.1600 · Introduction to Computer Security
TL;DR
- RSA 的陷门置换来自模数分解困难,但“教科书式”直接对消息做幂运算具有乘法可塑性,不能作为安全签名。
- RSA-FDH 和 RSA-PSS 通过哈希与随机化把消息编码到合适域;实践中应使用经过标准化的 PSS,而非自行设计填充。
- ECDSA 与 Schnorr 以离散对数为基础并显著缩短密钥;每次签名的 nonce 必须唯一且不可预测,否则私钥可被恢复。
1. RSA 数学基础
1.1 欧拉函数
给定 n=p⋅q(p,q 为大素数):
ϕ(n)=(p−1)(q−1)
欧拉定理:若 gcd(a,n)=1,则:
aϕ(n)≡1(modn)
1.2 RSA 密钥生成
p,q$大素数,n=pq
e:gcd(e,ϕ(n))=1(通常 e=65537)
d≡e−1(modϕ(n))
公钥:(n,e);私钥:(n,d)(或等价地 (p,q,d))
1.3 RSA 核心性质
∀m∈Zn∗:(me)d≡med≡m(modn)
因为 ed≡1(modϕ(n)),所以 med=mkϕ(n)+1=(mϕ(n))k⋅m≡m(modn)。
2. 朴素 RSA 签名(不安全!)
2.1 基本思路
Sign(sk,m):σ=mdmodn
Verify(vk,m,σ):σe≡?m(modn)
2.2 朴素 RSA 的攻击
存在性伪造:
- 攻击者选 σ∗,计算 m∗=(σ∗)emodn
- 得到合法的 (m∗,σ∗) 对,无需知道 sk!
乘法可延展:
Sign(sk,m1)⋅Sign(sk,m2)=m1d⋅m2d=(m1m2)d=Sign(sk,m1m2)modn
因此可组合已知签名伪造新签名。
3. RSA-FDH(Full Domain Hash)
3.1 方案
引入哈希函数 H:{0,1}∗→Zn∗:
Sign(sk,m):σ=H(m)dmodn
Verify(vk,m,σ):σe≡?H(m)(modn)
3.2 安全性
- 哈希先消除消息的结构,伪造需要对 H(m∗) 开 d 次方
- 在随机预言模型(Random Oracle Model, ROM)下,RSA-FDH 的 EUF-CMA 安全性可规约到 RSA 问题的难度
RSA 问题(RSA Assumption):给定 (n,e,y),难以找 x 使 xe≡y(modn)。
4. RSA-PSS(实际标准)
RSA-PSS(Probabilistic Signature Scheme)是 PKCS#1 v2 标准,在随机预言模型下可证明安全:
签名
- 选随机盐 r \xleftarrow{\} {0,1}^\lambda$
- 计算 w=H(m∥r)
- 从 w,r 生成填充串(通过 MGF——Mask Generation Function)
- σ=(填充串)dmodn
验证
- 计算 σemodn,解析出 w′,r′
- 验证 w′=?H(m∥r′)
5. 椭圆曲线数字签名(ECDSA)
5.1 椭圆曲线 DLP
定义在素域 Fp 上的曲线 E:y2=x3+ax+b,取 n 阶生成元 G。
ECDLP:给定 Q=xG∈E(x∈Zn),求 x。
目前最好算法时间 ≈2n/2(n=256 时 ≈2128),比 RSA 效率更高。
5.2 密钥生成
sk=d$Zn∗,vk=Q=dG∈E
5.3 ECDSA 签名
k$Zn∗,R=kG,r=Rxmodn
s=k−1(H(m)+dr)modn
σ=(r,s)
5.4 ECDSA 验证
u1=s−1H(m)modn,u2=s−1rmodn
R′=u1G+u2Q
接受当且仅当 Rx′≡r(modn)
5.5 Nonce 重用漏洞
若同一 k 被用于签名两条不同消息 m1,m2:
s1=k−1(H(m1)+dr)modn
s2=k−1(H(m2)+dr)modn
s1−s2=k−1(H(m1)−H(m2))⇒k=s1−s2H(m1)−H(m2)
然后可求 d=(s1k−H(m1))/rmodn——私钥泄露!
2013 年 PlayStation 3 即因 k 固定为常数被破解私钥。
6. Schnorr 签名(基于 Fiat-Shamir)
k$Zq,R=gk,e=H(R∥m),s=k+exmodq
σ=(R,s)
验证:gs=?R⋅ye(其中 y=gx 为公钥)
优势:签名长度 2×32=64 bytes(secp256k1),线性代数结构支持多重签名聚合(MuSig)。
7. RSA vs ECDSA vs Schnorr 对比
| 方案 | 密钥大小 | 签名大小 | 安全基础 |
|---|
| RSA-2048 | 256 bytes | 256 bytes | 整数分解 |
| ECDSA-256 | 32 bytes | 64 bytes | ECDLP |
| Ed25519(Schnorr) | 32 bytes | 64 bytes | ECDLP |
关键公式
RSA-FDH:
σ=H(m)dmodn,验证:σe≡H(m)(modn)
ECDSA 签名:
s=k−1(H(m)+dr)modn
Schnorr(Fiat-Shamir):
e=H(R∥m), s=k+exmodq
验证:gs=R⋅ye
我的理解
签名编码和填充属于密码构造本身,而不是可随意更换的序列化细节;错误组合会让安全归约失效。