密码协议学习笔记(2):密钥交换协议

密钥交换协议:

设计密钥交换协议的目的是在多个用户之间安全地协商出一个共享的会话密钥(用于对称加密协议).

博主注:该类协议要求保证在可窃听信道的通信中密钥的安全,而在可篡改信道的通信中,密钥被篡改时可以被识别.

Diffie-Hellman密钥交换协议:

通信双方Alice,Bob约定素数阶有限域Fp(可以理解为[0,p1])和乘法循环群Fp(可以理解为[0,p1]与模p乘法构成的代数结构)的任意生成元g(可以理解为[1,p1]上的任意整数),然后执行如下运算:

(博主注:g的值是多少应当是公开的)

  1. Alice在[1,p2]={1,2,,p2}中随机选择a,计算ga=gamodp,将ga发送给Bob
  2. Bob也在[1,p2]={1,2,,p2}中随机选择b,计算gb=gbmodp,将gb发送给Alice
  3. Alice计算(gb)amodp,Bob计算(ga)bmodp,由于(gb)a=gab=(ga)b,这两个计算出来的值相同,因此可以作为协商出来的密钥.

 

公开:g    
Alice   Bob
选取a[1,p2],计算ga=ga    
  ga  
    选取b[1,p2],计算gb=gb
  gb  
计算(gb)a   计算(ga)b

该密钥交换协议在可窃听信道上是安全的,虽然p,g是公开的,但即使窃听者监听了ga,gb,要以此还原秘密值a,b或者求解(gb)amodp意味着需要计算离散对数,这在计算复杂度上是不可行的.

但该协议在可篡改信道上是不安全的,因为会面临中间人攻击的威胁.

针对Diffie-Hellman密钥交换协议的中间人攻击:

  1. Alice在[1,p2]={1,2,,p2}中随机选择a,计算ga=gamodp,将ga发送给Bob
  2. 但发送的中途被Eve截获,Eve则选择了一个e1[1,p2],并将ga=ge1假装成Alice发送的信息,转发给Bob
  3. Bob也在[1,p2]={1,2,,p2}中随机选择b,计算gb=gbmodp,将gb发送给Alice
  4. 同样被Eve截获,Eve选择了一个e2[1,p2],将gb=ge2假装成Bob发送的信息,转发给Alice
  5. 收到"Alice"信息的Bob计算(ga)b=ge1b
  6. 收到"Bob"信息的Alice计算(gb)a=ge2a
  7. Eve同样能够计算出ge1b,ge2a,用于分别和Bob和Alice进行通信的密钥,此后,Eve便可在两人之间充当"中间人",随意监听,拦截,篡改消息
公开:g        
Alice   Eve   Bob
选取a[1,p2],计算ga=ga        
  ga      
    选取e1[1,p2]    
      ga=ge1  
        选取b[1,p2],计算gb=gb
      gb  
    选取e2[1,p2]    
  gb=ge2      
计算(ga)b=ge1b       计算(gb)a=ge2a

注意,Eve并不知道a,b分别是多少,但这不影响它对此协议的攻击,它只需要在可篡改信道上篡改消息即可

要避免这种攻击,就需要引入数字签名与证书

端-端协议:

  1. 该算法需要有一个可信中心Torrent,Torrent拥有:
    1. 自己的私钥skT,用于签名算法SignT()
    2. 公钥pkT,任何人都可用此公钥验证Torrent的签名的有效性
  2. Torrent若要为Alice背书,应当做如下几件事:
    1. 生成Alice的私钥skA,公钥pkA
    2. 使用自己的私钥skTpkA和Alice的ID签名:SignT(IDA,pkA)
    3. CertA=(IDA,pkA,SignT(IDA,pkA))作为证书,连同私钥skA,内置在Alice的系统中
  3. 同理,Torrent若要为Alice背书,应当做如下几件事:
    1. 生成Bob的私钥skB,公钥pkB
    2. 使用自己的私钥skTpkB和Bob的ID签名:SignT(IDB,pkB)
    3. CertB=(IDB,pkB,SignT(IDB,pkB))作为证书,连同私钥skB内置在Bob的系统中.
  4. 之后的过程就类似于Diffie-Hellman密钥交换协议了,Alice想要与Bob协商密钥,应当:
    1. [1,p2]={1,2,,p2}中随机选择a
    2. 计算ga=gamodp,
    3. ga发送给Bob
  5. Bob在收到Alice的信息后,做类似的事:
    1. [1,p2]={1,2,,p2}中随机选择b,
    2. 计算gb=gbmodp
    3. 除此以外,他还需要做额外的事,获得Alice的信任:
    4. 使用自己的私钥skBga,gb进行签名
    5. gb,SignB(ga,gb),连同和自己的证书CertB一同发送给Alice
  6. Alice要做如下的事确保对面的人是可信的:
    1. 使用pkT验证签名SignT(IDB,pkB)是否真的由skT签署 (若是,则说明Torrent认可pkB,skB签署的签名也是可信的)
    2. 使用pkB验证签名SignB(ga,gb)是否真的由skB签署 (若是,则说明skB的持有者真的拿到了自己的ga,发来的gb也是由它本人认可的)
    3. 至此,Alice相信了自己对面的人真的是Bob,也相信Bob正确地收到了自己的ga,接下来,他要做类似的事情获取Bob的信任:
    4. 使用自己的私钥skAga,gb进行签名
    5. SignA(ga,gb),连同和自己的证书CertA一同发送给Bob
  7. Bob也要做如下的事确保对面是可信的:
    1. 使用pkT验证签名SignT(IDA,pka)是否真的由skT签署
    2. 使用pkA验证签名SignA(ga,gb)是否真的由skA签署
  8. 做完这些后,Alice和Bob互相确认了对方的身份,接下来,他们只要分别计算(gb)a,(ga)b就可以作为双方通信的密钥了

如果中间人Eve在第4,5步之间截获了ga并将之篡改为gh发送给Bob的话,Bob只会对gh签名,得到SignB(gb,gh),Eve不持有skB,因此它无法伪造SignB(ga).

而Eve若尝试伪造证书,换用其他的密钥skH,则因为它不持有Torrent的私钥skT,因此无法伪造SignT(IDB,pkH)来谎称pkH属于Bob.

公开:g,pkT    
Alice   Bob
skA,CertA=(IDA,pkA,SignT(IDA,pkA))   skB,CertB=(IDB,pkB,SignT(IDB,pkB))
选取a[1,p2],计算ga=ga    
  ga  
    选取b[1,p2],计算gb=gb
    签名SignB(ga,gb)
  gb,SignB(ga,gb),CertB  
pkT验证SignT(IDB,pkB)    
pkB验证SignB(ga,gb)    
签名SignA(ga,gb)    
  SignA(ga,gb)  
    pkT验证SignT(IDA,pkA)
    pkA验证SignA(ga,gb)

Matsumoto-Takashima-Imai (MTI)密钥交换协议:

这是一种不需要通信双方计算签名的密钥交换协议,取而代之使用一对数x[1,p2],y=gxmodp,x由拥有者秘密保留,而y则公开

  1. Torrent为Alice的ID和公开指数yA=gxA签名,将CertA=(IDA,yA,SignT(IDA,yA))作为证书,连同私有指数xA内置在Alice的系统中
  2. Torrent为Bob的ID和公开指数yB=gxB签名,将CertB=(IDB,yB,SignT(IDB,yB))作为证书,连同私有指数xB内置在Bob的系统中
  3. Alice若要与Bob协商密钥,选择rA[1,p2],计算gA=grAmodp,将CertA=(IDA,yA,SignT(IDA,yA))gA发送给Bob.
  4. Bob选择rB[1,p2],计算gB=grBmodp,将CertB=(IDB,yB,SignT(IDB,yB))gB发送给Alice.
  5. Alice计算K=gBxAyBrAmodp
  6. Bob计算K=gAxByArBmodp

最终的共享密钥值K=grAxB+rBxA.

公开:g,pkT    
Alice   Bob
私有指数xA[1,p2],公开指数yB=gxA,证书CertA=(IDA,yA,SignT(IDA,yA))   私有指数xB[1,p2],公开指数yB=gxB,证书CertB=(IDB,yB,SignT(IDB,yB))
选择rA[1,p2],计算gA=grA    
  gA,CertA  
    选择rB[1,p2],计算gB=grB
  gB,CertB  
使用pkT验证SignT(IDB,yB)   使用pkT验证SignT(IDA,yA)
计算K=gBxAyBrA   计算K=gAxByArB

此时如果存在一个Eve,截获并篡改了信息,试图进行中间人攻击,则会出现这样的情况:

对MTI协议的中间人攻击:

  1. Alice将CertA=(IDA,yA,SignT(IDA,yA))gA=grA发送给Bob.
  2. Eve截获此信息,将gA=grA篡改为gA=gre1发送给Bob.(因为不知道Torrent的私钥,攻击者是没法对证书动手脚的)
  3. Bob将CertB=(IDB,yB,SignT(IDB,yB))gB=grB发送给Alice.
  4. Eve同样截获此信息,将gB=grB篡改为gB=gre2发送给Alice.
  5. Alice计算K=gBxAyBrA=grAxB+rHash1xAmodp
  6. Bob计算K=gAxByArB=grH2xB+rBxA
  7. 然而,Eve因为不知道秘密指数xA,xB,因此无法计算出K,K中的任何一个,从而无法充当"中间人"

ECQMV密钥交换:

(TODO)

自证明公钥的密钥交换:

该协议的特点是不需要证书,公钥中隐含了ID

步骤1:从可信中心获取自证明公钥

Alice   Torrrent   Bob
    取素数p1,q1,要求p=2p1+1,q=2q1+1也是素数    
    计算n=pq    
    取在Zn上阶为2p1q1g(即,使得等式gx=1modn成立的最小的x=2p1q1)    
    选取一个e[max(p,q),n],计算d=e1modn用于RSA加密    
    n,g,e公开    
选择xA[1,n1],计算yA=gxA       选择xB[1,n1],计算yB=gxB
  (xA,yA)   (xB,yB)  
    (首先需要验证提交的数据是否符合y=gx)计算pubA=(yAIDA)dmodn,pubB=(yBIDB)dmodn    
  pubA   pubB  

这样,当其他用户需要使用Alice的公钥时,只需计算(pubAe+IDA)modn,Bob同理

尽管pub的计算不需要x,但用户仍需要将x发送给Torrent,以向Torrent证明自己确实知道x(博主注:与Torrent通信的消息被截获了怎么办?可能的解决方案:买电脑时内置与Torrent通信的专用密钥)

步骤2:用户之间交换密钥

Alice   Bob
选择kA[1,n1],计算gA=gkA   选择kB[1,n1],计算gB=gkB
  gA,pubA,IDA  
  gB,pubB,IDB  
计算K=gBxA(pubBe+IDB)kA   计算K=gAxB(pubAe+IDA)kB

正确性:

(pubBe+IDB)=(((yBIDB)d)e)+IDB=(yBIDB)+IDBRSA解密运算=yB

K=gBxA(pubBe+IDB)kA=gBxAyBkA=(gkB)xA(gxB)kA=gkBxA+xBkA

Bob的计算过程同理.

对(弱化的)自证明公钥体系的攻击:

如果Torrent不要求用户提交x就颁发pub,则攻击者可用以下方式进行中间人攻击

为描述简便,以下示例中Eve只在会话中试图拦截Bob发送的消息

步骤1:伪造并冒领pub

Eve   Torrent
选取伪造的xA,计算yA=gxA    
计算yE=yAIDA+IDH    
  yA (Eve发送消息时就暴露了自己的IDH)
    计算pubE=(yEIDH)dmodn
  pubE  

步骤2:拦截篡改Alice与Bob的通信 

Alice   Eve   Bob
  pubA,gA 篡改,pubA=pubE,gA=gxA pubA,gA  
  pubB,gB   pubB,gB  
计算K=gBxA(pubBe+IDB)kA   计算K=gBxA(pubBe+IDB)kA   计算K=(gA)xB((pubA)e+IDA)kB

Bob计算出的密钥:

K=(gA)xB((pubA)e+IDA)kB=(gkA)xB(gxA)kB=gkAxB+xAkB

Eve计算出的密钥:

K=(gB)xA((pubB)e+IDB)kA=(gkB)xA(gxB)kA=gkAxB+xAkB

Eve可以用同样的手段让Alice也计算得出伪造的密钥,这个例子说明了,向Torrent提交秘密指数x对于该协议的安全是关键的.

基于身份的密钥协商:

在该类协议中,ID就是公钥,而私钥是由系统中的TA(trusted authority)通过私钥生成器(private key generator,PKG)生成的

双线性映射:

q为大素数,G1q阶的加法循环群,PG1是生成元,G2是与G1同阶的乘法循环群

(可以想象G1中的元素是椭圆曲线上的点)

将存在如下性质的函数e:G1×G1G2称为双线性映射

  1. 双线性性 Q1,Q2,R1,R2G1,e(Q1+Q2,R1+R2)=e(Q1,R1+R2)e(Q2,R1+R2)=e(Q1+Q2,R1)e(Q1+Q2,R2),Q,RG1,a,bZq,e(aQ,bR)=e(Q,R)ab
  2. 非退化性 e(P,P)1
  3. 计算有效性 Q,R,存在有效算法计算e(Q,R)

(博主注:一个构造双线性映射的可行思路是,若2^q-1是素数,则可令G_2=(\{1,2,4,\cdots,2^{q-1}\},* \mod (2^q-1) ),e(Q,R)=2^{QR} \mod q)

(常用的双线性配对方案应当参考SN标准,反正我是没看懂)

基于身份的非交互密钥分配:

q为大素数,G1是加法循环群,PG1是生成元,G2是与G1同阶的乘法循环群,e:G1×G1G2是双线性映射,Hash1:{0,1}G1是一个哈希函数,可将任意字符串映射至G1.

Alice,Bob的身份IDA,IDB以及身份的哈希值QA=Hash1(IDA),QB=Hash1(IDB)是公开的.

TA选取主密钥s[1,p1],计算SA=sQA,SB=sQB(博主注:G1是加法群,没有乘法的定义,这里的乘法是数乘,即sQA相加)分别分发给Alice,Bob

然后Alice计算KAB=e(SA,QB),Bob计算KAB=e(SB,QA)(实际上,这两个值均等于e(QA,QB)s)便得到了会话密钥.

问题:

  1. 会话密钥是静态的
  2. 必须提前在系统中注册

基于身份的双方密钥交换:

q为大素数,G1是加法循环群,PG1是生成元,G2是与G1同阶的乘法循环群,e:G1×G1G2是双线性映射,Hash1:{0,1}G1是一个哈希函数,可将任意字符串映射至G1.

Alice,Bob双方的身份IDA,IDB以及身份的哈希值QA=Hash1(IDA),QB=Hash1(IDB)是公开的

TA选取主密钥s[1,p1],计算SA=sQA,SB=sQB分别分发给Alice,Bob

当Alice和Bob要会话时,按如下步骤交换会话密钥:

Alice   Bob
选取a[1,p1],计算WA=aP WA  
  WB 选取b[1,p1],计算WB=bP
计算KA=e(SA,WB+aQB)   计算KB=e(WA+bQA,SB)

KA=e(SA,WB+aQB)=e(sQA,bQB+aQB)=e(QA,QB)s(a+b)

KB=e(WA+bQA,SB)=e(aQA+bQA,sQB)=e(QA,QB)s(a+b)

(博主注:将模q整数群作为G1用于该协议是不安全的,因为攻击者可以用快速幂计算QA1(modq),截获WA后,计算WAQA1就能得到a)

(而若G1是椭圆曲线上的群,那么已知QA,从WA=aQA中逆推a则需要求解椭圆曲线上的离散对数问题,这在计算上是不可行的)

三方密钥交换: 

Alice,Bob,Charlie三方为了会话要协商出一个相同的密钥

三方Diffie-Hellman密钥交换:

公开信息:模数p,g[1,p1]    
  Alice:选取a[1,p1]  
     
Charlie:选取c[1,p1]   Bob:选取b[1,p1]

 

  Alice  
gC=(gc)   gA=(ga)
Charlie gB=(gb) Bob

 

  Alice  
kC=(gB)c   kA=(gC)a
Charlie kB=(gA)b Bob

 

  Alice:计算k=(kC)a  
     
Charlie:计算k=(kB)c   Bob:计算k=(kA)b

很明显,容易遭到中间人攻击.

基于双线性配对的密钥交换:

公开信息:模数q,加法循环群G1,乘法循环群G2,生成元PG1,双线性映射e

  Alice:选择a[1,q1],计算aP  
     
Charlie::选择c[1,q1],计算cP   Bob::选择b[1,q1],计算bP

将生成的值直接广播即可.

  Alice  

cP

aP

 

aP

bP

Charlie

bP

cP

Bob

 

  Alice:k=e(bP,cP)a  
     
Charlie:k=e(aP,bP)c   Bob:k=e(aP,cP)b

显然,k=e(P,P)abc

该方案只需要一轮通信便可得到会话密钥.

但仍然无法抵抗中间人攻击.

多方密钥交换:

最简单的思路:n个参与者就使用n1轮Diffie-Hellman密钥交换.

Burmester-Desmedt多方密钥交换:

只需要两轮交互的密钥交换

公开信息:模数q,生成元g

  1. 对于每个用户Ui,选择xi,计算Zi=gxi并发送给上下家.
  2. 获取自己上家,下家的广播信息,计算Xi=(Zi+1Zi1)xi,并广播
  3. 计算K=Zi1nxiXin1Xi+1n2Xi+n2

即,将自己X值的n1次方,自己下家X值的n2次方......乘在一起,然后乘上自己上家的Z值的nxi次方,便得到了会话密钥K

以4个用户的密钥交换举例:

X1=(gx2gx4)x1

X2=(gx3gx1)x2

X3=(gx4gx2)x3

X4=(gx1gx3)x4

然后观察U1计算出的K

K=Z44x1X13X22X3=(gx4)4x1(gx2gx4)3x1(gx3gx1)2x2(gx4gx2)x3=g4x1x4g3x1x2g3x1x4g2x2x3g2x1x2gx3x4gx2x3=gx1x2+x2x3+x3x4+x4x1

还是没有考虑中间人攻击.

posted @   Isakovsky  阅读(317)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示