如题
可证明安全是我研究生三年所学习的东西,感觉以后应该会很少搞这方面的东西了,总所周知,这东西一段时间不看的话就很容易会忘记,所以还是得做个笔记
Diffie-Hellman就是著名的DH密钥交换协议,用它做第一篇可证明安全学习笔记的原因有俩,一个是@Bintou在上周组会中刚好用DH做栗子给新人讲了可证明安全,另一个原因是,DH的协议比较简单,而且有一系列专门为它定制的难题,所以规约的过程也会相对简单
前置知识·
密钥交换·
所谓密钥交换,可以大概理解为:Pi和Pj两个参与方想要通信,但又不想他们的通信被别人窃听,所以会希望用一个密钥加密他们的信息,于是就会产生一个问题,密钥怎么协商呢
通常这个密钥我们想要的是对称密钥,原因是对称加解密的速度会比非对称加解密的速度快很多,而且如果用非对称加解密通信的话其实也并没有协商密钥的必要
一般来说,参与通信的双方的物理距离都很远,所以用线下协商密钥的方式并不现实,通常最容易会想到的另一种方法是,由某一方生成密钥,然后发送给另一方,但这显然是不行的,因为这个密钥可以被攻击者截获
所以,密钥交换协议要做就是,让通信双方协商出一个相同的密钥,而且这个密钥不能被第三方知道
关于密钥交换的更多内容建议自己翻一下wiki,这里就不展开了
协议流程·
首先DH协议通常运行在一个循环群G中,(G是一个通用的表达,为了方便理解,你可以直接令G=Zp∗,其中p是素数),令G的群阶为∣G∣=q,令g为G的生成元,即G=<g>
为了方便后面表述,这里设一个Gen
函数,即G,g,q←Gen(),来生成DH所使用的群
PS:一般q为素数,即G为素阶群
Pix←$ZqX=gx (in G)Ki=Yx (in G) ⟶X⟵YPjy←$ZqY=gy (in G)Kj=Xy (in G)
首先可以简单证明一下Pi和Pj在以上协议中生成了相同的密钥,即Ki=Kj:
Ki=Yx=gyx=gxy=Xy=Kj (in G)
然后就是证明其安全性,这篇文章的主要内容,留到后面说
可证明安全·
一个协议的安全性当然不是说“我认为它是安全的”,它就是安全的,而是需要严谨的证明
在可证明安全中有三个中重要的部件:安全定义、难题和规约:
- 安全定义:即定义一个协议符合什么条件才是安全的,通常在安全定义中会界定攻击者的攻击能力,即攻击者只能进行什么攻击,不能进行什么攻击
- 难题:顾名思义,就是一些被证明的或者公认的多项式时间内不可解决的问题,关于难题可以去复习一下计算理论
- 规约:比如说把问题A规约到问题B,大概的意思是,如果问题B被解了,那么问题A也可被解,关于规约也可以去复习一下计算理论
利用这三个部件,可证明安全的思路大概如下,其实是一个反证法:
- 首先构造一种规约,把某个难题规约到安全定义,详细点说即,如果存在一个符合我安全定义的攻击能力的攻击者,可以攻破我安全定义中设定的条件的话,那么就可以使用这个攻击者去解决这个难题
- 规约完成后,即是如果安全定义被攻击则难题被攻击,安全定义→难题,如果把这个命题逆否一下,即¬难题→¬安全定义,根据假设,难题在多项式时间内不可解,所以安全定义也在多项式时间内不可被攻破
- 另外,详细来说,在以上规约中,还需要一个模拟者S来模拟规约的过程,即假设存在一个攻击者A能够攻破我的安全定义,那么模拟者则需要通过调用A来解决难题
可以先把这个思路记住,然后在后面栗子中慢慢体会
PS:多嘴说一下,以上说的规约定义都是按照计算理论抄的,在别的论文或文章中会有一种像“方案的安全性可以规约到xxx问题”的说法,这里的“规约”比较像是这个方案基于xxx问题的意思,注意区分就好
安全难题·
马克一下后面会用到的一些难题,这些问题目前都只是假设,没有人能证明他是困难的,但目前(在Zp∗上)也没人能解
CDH假设·
计算性DH假设(Computational Diffie–Hellman assumption)
这个假设的大概意思是(可能会跟上图有点不一样)
令G为循环群,g为其生成元,q为其群阶,在Zq中均匀随机选择x和y,若存在攻击者A,在仅知道公开信息(G,g,q)和输入(gx,gy)的情况下,可以在多项式时间内计算出gxy,则称攻击者A攻破了CDH难题
这个定义虽然没啥问题,但它只是定义了一个事件,我们很难把这个事件应用到证明中,所以一般会使用这个事件的概率,形式化地表示这个概率就是
Pr[A(gx,gy)=gxy:x,y←$Zq]
准确地说,我们像知道的是攻击者的优势(Advantage),即攻击者A算中gxy的概率比他睁着眼睛乱猜的概率大多少
由于攻击者乱猜的概率非常小(1/q),所以通常会忽略,即直接
AdvCDH(A):=Pr[A(gx,gy)=gxy:x,y←$Zq]
PS:个人认为准确点说应该是
AdvCDH(A):=∣∣Pr[A(gx,gy)=gxy:x,y←$Zq]−q1∣∣
不过人人都用上面哪个,就算了,反正写着更简单
最后如果对于所有多项式攻击者A,攻击CDH的优势都可忽略(Negligible),记作AdvCDH(A)≤negl,则认为CDH问题不可被解决
反之如果存在一个多项式攻击者A,其攻击CDH的优势不可忽略,记作AdvCDH(A)>negl,则CDH问题可被解决
CDH假设声称CDH问题不可被解决,则不存在优势不可忽略的多项式攻击者
DDH假设·
判定性DH假设(Decisional Diffie–Hellman assumption)
这个假设和上面的类似,但又不一样,大概意思是(可能会跟上图有点不一样)
令G为循环群,g为其生成元,q为其群阶,在Zq中均匀随机选择x、y和z,若存在攻击者A,在仅知道公开信息(G,g,q)和输入(gx,gy,Z)的情况下,可以分辨Z=gxy还是Z=gz,则称攻击者A攻破了DDH难题
类似地表达攻击者的优势(Game的定义):
AdvDDH(A):=∣∣Pr⎣⎡A(gx,gy,Z)=b:x,y,z←$Zq; b←${0,1}Z={gxygz,b=0,b=1⎦⎤−21∣∣
这里的优势和CDH的会不太一样,因为攻击者A有1/2的概率猜b,这是个不可忽略的概率,所以需要减去
当然也可以用上面图的定义,即概率分布不可区分的定义
AdvDDH(A):=∣∣Pr[A(gx,gy,gxy)=1:x,y←$Zq]−Pr[A(gx,gy,gz)=1:x,y,z←$Zq]∣∣
但这个定义没有描述攻击游戏(Game),在规约的时候可能会有点麻烦,不过在Game Sequence的证明中会很好用,所以还是看具体证明中哪个好用来做选择吧
最后如果对于所有多项式攻击者A,攻击DDH的优势都可忽略(Negligible),记作AdvDDH(A)≤negl,则认为DDH问题不可被解决
反之如果存在一个多项式攻击者A,其攻击DDH的优势不可忽略,记作AdvDDH(A)>negl,则DDH问题可被解决
DDH假设声称DDH问题不可被解决,则不存在优势不可忽略的多项式攻击者
DDH规约到CDH·
到这里就可以先体验一波规约了,从上面定义不难看出,DDH可以规约到CDH,即如果CDH可解,则DDH可解,因为只要算出gxy然后对比是否等于Z就可以了,下面来更严谨的证明
首先假设攻击者A可以解决CDH问题,以下构造模拟者S,通过调用攻击者A解决DDH问题(使用Game的定义),S的操作如下:
- 在接收到(gx,gy,Z)后,把(gx,gy)输入给攻击者A
- 接收到攻击者A输出的ZA后,对比ZA和Z是否相等,若相等则输出0,否则输出1
如果A成功解决CDH,则ZA=gxy,如果此时ZA=Z,则Z=gxy,即b=0,否则Z=gxy,即只能Z=gz,b=1
所以如果A能成功攻击CDH的话,S也能成功攻击DDH
但其实A不是百分百成功攻击CDH的,所以通常会用两者的优势表示这个规约结果
AdvDDH(SA)≥AdvCDH(A)
01-最简单的栗子(CDH)·
有了上面知识就可以看实际的栗子了,复习一下最开始的DH协议
Pix←$ZqX=gx (in G)Ki=Yx (in G) ⟶X⟵YPjy←$ZqY=gy (in G)Kj=Xy (in G)
首先要给出DH的安全定义,安全定义其实有很多种,只要别人认可,你也可以自己创一个安全定义
为了方便,我把DH协议的过程封装成一个DH
函数(其中因为K=Ki=Kj,所以我就直接让K=gxy了)
0102030405DH(G,g,q):x,y←$ZqX=gx (in G)Y=gy (in G)K=gxy (in G)return X,Y,K
然后下面给一种DH中最简单的安全定义,以下定义攻击者A实施被动攻击DH的优势为:
AdvDH01(A):=Pr[A(X,Y)=K:G,g,q←Gen()X,Y,K←DH(G,g,q)]
如果对于所有多项式的攻击者A,都有AdvDH01(A)≤negl,则称DH协议安全
可以看出这个定义其实跟CDH的定义很像,所以会选择把它的安全性规约到CDH
假设存在攻击者A,能以AdvDH01(A)>negl的优势攻破DH协议,以下构造模拟者S,通过调用A,以AdvCDH(SA)>negl的优势解决CDH问题,SA的操作如下:
-
在接收到CDH问题输入的(gx,gy)后,给A输入(gx,gy)
-
接收到A输出的K后,输出K
显然,如果A可以成功攻破DH协议,则K=gxy,恰好是CDH的解,所以有(因为至少知道A攻击成功的话S可以解难题,但不清楚S是否有其他途径解难题,所以是≥)
AdvCDH(SA)≥AdvDH01(A)>negl
但根据CDH假设,AdvCDH(SA)≤negl,产生了矛盾,所以最开始的假设AdvDH01(A)>negl不成立,即AdvDH01(A)≤negl,DH协议安全
还算容易吧
02-猜比特(DDH)·
在以上定义中,需要攻击者恢复完整的Key,这其实是一个比较严格的要求,如果放宽对攻击者的要求的话,可以让攻击者只需猜Key的“一个比特”,那么如何定义这种猜“一个比特”,其实可以让攻击者某个输入是由DH算法生成的Key还是一个睁着眼睛乱选的Key
根据上面讨论,定义攻击者A猜中DH Key的优势为
AdvDH02(A):=∣∣Pr⎣⎡A(X,Y,Kb)=b:G,g,q←Gen()X,Y,K0←DH(G,g,q)K1←$G; b←${0,1}⎦⎤−21∣∣
注:因为攻击者即使乱猜也有21的概率猜中b,所以这里的优势需要减去这个21
如果对于所有多项式的攻击者A,都有AdvDH02(A)≤negl,则称DH协议安全
可以看出这个定义其实跟DDH的定义很像,所以会选择把它的安全性规约到DDH
假设存在攻击者A,能以AdvDH02(A)>negl的优势攻破DH协议,以下构造模拟者S,通过调用A,以AdvDDH(SA)>negl的优势解决DDH问题,SA的操作如下:
- 接收到DDH问题输入的(gx,gy,Z)后,把(gx,gy,Z)输入到A
- 接收到A输出的b后,输出b
简单证明一下,如果DDH输入的Z是gxy,则Z和安全定义的K0同分布,如果Z是gz,则Z和安全定义的K1同分布,所以如果DDH问题里是b=0的情况,则S给A输入的是安全定义中b=0的情况,A应该以AdvDH02(A)的优势输出b=0,b=1的情况类似,略,所以
AdvDDH(SA)≥AdvDH02(A)>negl
但根据DDH假设,AdvDDH(SA)≤negl,产生了矛盾,所以最开始的假设AdvDH02(A)>negl不成立,即AdvDH02(A)≤negl,DH协议安全
由于这个规约也是比较直接,就不详细展开说了(应该还挺好懂吧,
03-多个Session(CDH)·
Session就是会话的意思,可以把DH协议中的一次密钥交换看作一个Session,即把上面协议图完整执行一遍后就是完成一个Session
在上面定义中,要求攻击者对于每一个Session都能算出其密钥,这对攻击者的要求有点高,因为在实际应用中,攻击者只需要猜中一个Session的Key就可能会产生严重的影响,所以需要一个新的定义,以放松对攻击者的要求
(注:由于一时间没找到相关定义,以下定义的一些部分是我自己编的)
首先定义一下Session如何产生,这里假设攻击者可以访问所有Session的Transcript(即DH协议中的(X,Y)),然后Session的数量固定,假设共有ns个Session,以下定义一个Init
函数,生成攻击游戏中所有Session的Transcript和Key
01020405060708Init(ns,G,g,q):T=[ ]K=[ ]for i from 0 to ns−1:Xi,Yi,Ki←DH(G,g,q)T.append((Xi,Yi))K.append(Ki)return T,K
其中返回的T就是所有Session的Transcript,K就是所有Session的Key
于是以下定义攻击者A在多个Session中猜中一个Session Key的优势为:
AdvDH03(A):=Pr[A(T)→KK∈K:G,g,q←Gen()T,K←Init(ns,G,g,q)]
如果对于所有多项式的攻击者A,都有AdvDH03(A)≤negl,则称DH协议安全
接下来是证明,大概思路和上一节的类似,安全性规约到CDH,假设存在攻击者A,能以AdvDH03(A)>negl的优势攻破DH协议,以下构造模拟者S,通过调用A,以AdvCDH(SA)>negl的优势解决CDH问题
到这里有一个问题,就是S从CDH问题中只能拿到一对(X∗,Y∗),而S调用A的时候需要给他ns对不同的(Xi,Yi),所以下面S在调用A时需要自己生成ns−1对(Xi,Yi),然后再把CDH问题的(X∗,Y∗)嵌入其中,组成ns对不同的(Xi,Yi)作为A的输入
以下描述S的操作:
- 在接收到CDH问题输入的(gx,gy)后,运行Init(ns−1)获得TS和KS,把(gx,gy)嵌入到TS随机位置,然后把TS输入给A
- 接收A的输出K,然后输出K
首先需要证明以上模拟中的TS和安全定义中的T分布一致,不然攻击者A会在以上模拟中和安全定义中有不同的攻击优势,从而导致规约失败
明显,TS和T只有嵌入的(gx,gy)分布(可能)不一样,在T中由DH(G,g,q)抽样得出,在TS中则由CDH问题生成,由于CDH输出的(gx,gy)和DH(G,g,q)抽样的(X,Y)分布一致,所以易得TS和T分布一致
而由于TS中的每个Transcript都分布一致而且相互独立,所以A只能在其中挑选一个(Xi,Yi)去攻击出它的Ki,即A有ns1的概率挑中(gx,gy)然后攻击出对应的K∗
于是如果在以上模拟中A挑中了(gx,gy)而且成功攻击的话,S就可以成功攻击CDH,其中挑选中(gx,gy)的概率是ns1,随机挑选时成功攻击的优势是AdvDH03(A),于是总结出SA攻击CDH的优势为
AdvCDH(SA)≥ns1AdvDH03(A)>negl
注:关于可忽略量,一个多项式乘上一个可忽略量依然是可忽略量,反之,一个多项式乘上一个不可忽略量也依然是不可忽略量,这里ns1是多项式,所以在假设AdvDH02(A)为不可忽略量的前提下,AdvCDH(SA)为不可忽略量
所以但根据CDH假设,AdvCDH(SA)≤negl,产生了矛盾,所以最开始的假设AdvDH03(A)>negl不成立,即AdvDH03(A)≤negl,DH协议安全
这里最后的优势表达和上一节的有点不同,多了个ns1,通常这种在A的优势前面多了个系数(通常这个系数小于1)的规约,都被称为不紧致(Non-tight)的规约,而像上一节的在A的优势前面没有系数的则称为紧致(Tight)规约
更紧致的规约?·
(注意:以下只是个人观点,不一定对,)
那么能不能把上面规约做紧致呢,目前来说如果没有额外假设的情况下,并不能在以上定义中基于CDH做到紧致,但好像能做得更紧致
观察一下上面的模拟,在接收到A的输出K后,如果K落在KS里的话,就可知道A对某个(gx,gy)以外的Transcript攻击成功,但S需要的是(gx,gy)对应的K∗,所以这个K肯定不是S想要的,所以若发现K∈K,即可抛弃这个K,然后重新调用一次A进行攻击
于是,改进后的模拟者S的操作如下:
- 接收CDH问题输入的(gx,gy)
- 运行Init(ns−1)获得TS和KS,把(gx,gy)嵌入到TS随机位置,然后把TS输入给A
- 接收A的输出K,若K∈KS,则跳转到操作2,否则跳转到操作4
- 输出K
首先分布一致的证明是一样的,这里就不重复了
然后这里有一个循环(Loop),所以需要证明模拟者S可以停机,即这个模拟者是多项式的,简单来说的话,这里至少A选中(gx,gy)的话是可以停机的,所以S停机的概率大于等于ns1,不是可忽略的概率,所以S依然是多项式的
接下来绑定S的优势,S的输出可以分为两种情况:A对任意一个Transcript攻击失败或者A对(gx,gy)的Transcript攻击成功
其中A对任意一个Transcript攻击失败的概率是1−AdvDH03(A),而A对(gx,gy)攻击成功的概率为ns1AdvDH03(A),而S只有在A对(gx,gy)攻击成功时才能攻击成功,所以总结出S的优势为
AdvCDH(SA)≥1−AdvDH03(A)+ns1AdvDH03(A)ns1AdvDH03(A)=ns−(ns−1)AdvDH03(A)AdvDH03(A)>negl
这个规约依然是不紧致的,因为令n′=ns−(ns−1)AdvDH03(A)的话,就是
AdvCDH(SA)≥n′1AdvDH03(A)>negl
但是显然n′≤ns,所以会比原来的紧致了一些
04-多Session猜比特(CDH)·
这一章有点问题,所以先删去
关于DH的被动攻击安全证明,大概就是以上这些
个人总结,未免有错,发现错误,请提Issue
然后,其实文章只是用了简单规约的技术,实际上用的比较多的还有Game Sequence的技巧,留个坑