定义
定义数字签名方案 Π = ( Gen, Sign, Vrfy ) \Pi = (\text{Gen, Sign, Vrfy}) Π=(Gen, Sign, Vrfy) 如下:
- Gen:输入安全参数 1 n 1^n 1n,输出长度均为 n n n 的公司钥对 ( p k , s k ) (pk,sk) (pk,sk)
- Sign:输入私钥 s k sk sk 和明文 m m m,输出签名 σ ← Sign s k ( m ) \sigma \leftarrow \text{Sign}_{sk}(m) σ←Signsk(m)
- Vrfy:输入公钥 p k pk pk,明文 m m m,签名 σ \sigma σ。输出 Vrfy p k ( m , σ ) \text{Vrfy}_{pk}(m,\sigma) Vrfypk(m,σ)
安全性
定义伪造签名实验 Sig-forge A , Π ( n ) \text{Sig-forge}_{\mathcal{A},\Pi}(n) Sig-forgeA,Π(n):
- ( p k , s k ) ← Gen ( 1 n ) (pk,sk)\leftarrow \text{Gen}(1^n) (pk,sk)←Gen(1n)
- 敌手 A \mathcal A A 输入 p k , Sign s k ( ⋅ ) pk, \text{Sign}_{sk}(\cdot) pk,Signsk(⋅),敌手输出 ( m , σ ) (m,\sigma) (m,σ)。 Q \mathcal Q Q 表示 A \mathcal A A 查询过的全部明文。
- A \mathcal A A 成功当且仅当 Vrfy p k ( m , σ ) = 1 \text{Vrfy}_{pk}(m,\sigma) = 1 Vrfypk(m,σ)=1 且 m ∉ Q m \notin \mathcal Q m∈/Q。
电子签名方案
Π
=
(
Gen, Sign, Vrfy
)
\Pi = (\text{Gen, Sign, Vrfy})
Π=(Gen, Sign, Vrfy) 不可伪造,当且仅当对任意多项式时间敌手
A
\mathcal A
A,
Pr
[
Sig-forge
A
,
Π
(
n
)
=
1
]
≤
negl
(
n
)
\Pr[\text{Sig-forge}_{\mathcal A, \Pi}(n)=1] \le \text{negl}(n)
Pr[Sig-forgeA,Π(n)=1]≤negl(n)
RSA-FDH 原理
GenRSA 是一个多项式算法,输入
1
n
1^n
1n,输出两个
n
n
n 位质数的乘积
N
N
N,两个整数
e
,
d
e,d
e,d 满足
e
d
≡
1
(
m
o
d
ϕ
(
N
)
)
ed \equiv 1 \pmod {\phi(N)}
ed≡1(modϕ(N))。
定义 RSA-FDH 加密方案如下:
- Gen: < N , e , d > ← GenRSA ( 1 n ) <N,e,d> \leftarrow \text{GenRSA}(1^n) <N,e,d>←GenRSA(1n)。公钥为 < N , e > <N,e> <N,e>,私钥为 < N , d > <N,d> <N,d>。指定 H : { 0 , 1 } ∗ → Z N ∗ H:\{0,1\}^* \rightarrow \mathbb Z_N^* H:{0,1}∗→ZN∗
- Sign:输入私钥 < N , d > <N,d> <N,d> 和明文 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗,计算 σ ← [ H ( m ) d m o d N ] \sigma \leftarrow [H(m)^d \mod N] σ←[H(m)dmodN]
- Vrfy:输入公钥 <N,e>,消息 m m m,签名 σ \sigma σ,当且仅当 σ e = H ( m ) m o d N \sigma ^ e = H(m) \mod N σe=H(m)modN 时,输出 1
证明
当 RSA 假设成立,且
H
H
H 符合随机预言模型,即将输入随机映射到
Z
n
∗
\mathbb Z_n^*
Zn∗ 时,可以证明其不可伪造性。
设
A
\mathcal A
A 查询
H
H
H 共
q
q
q 次,构造实验
Sig-forge
A
,
Π
′
(
n
)
\text{Sig-forge}'_{\mathcal{A}, \Pi}(n)
Sig-forgeA,Π′(n):
- 随机选择 j ∈ { 1 , . . . , q } j \in \{1, ..., q\} j∈{1,...,q}(不输入给 A \mathcal A A)
- ( N , e , d ) ← GenRSA ( 1 n ) (N,e,d) \leftarrow \text{GenRSA}(1^n) (N,e,d)←GenRSA(1n),选定随机函数 H : { 0 , 1 } ∗ → Z N ∗ H:\{0,1\}^* \rightarrow \mathbb Z_N^* H:{0,1}∗→ZN∗
- 给敌手 A \mathcal A A 输入 p k = ( N , e ) , H , Sign < N , d > ( ⋅ ) pk = (N,e), H, \text{Sign}_{<N,d>}(\cdot) pk=(N,e),H,Sign<N,d>(⋅),明文 m m m,返回 σ ← [ H ( m ) d m o d N ] \sigma \leftarrow [H(m)^d \mod N] σ←[H(m)dmodN]。当查询 Sign < N , d > ( m j ) \text{Sign}_{<N,d>}(m_j) Sign<N,d>(mj) 时,会返回失败。
- A \mathcal A A 输出此前没有查询过签名的 ( m , σ ) (m, \sigma) (m,σ)。设 m = m i m = m_i m=mi 为第 i i i 次查询 H H H 的输入。 Sig-forge A , Π ′ ( n ) = 1 \text{Sig-forge}'_{\mathcal{A}, \Pi}(n) = 1 Sig-forgeA,Π′(n)=1 当且仅当 σ e ≡ H ( m ) ( m o d N ) \sigma^e \equiv H(m) \pmod N σe≡H(m)(modN) 且 i = j i = j i=j
由于 Sig-forge A , Π ′ ( n ) \text{Sig-forge}'_{\mathcal{A}, \Pi}(n) Sig-forgeA,Π′(n) 成功,必须输出 m j m_j mj 的加密码,因此禁止查询 m j m_j mj。显然, Pr [ Sig-forge A , Π ′ ( n ) = 1 ] = 1 q Pr [ Sig-forge A , Π ( n ) = 1 ] \Pr[\text{Sig-forge}'_{\mathcal{A}, \Pi}(n) = 1] = \frac 1q \Pr[\text{Sig-forge}_{\mathcal{A}, \Pi}(n) = 1] Pr[Sig-forgeA,Π′(n)=1]=q1Pr[Sig-forgeA,Π(n)=1],即输出的 m m m 正好是随机确定的那个。
给定 N , e , y N, e, y N,e,y,构造敌手 A ′ \mathcal A' A′ 解决 RSA 问题:
- 随机选择 j ∈ { 1 , . . . , q } j \in \{1, ..., q\} j∈{1,...,q}
- 运行 A \mathcal A A。记录所有的三元组 < m i , σ i , y i > <m_i,\sigma_i,y_i> <mi,σi,yi> 表明已经查询过 H ( m i ) = y i H(m_i) = y_i H(mi)=yi, σ i e ≡ y i ( m o d N ) \sigma_i^e \equiv y_i \pmod N σie≡yi(modN)
- 当
A
\mathcal A
A 第
i
i
i 次查询
H
H
H 时
- 如果 i = j i = j i=j,返回 y y y
- 否则选择随机的 σ i ∈ Z n ∗ \sigma_i \in \mathbb Z_n^* σi∈Zn∗,计算 y i ← [ σ i e m o d N ] y_i \leftarrow [\sigma_i^e \mod N] yi←[σiemodN] 并返回。记录 < m i , σ i , y i > <m_i, \sigma_i, y_i> <mi,σi,yi>
- 当
A
\mathcal A
A 查询
m
m
m 的签名时,设
m
i
=
m
m_i = m
mi=m
- 如果 j = i j = i j=i,禁止查询
- 如果有三元组 ( m i , σ i , y i ) (m_i, \sigma_i, y_i) (mi,σi,yi),返回 σ i \sigma_i σi
- 最后 A \mathcal{A} A 输出 ( m , σ ) (m,\sigma) (m,σ)。如果 m = m j m = m_j m=mj 且 σ e ≡ y ( m o d N ) \sigma^e \equiv y \pmod N σe≡y(modN), A ′ \mathcal A' A′ 输出 σ \sigma σ
这个例子很好地用到了随机语言模型的可编程性。要输出一个均匀随机的 y y y, A ′ \mathcal A' A′ 生成一个均匀随机的 σ \sigma σ,并返回 σ e m o d N \sigma ^e \mod N σemodN。
Pr [ RSA-inv A ′ , GenRSA ( n ) = 1 ] = Pr [ Sig-forge A , Π ′ ( n ) = 1 ] = 1 q Pr [ Sig-forge A , Π ( n ) = 1 ] \begin{aligned} \Pr[\text{RSA-inv}_{\mathcal A',\text{GenRSA}}(n)=1] &= \Pr[\text{Sig-forge}'_{\mathcal{A}, \Pi}(n) = 1] \\ & = \frac 1q \Pr[\text{Sig-forge}_{\mathcal{A}, \Pi}(n) = 1] \end{aligned} Pr[RSA-invA′,GenRSA(n)=1]=Pr[Sig-forgeA,Π′(n)=1]=q1Pr[Sig-forgeA,Π(n)=1]
由于 Pr [ RSA-inv A ′ , GenRSA ( n ) = 1 ] ≤ negl ( n ) \Pr[\text{RSA-inv}_{\mathcal A',\text{GenRSA}}(n)=1] \le \text{negl}(n) Pr[RSA-invA′,GenRSA(n)=1]≤negl(n),所以 Pr [ Sig-forge A , Π ( n ) = 1 ] ≤ q ⋅ negl ( n ) \Pr[\text{Sig-forge}_{\mathcal{A}, \Pi}(n) = 1] \le q\cdot \text{negl}(n) Pr[Sig-forgeA,Π(n)=1]≤q⋅negl(n)
构造安全签名
可变长度
若 Π ′ = ( Gen, Sign’, Vrfy’ ) \Pi' = (\text{Gen, Sign', Vrfy'}) Π′=(Gen, Sign’, Vrfy’) 是固定长度 n n n 的不可伪造签名,则构造如下 Π = ( Gen, Sign, Vrfy ) \Pi = (\text{Gen, Sign, Vrfy}) Π=(Gen, Sign, Vrfy) 为任意长度签名:
- Sign:输入秘钥
s
k
sk
sk,长度为
l
l
l 的明文
m
m
m,将
m
m
m 切成
d
d
d 块
m
1
,
m
2
,
.
.
.
,
m
d
m_1,m_2,...,m_d
m1,m2,...,md, 每块长度为
n
/
4
n/4
n/4.
随机选择 r ∈ { 0 , 1 } n / 4 r \in \{0, 1\}^{n/4} r∈{0,1}n/4。对 i = 1 , 2 , . . . , d i = 1, 2, ..., d i=1,2,...,d,计算 t i ← S i g n s k ′ ( r ∣ ∣ l ∣ ∣ i ∣ ∣ m i ) t_i \leftarrow Sign_{sk}'(r||l||i||m_i) ti←Signsk′(r∣∣l∣∣i∣∣mi),输出 < r , t 1 , . . . , t d > <r,t_1, ..., t_d> <r,t1,...,td> 作为签名。 - Vrfy:输入公钥 p k pk pk,长度为 l l l 的明文 m m m,数字签名 < r , t 1 , . . . , t d ′ > <r,t_1, ..., t_{d'}> <r,t1,...,td′>。将 m m m 切成 d d d 块 m 1 , . . . , m d ′ m_1, ..., m_{d'} m1,...,md′。当且仅当 d = d ′ d = d' d=d′ 且 Vrfy p k ′ ( r ∣ ∣ l ∣ ∣ i ∣ ∣ m i , t i ) = 1 \text{Vrfy}_{pk}'(r||l||i||m_i,t_i) = 1 Vrfypk′(r∣∣l∣∣i∣∣mi,ti)=1 对任意 1 ≤ i ≤ d 1 \le i \le d 1≤i≤d 成立。