多签名基础——General forking lemma(分叉引理)

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 J1 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}) frkacc(qacch1) 的概率输出该签名方案两个有效且相关的不同签名。

(三)、分叉引理应用于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[Rm]=thenbadtrue
    这个判断条件的意思是说,如果签名查询阶段的消息在哈希查询阶段被询问过,则 b a d ← t r u e bad \leftarrow true badtrue
    为什么签名查询的消息不能在哈希查询阶段被询问?原因:生成签名的顺序是先将消息进行哈希,再产生签名。而在敌手进行签名查询时,算法 A A A 是先随机选择一个 s s s ,然后构造 R R R ,相当于先构造了签名,此时需要对消息的哈希进行更改,使之成为与 s s s R R R 配对的消息哈希,即要修改 T [ R ∥ m ] T[R \| m] T[Rm] 的取值为 h c t r ′ h_{ctr}^{'} hctr;而如果一开始敌手就在对消息进行哈希查询时碰巧选择了算法 A A A精心构造的 R R R(当敌手查询 R ∥ m R \| m Rm 的哈希值时,算法 A A A 会选择一个随机数 h c t r h_{ctr} hctr 赋给 T [ R ∥ m ] T[R \| m] T[Rm] ),此时在签名查询阶段更改后的 T [ R ∥ m ] T[R \| m] T[Rm](其取值为 h c t r ′ h_{ctr}^{'} hctr) 就会和之前的 T [ R ∥ m ] T[R \| m] T[Rm] (其取值为 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[Rm] 和哈希询问中所有 T [ R ∥ m ] T[R \| m] T[Rm] 中某一个 T [ R ∥ m ] T[R \| m] T[Rm]产生冲突的概率时 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(XRLm),可以分为敌手是否知道 R R R 的取值这两种情况。
第一种,敌手知道 R R R 的取值,并故意询问 H 1 ( X ∥ R ∥ L ∥ m ) H_1(X\|R\|L\|m) H1(XRLm)。已知 R ← ∏ i = 1 n   R i R\leftarrow {\prod_{i=1}^n}\,R_i Ri=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(XRLm) ,所以易知第二种的概率为 q S ( q H + q S ) p \frac{q_S(q_H+q_S)}{p} pqS(qH+qS)

参考文献


  1. https://blog.csdn.net/qq_44775134/article/details/107833717 ↩︎

  2. General Forking Lemma ↩︎

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这是一个 Systemd unit 文件的示例。Systemd 是用于启动和管理 Linux 系统中的服务的工具。在这个示例中,unit 文件定义了一个名为 "l23 service" 的服务。 [Unit] Description=l23 service After=phy.service 在 [Unit] 部分,Description 行指定了服务的描述,After 行指定了该服务在 phy.service 之后启动。 [Service] Type=forking ExecStart=/usr/bin/sp.sh ExecReload= ExecStop=/usr/bin/sp.sh -k Restart=no PrivateTmp=true 在 [Service] 部分,Type 行指定了服务的类型为 forking,表示它会以 fork 的方式启动。ExecStart 行指定了启动服务时要执行的命令,这里是 `/usr/bin/sp.sh`。ExecReload 和 ExecStop 行分别指定了重新加载和停止服务时要执行的命令。Restart 行指定了服务在失败后是否自动重启。PrivateTmp 行设置为 true,表示服务使用私有的临时文件系统。 #RemainAfterExit=yes #TimeoutSec=120 在这个示例中,RemainAfterExit 和 TimeoutSec 行被注释掉了。RemainAfterExit 行设置为 yes 可以让服务在退出后仍然保持 active 状态,而不是转为 inactive 状态。TimeoutSec 行设置了服务的超时时间,单位为秒。 注释符号 "#" 表示这些行被注释掉了,即不会起作用。如果需要启用这些行,可以去掉注释符号,并根据需要进行相应的修改。 请注意,这只是一个示例,实际的 unit 文件可能会根据具体的需求和配置进行调整。具体的含义和配置取决于你的具体应用场景和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值