General forking lemma(分叉引理)
文章目录
(一)、前言
1、为什么使用分叉引理
- 证明数字签名方案的安全性常用的一种模型是随机预言模型ROM。在随机预言模型中,数字签名方案使用的 h a s h hash hash 函数至少有一个需要被看做随机谕言机。
- 在这种模型下,证明数字签名方案安全性的一个重要技术就是随机谕言机重放技术,也就是通过重放 h a s h hash hash 值来破解一个困难问题。该技术的理论依据就是著名的分叉引理(Forking Lemma)。1
2、什么是分叉引理
- 令
Q
i
Q_i
Qi 代表敌手
A
A
A发送的第
i
i
i 次随机预言询问,
h
i
h_i
hi 表示挑战者
C
C
C 对第
i
i
i 次随机预言询问所返回的结果。分叉引理的示意图如图:
在安全性证明中,挑战者 C C C 为了能够利用敌手破解一个困难的问题,它需要运行两次挑战过程,使得第二次挑战过程的输出结果和第一次的输出结果在开始一段时间内都是相同的,但是在某处之后就会发生改变,从而挑战者 C C C 据此能够破解一个困难的问题,如离散对数问题。
(二)、基本内容
1、随机算法 A A A
- A ( x , h 1 , . . . , h q , ρ ) A(x,h_1,...,h_q,ρ) A(x,h1,...,hq,ρ) denotes its output on inputs x x x, h 1 , . . . , h q h_1,...,h_q h1,...,hq, and coins ρ ρ ρ. Then x x x is a public key, h 1 , . . . , h q h_1,...,h_q h1,...,hq are replies to queries to a random oracle, J J J is an integer in the range 0 , . . . , q 0, . . . , q 0,...,q and σ \sigma σ is a side output( J J J 是谕言机回答所对应的索引/指针, σ \sigma σ 相当于部分签名,用来后面解决困难问题)
- While means that we choose ρ ρ ρ at random and let ( J , σ ) = A ( x , h 1 , . . . , h q , ρ ) (J,\sigma) = A(x,h_1,...,h_q,ρ) (J,σ)=A(x,h1,...,hq,ρ) 相当于强调了敌手有随机选择的能力
- The accepting probability of
A
A
A, denoted
a
c
c
acc
acc, is defined as the probability that
J
≥
1
J≥ 1
J≥1 in the experiment,或者
2、分叉算法 F A F_A FA
或者
算法 A A A 相当于敌手伪造签名的算法,其中 I = 0 I=0 I=0 表示伪造签名失败。分叉算法 F A F_A FA就是利用算法 A A A 输出同一个消息两个不同且有效签名的过程。
-
f r k frk frk is the probability that b = 1 b=1 b=1
或者
-
概率 a c c acc acc 和概率 f r k frk frk 具有如下关系:
或者
其中 q q q 是哈希询问次数, h h h 是 H H H 集合元素个数( h 1 , . . . h q h_1,...h_q h1,...hq 是从 H H H 中随机选择),具体证明见参考文献2 -
一般分叉引理关于 a c c acc acc 和 f r k frk frk 的关系说明:如果存在一个敌手能够以概率 a c c acc acc伪造一个数字签名方案的有效签名,则存在一个算法 F A F_A FA 通过利用敌手能够以 f r k ≥ a c c ∗ ( a c c q − 1 h ) frk \geq acc * (\frac{acc}{q} - \frac{1}{h}) frk≥acc∗(qacc−h1) 的概率输出该签名方案两个有效且相关的不同签名。
(三)、分叉引理应用于Schnorr签名
1、Schnorr签名
2、随机算法 A A A
- 其中 B B B is a forging algorithm that ( t , q S , q H , ϵ ) − (t, q_S, q_H, \epsilon)- (t,qS,qH,ϵ)−breaks the Schnorr signature scheme
- 算法 A A A 调用伪造签名算法 B B B ,在敌手的视角算法 A A A 扮演挑战者 C C C 的角色,回答敌手关于哈希和签名的询问
- 解释
I
f
T
[
R
∥
m
]
≠
⊥
t
h
e
n
b
a
d
←
t
r
u
e
If \enspace T[R \| m] \neq \bot \enspace then \enspace bad \leftarrow true
IfT[R∥m]=⊥thenbad←true :
这个判断条件的意思是说,如果签名查询阶段的消息在哈希查询阶段被询问过,则 b a d ← t r u e bad \leftarrow true bad←true
为什么签名查询的消息不能在哈希查询阶段被询问?原因:生成签名的顺序是先将消息进行哈希,再产生签名。而在敌手进行签名查询时,算法 A A A 是先随机选择一个 s s s ,然后构造 R R R ,相当于先构造了签名,此时需要对消息的哈希进行更改,使之成为与 s s s和 R R R 配对的消息哈希,即要修改 T [ R ∥ m ] T[R \| m] T[R∥m] 的取值为 h c t r ′ h_{ctr}^{'} hctr′;而如果一开始敌手就在对消息进行哈希查询时碰巧选择了算法 A A A精心构造的 R R R(当敌手查询 R ∥ m R \| m R∥m 的哈希值时,算法 A A A 会选择一个随机数 h c t r h_{ctr} hctr 赋给 T [ R ∥ m ] T[R \| m] T[R∥m] ),此时在签名查询阶段更改后的 T [ R ∥ m ] T[R \| m] T[R∥m](其取值为 h c t r ′ h_{ctr}^{'} hctr′) 就会和之前的 T [ R ∥ m ] T[R \| m] T[R∥m] (其取值为 h c t r h_{ctr} hctr)产生碰撞(哈希同样的消息,产生不同的哈希值)。如果产生了碰撞,敌手就可以区分这不是一个真正随机谕言机,从而中止游戏,所以要避免这样的情况发生,就要规定签名查询的消息不能在哈希查询阶段被询问过。 - 如果敌手伪造的不是一个合法的签名,或者挑战签名之前被询问过,或者 b a d bad bad 为 t r u e true true ,则算法 A A A 输出为0(也就是 I = 0 I=0 I=0),运行失败。
- 概率
a
c
c
acc
acc
b a d bad bad 为 t r u e true true 的概率:一次签名查询中的 T [ R ∥ m ] T[R \| m] T[R∥m] 和哈希询问中所有 T [ R ∥ m ] T[R \| m] T[R∥m] 中某一个 T [ R ∥ m ] T[R \| m] T[R∥m]产生冲突的概率时 q H + q S + 1 2 k \frac{q_H + q_S +1}{2^k} 2kqH+qS+1,一共有 q S q_S qS 次签名查询,就再乘以 q S q_S qS即可。
3、解决困难问题算法 D D D
- Algorithm
D
D
D : (
t
′
,
ϵ
′
t^{'}, \epsilon^{'}
t′,ϵ′)-solves the discrete logarithm problem
F A F_A FA 是与 算法 A A A 关联的分叉算法,算法 D D D 利用分叉算法 F A F_A FA输出的两个不同签名解决困难问题。 - 图中注释 等号 两侧 R R R 一样。是因为分叉引理中两个分支中的哈希查询的内容都一样,只是在哈希结果中产生分叉。即产生相同消息的不同签名。
(四)、分叉引理应用于Schnorr多签名
1、Schnorr多签名
2、 A A A 函数(对敌手询问的回复)
3、 b a d = t r u e bad = true bad=true 的概率
要想使
b
a
d
2
=
t
r
u
e
bad_2 = true
bad2=true,则敌手询问过
H
1
(
X
∥
R
∥
L
∥
m
)
H_1(X\|R\|L\|m)
H1(X∥R∥L∥m),可以分为敌手是否知道
R
R
R 的取值这两种情况。
第一种,敌手知道
R
R
R 的取值,并故意询问
H
1
(
X
∥
R
∥
L
∥
m
)
H_1(X\|R\|L\|m)
H1(X∥R∥L∥m)。已知
R
←
∏
i
=
1
n
R
i
R\leftarrow {\prod_{i=1}^n}\,R_i
R←∏i=1nRi,
R
1
R_1
R1 由算法
A
A
A 精心构造,与敌手独立,
R
2
,
.
.
.
,
R
n
R_2,...,R_n
R2,...,Rn 敌手知道,所以如果敌手知道
R
R
R ,则必然知道
R
1
R_1
R1 ,则曾经询问过
H
0
(
R
1
)
H_0(R_1)
H0(R1),所以敌手知道
R
R
R 的概率就是敌手曾询问过
H
0
(
R
1
)
H_0(R_1)
H0(R1) 的概率:
q
S
(
q
H
+
n
m
a
x
q
S
)
p
\frac{q_S(q_H+n_{max}q_S)}{p}
pqS(qH+nmaxqS) (其中
p
p
p 为群的阶,即群中元素个数;参与任何签名查询或伪造的集合
L
L
L 中的公钥数最多为
n
m
a
x
n_{max}
nmax )。
第二种,敌手不知道
R
R
R 的取值,只是碰巧询问过
H
1
(
X
∥
R
∥
L
∥
m
)
H_1(X\|R\|L\|m)
H1(X∥R∥L∥m) ,所以易知第二种的概率为
q
S
(
q
H
+
q
S
)
p
\frac{q_S(q_H+q_S)}{p}
pqS(qH+qS) 。
参考文献
https://blog.csdn.net/qq_44775134/article/details/107833717 ↩︎