密码协议学习笔记(5):高级签名协议

(回顾:当待签名的数据无法参与签名算法的运算时,可以对其哈希值进行签名.)

盲签名:

盲签名的使用场景举例:

投票人需要让选举委员会为自己的选票背书,但又不愿向委员会透露自己到底向哪位候选人投票(防止被委员会或其他人打击报复)

用户User提供信息,私钥持有者Signer在不知道信息是什么的情况下进行签名.

一个盲签名方案一般由以下三个算法构成:

  1. Setup:概率多项式时间算法,输出系统参数params和签名人的公私密钥对(pk,sk)
  2. Sign:概率多项式时间交互协议,公共输入:公钥pk,签名人秘密输入:私钥sk,用户秘密输入:信息m,停止后得到签名s
  3. Verify:输入:系统参数params,签名人公钥pk,消息签名对(m,s)输出为1或0,代表签名有效或无效

盲签名的安全需求:

  1. 正确性:Sign进行的签名,Verify一定输出签名有效
  2. 不可伪造:不知道私钥sk则无法生成有效签名
  3. 盲性:除请求签名的User,任何人都无法将Sign过程中的会话信息和最终的签名联系起来.

基本设计思路:

  1. 盲化:User用消息m计算出m
  2. 签名:Signer对m签名得到s
  3. 去盲:User通过s计算出签名s

基于RSA问题的盲签名:

Setup:

Signer选定大质数p,q,n=pq,d[max(p,q),n1],e=d1mod(p1)(q1)

(p,q,d)作为私钥保留,(n,e)作为公钥公开.

Sign:

User   Signer

选择一个随机数k[max(p,q)+1,n1]

使用扩展欧几里得算法计算出k1modn

对于待签名的信息m,计算m=kemmodn进行盲化

m  
  s 计算s=(m)dmodn
计算s=k1smodn进行去盲    

Verify:

判断se=mmodn是否成立,若成立则签名有效,否则无效.

se=(sk1)e=((m)dk1)e=((kem)dk1)e=(kedk1md)e=(kk1md)e=mde=m(modn)

基于离散对数的盲签名:

(感觉书上的方案有点问题,先略过)

部分盲签名-基于双线性映射:

在盲签名协议中,被签名的消息完全由User控制,可能存在风险.为解决此问题,考虑允许Signer在签名中嵌入公共信息,这就是部分盲签名的概念.例如,将有效期作为电子货币的公共信息嵌入盲签名中.

回顾:双线性映射:

q为大素数,G1q阶的加法循环群(一般采用椭圆曲线上的群),PG1是生成元,G2是与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)

Setup:

取大素数q,q阶加法循环群G1,PG1为其生成元,G2q阶的乘法循环群,

双线性映射e:G1×G1G2

H:{0,1}[0,q1]是从任意字符串映射到数字的哈希函数

H:{0,1}G1是从任意字符串映射到加法群G1上的哈希函数

Signer选择x[1,q1]作为私钥sk=x

pk=xPG1作为公钥公开.

Sign:

User   Signer
 

双方约定公共信息c

 

选择随机数r[1,p1]

对于待签名的信息m

计算U=H1(m||c)+r(H(c)P+pk)

其中||代表比特串级联(字符串连接?)

U  
  V 计算V=U(H(c)+x)1modq
计算S=VrP,然后作为签名和消息(m,c)一同发布.    

Verify:

对于消息(m,c)和签名S,签名有效当且仅当下式成立:

e(H(c)P+pk,S)=e(P,H1(m||c))

证明:

首先考虑V,S的值

V=UH(c)+x=H1(m||c)+r(H(c)P+pk)H(c)+x=H1(m||c)H(c)+x+r(H(c)P+xP)H(c)+x=H1(m||c)H(c)+x+rP

S=VrP=H1(m||c)H(c)+x

然后观察等式左端:

e(H(c)P+pk,S)=e(P(H(c)+x),H1(m||c)(H(c)+x)1)=e(P,H1(m||c))(H(c)+x)(H(c)+x)1(双线性映射的双线性性)=e(P,H1(m||c))

安全性:

由于User在计算U时,使用了随机数r,因此Signer或其他人在信息论上就是无法获知m

如果User要伪造签名,则需要计算哈希碰撞,这在计算复杂性上是不可能的.

群签名:

一些成员(member)和管理员(manager)所组成的群(group),任何成员可代表整个群做出签名,验证者只能验证签名来自该群,而无法验证来自哪个成员.除非管理员打开(open)该签名,此时才可揭示签名者的身份.

注意,一般群签名体制都要求允许额外添加成员,有的还允许移除成员.

群签名体制的构成:

  1. 初始化:产生用于验证的群公钥,属于成员的成员公钥,成员私钥,用于打开签名的管理员私钥
  2. 成员加入:新用户和管理员交互,获得批准后加入群,并获得密钥,有的协议中还需要颁发证书.
  3. 签名:群成员对消息产生签名.
  4. 验证:验证者使用群公钥验证某签名是否由该群成员签署.
  5. 打开:群管理员利用管理员私钥揭示签名由群中哪个成员签署.

群签名体制的安全性要求:

  1. 正确性:成员产生的合法密钥验证必然有效
  2. 不可伪造性:非群成员无法产生合法签名
  3. 匿名性:除非群管理员打开签名,否则无法揭示签名由哪个群成员产生
  4. 无关联性(强匿名性):除非群管理员打开签名,否则无法揭示任意两个不同的群签名是否由同一人产生
  5. 可跟踪性:群管理员可以通过打开揭示签名来自哪个成员
  6. 防陷害性:包括群管理员在内的任何群成员都不能产生其他成员的合法签名
  7. 抗联合攻击(强防陷害性):即使多个成员和管理员勾结,也不能产生其他成员的合法签名

一个简单的群签名方案:

假设n个人构成一个群,GM为群管理员

初始化:

GM为每个人分发一份私钥表,这些密钥表互不相交.

GM计算出所有表中的私钥对应的公钥,并以随机顺序排列为一张公钥表,并公开.

签名:

某成员要进行签名时,在自己的私钥表中选择一个未使用过的私钥,使用此私钥对消息签名.

验证:

验证者用公钥表中的所有公钥依次尝试验证,只要有一个公钥验证通过,则认为该签名是在群中产生的.

打开:

因为GM知道公钥表中公钥与私钥的对应关系,因此可以根据验证签名有效的那个公钥属于谁,来揭示谁是签名者.

该方案的缺陷:

  1. 每个私钥只能使用一次,否则会丧失无关联性
  2. GM由于知道所有人的私钥表,因此可以通过生成签名陷害成员
  3. 验证时,需要对公钥表中所有公钥进行验证,开销太大.
  4. ...

另一个简单的群签名方案:

该方案的改进在于不让GM知道群成员的私钥,该方案依赖ElGamal签名算法.回顾:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com)

p为大素数,取Zp=([0,p1],+modp)上的一个生成元g,假设n个人构成了一个群.

初始化:

n个人分别产生自己的私钥si,并计算出公钥yi=gsi,发送给GM.

(博主注:如何防止私钥重复呢?注意,还要防止成员因为被告知私钥重复而推测出他人的私钥.博主想到的方案是,保证p>2πn2,这样,根据生日攻击理论,冲突的概率就会<1/2,一旦冲突要求所有人重新生成公私钥对)

GM为群成员随机生成ri[1,p]并发送给它们,另将pki=yiri以随机顺序排列为公钥表,并公开.(此过程就不涉及会话,冲突了直接换一个就好)

签名:

群成员将risimod(p1)作为私钥,使用ElGamal数字签名体系,对消息m进行签名.

具体而言,在[1,p2]中随机选取一个与p1互质的数k,计算modp1意义下的逆元k1,然后计算

R=gkmodp

S=(mrisiR)k1mod(p1)

(R,S)作为签名.

验证:

验证者使用公钥表中所有的公钥pki对签名(R,S)进行验证.

具体而言,是判断(pki)RRS=gm是否成立.

(pki)RRS=(yiri)gk(gk)(mrisigk)k1=((gsi)ri)gk(gk)(mrisigk)k1=grisigkgk(mrisigk)k1=grisigkgmrisigk=gm

打开:

GM由于持有ri,yi和成员的对应关系,因此可以揭示出签名的成员是谁.

该方案的优点:

  1. GM不持有私钥,因此无法再陷害成员
  2. 密钥表大小明显减小,验证开销降低

该方案的缺陷:

  1. 每个成员的私钥只有一个,多次签名会导致产生关联性,可通过定时颁发新的ri来解决,或者一次颁发多个ri(1),ri(2)
  2. 当新成员加入时,也需要重新为所有人颁发新的ri(否则攻击者就可以通过对比公钥表更新前后添加了谁,而区分出旧成员和新成员的签名)
  3. 密钥表大小是O(n),当成员较多时开销还是太大.

短的群签名方案:

该方案基于双线性对,存在两个管理者,一个被称为issuer,负责颁发私钥,另一个称为opener,负责打开群成员身份.

注意,这个方案中,由于私钥是由issuer产生后颁发的,因此要求issuer可信(不主动陷害成员),以及issuer和成员之间的信道安全.(而opener则无法伪造签名)

初始化:

p为大素数,Pp阶加法循环群G1的生成元,HG1中任意非单位元的点,G2p阶乘法循环群,e:G1×G1G2为双线性映射,Hash:{0,1}[0,p1]为哈希函数.

ξ1,ξ2,γ[1,p1]

U,VG1使得ξ1U=ξ2V=H

(用如下方式生成ξ1,ξ2,U,V,首先随机选取ξ1,U,然后随机生成整数w[1,p1],计算V=wU,ξ2=ξ1w1modp,即可避免计算离散对数问题.)

W=γP

gpk=(P,H,U,V,W)作为群公钥公开

gmsk=(ξ1,ξ2)作为opener的私钥,用于打开过程

γ作为issuer的私钥,用于颁发群成员私钥

加入:

假设系统中有n个群成员,issuer为第i个成员选取xi[1,p1],计算Ai=(γ+xi)1P,将(Ai,xi)作为私钥颁发给群成员,并将Ai交给opener,让opener知道其与群成员的对应关系,以便于执行打开操作.

签名:

给定群公钥gpk=(P,H,U,V,W),群成员的私钥(Ai,xi),待签名的消息m{0,1},成员i执行如下操作:

  1. 选择α,β[1,p1]
  2. 计算

    δ1=xiα

    δ2=xiβ

    T1=αU

    T2=βV

    T3=Ai+(α+β)H

  3. 选择rα,rβ,rx,rδ1,rδ2[1,p1]
  4. 计算

    R1=rαU

    R2=rβV

    R3=e(T3,P)rxe(H,W)rαrβe(H,P)rδ1rδ2

    R4=rxT1rδ1U

    R5=rxT2rδ2V

  5. 计算c=Hash(m,T1,T2,T3,R1,R2,R3,R4,R5)
  6. 计算

    sα=rα+cα

    sβ=rβ+cβ

    sx=rx+cxi

    sδ1=rδ1+cδ1

    sδ2=rδ2+cδ2

  7. (T1,T2,T3,c,sα,sβ,sx,sδ1,sδ2)作为对m产生的签名发布.

(博主注:如何计算G2上元素的负指数幂呢?)

验证:

当已知公钥gpk=(P,H,U,V,W),消息m和签名(T1,T2,T3,c,sα,sβ,sx,sδ1,sδ2)时,用以下方法验证签名的有效性:

 

  1. 计算

    R1=sαUcT1

    R2=sβVcT2

    R3=e(T3,P)sxe(H,W)sαsβe(H,P)sδ1sδ2(e(T3,W)e(P,P))c

    R4=sxT1sδ1U

    R5=sxT2sδ2V

  2. 接受签名,当且仅当c=Hash(m,T1,T2,T3,R1,R2,R3,R4,R5)

不考虑哈希碰撞的问题,签名被接受,当且仅当R1=R1,R2=R2,R3=R3,R4=R4,R5=R5

R1=sαUcT1=(rα+cα)UcαU=rαU=R1

R2=sβVcT2=(rβ+cβ)VcβV=rβV=R2

R3=e(T3,P)sxe(H,W)sαsβe(H,P)sδ1sδ2(e(T3,W)e(P,P))c=e(T3,P)rx+cxie(H,W)(rα+cα)(rβ+cβ)e(H,P)(rδ1+cδ1)(rδ2+cδ2)(e(T3,W)e(P,P))c=e(T3,P)rxe(H,W)rαrβe(H,P)rδ1rδ2e(T3,P)cxie(H,W)cαcβe(H,P)cδ1cδ2(e(T3,W)e(P,P))c=R3(e(T3,P)cxie(H,W)cαcβe(H,P)cδ1cδ2)(e(T3,W)e(P,P))c

观察第二项:

(e(T3,P)cxie(H,W)cαcβe(H,P)cδ1cδ2)=(e(T3,P)xie(H,W)αβe(H,P)δ1δ2)c

然后分别观察:

e(T3,P)xi=e(Ai+(α+β)H,P)xi=e(Ai,P)xie((α+β)H,P)xi(双线性性)=e(1γ+xiP,P)xie((α+β)H,P)xi=e(xiγ+xiP,P)e(H,P)(α+β)xi(同上)=e((1γγ+xi)P,P)e(H,P)(α+β)xi=e(P,P)e(γγ+xiP,P)e(H,P)(α+β)xi(同上)=e(P,P)e(1γ+xiP,γP)1e(H,P)(α+β)xi(同上)=e(P,P)e(Ai,W)1e(H,P)(α+β)xi

e(H,W)αβ=e((α+β)H,W)1(双线性性)

e(H,P)δ1δ2=e(H,P)xiαxiβ=e(H,P)xi(α+β)

将结论代回:

(e(T3,P)xie(H,W)αβe(H,P)δ1δ2)c=(e(P,P)e(Ai,W)1e(H,P)(α+β)xie((α+β)H,W)1e(H,P)xi(α+β))c=(e(P,P)e(Ai,W)1e((α+β)H,W)1)c=(e(P,P)e(Ai+(α+β)H,W)1)c(双线性性)=(e(P,P)e(T3,W)1)c

因此:

R3=R3(e(T3,P)cxie(H,W)cαcβe(H,P)cδ1cδ2)(e(T3,W)e(P,P))c=R3(e(P,P)e(T3,W)1)c(e(T3,W)e(P,P))c=R3

R4=sxT1sδ1U=(rx+cxi)αU(rδ1+cδ1)U=(rxαUrδ1U)+(cxiαUcδ1U)=(rxT1rδ1U)+(cxiαUcxiαU)=R4

R5=sxT2sδ2V=(rx+cxi)βV(rδ2+cδ2)V=(rxβVrδ2V)+(cxiβVcδ2V)=(rxT2rδ2V)+(cxiβVcxiβV)=R5

打开:

给定群公钥gpk=(P,H,U,V,W),消息m,待打开的签名(T1,T2,T3,c,sα,sβ,sx,sδ1,sδ2),以及用于打开的私钥gmsk=(ξ1,xi2),要揭露是哪个成员签下的签名,opener的工作如下:

  1. 验证该签名是群成员产生的有效签名.
  2. 计算A=T3(ξ1T1+ξ2T2)
  3. 检查A与哪个Ai相符,以此获知对应的成员

该方案的的公钥大小与成员数量无关,大大减小运算开销(使用了椭圆曲线上的"压缩存储技术")

虽然双线性映射计算开销较大,但e(H,W),e(H,P),e(P,P)均可预先计算一次并存储起来,作为群公钥的附加信息一同发布,群成员也可以自行计算e(Ai,P)并存储起来加快运算.

成员撤销:

在群签名体制中,有时(由于离职等原因)需要撤销成员的身份,不再认可该成员使用群的私钥做出的签名有效性.

在前文提到的两种"简单的群签名方案"中,管理员只需要将成员对应的公钥从公钥表中移除即可.

短的群签名方案的成员撤销操作:

在"短的群签名方案"中,可以通过发布"撤销成员列表"的方式撤销群成员.

成员i被撤销后,仍持有(Ai,xi),如果沿用原来的gpk=(P,H,U,V,W),它使用(Ai,xi)进行的签名仍会被误认为有效,为了更新gpk而组织剩余成员重新进行一次密钥体系的初始化是不现实的,因此可考虑使用如下方法更新公私钥:

撤销成员i时,

  1. issuer将撤销成员的私钥发布在撤销成员列表上RL=(Ai,xi)
  2. (任何人都可以)计算P=Ai W=PxiAi 然后将gpk=(P,H,U,V,W)作为新的群公钥发布,此时,仍满足W=PxiAi=Pxi1γ+xiP=γ1γ+xiP=γP
  3. 剩下的群成员以如下方式更新它们的私钥,以成员j为例,它的原私钥是(Aj,xj),它计算Aj=AjP1Ai更新自己的私钥.此时Aj=AjP1Ai=Pγ+xjP1Aj=Ajγ+xj=Pγ+xj(撤销列表发布时也可以预先计算出P1并作为附加信息发布)

这样做的好处是,当成员被撤销时,不需要所有成员在线,只需要当它们上线的时候,检查撤销列表的末尾,更新自己的私钥即可.

环签名:

在古代,大臣们向皇上进谏,但由于忠言逆耳,皇帝如果不满意直谏,就会发威将带头进谏的人杀掉。于是大臣们想了一个办法,在奏折上画个圈圈,每个赞同提议的大臣们在圆圈外围署名,这样一来,一荣俱荣,一损俱损,皇上无法从名字上来识别出谁是带头者,从而大臣们就保全了自己。

密码学中的环签名则考虑这样的场合:某个国家的内阁成员他知道一条关于首相的丑闻,并想将这个丑闻泄露给报刊记者。自然不能对这个丑闻使用普通数字签名,因为这样会暴露自己的身份。也不能随便让一个平民百姓去告诉记者,因为这样的检举不具有可信性。 此时,可以选择所有内阁成员,连同自己一起构成一个环,然后使用环签名体制,对该丑闻产生环签名,将产生的消息签名对发送给记者。记者接到后执行环签名验证算法,之后可以确信这个消息是由内阁中的某个成员泄露,从而具有很大的可信性;但同时记者无法获知检举人的身份.

安全性需求:

  1. 正确性(consistency):环内任意成员进行的签名都能被验证有效
  2. 匿名性(anonymity):任一验证者无法识别真正的签名人
  3. 不可伪造性(unforgeability):不在环中的成员无法生成有效签名
  4. 可链接性(linkabilily):(部分环签名提供这种性质)可以确定两个签名是否是同一人产生的(但仍然无法确认此人身份)(例如,要向某公司中所有员工匿名收集问卷,但每人最多允许提交一份)

不具有可链接性的环签名:

该体系基于双线性映射构造.

q为大素数,G1q阶加法循环群,P为其生成元,G2为同阶的乘法循环群,双线性映射e:G1×G1G2,哈希函数Hash:{0,1}G1.

设环中有n个用户{U1,U2,},私钥为xi[1,q1],公钥为Yi=xiP

环签名生成算法(ring-sign):

设成员k要对消息m进行环签名

  1. 计算H=Hash(m)
  2. 选择随机数a1,,ak1,ak+1,,an[1,q1]
  3. 计算σi=aiP(i[1,k1][k+1,n])
  4. 计算σk=1xk(HΣj=1,,k1,k+1,,n(ajYj))
  5. 输出(σ1,,σk1,σk,σk+1,,σn)

环签名验证算法(ring-verify):

给定环{U1,,Un},消息m和对该消息的签名(σ1,,σk1,σk,σk+1,,σn),验证者首先计算H=Hash(m),然后判断:

e(H,P)=Πi=1ne(σi,Yi)

若成立,则认为签名有效.

实际上:

Πi=1ne(σi,Yi)=Πi=1ne(σi,xiP)=Πi=1ne(xiσi,P)(双线性性)=e(Σi=1n(xiσi),P)(同上)

注意,

xkσk=HΣj=1,,k1,k+1,,n(ajYj)
而对于ik
xiσi=xiaiP=aiYi

因此,

Σi=1n(xiσi)=xkσk+Σi=1,,k1,k+1,,n(xiσi)=HΣj=1,,k1,k+1,,n(ajYj)+Σj=1,,k1,k+1,,n(ajYj)=H

代回原式,

Πi=1ne(σi,Yi)=e(Σi=1n(xiσi),P)=e(H,P)

需要说明的是,(σ1,,σk1,σk,σk+1,,σn)在验证者的视角下都是完全随机的,因此它无法判断出哪个里面包含了哈希值H的信息,也就无法得知谁是签名者.

具有可链接性的环签名:

该体系基于离散对数问题构造.

q为大素数,Gq阶循环群,哈希函数Hash1:{0,1}[0,q1],Hash2:{0,1}G.

设环中有n个用户{U1,U2,},私钥为xi[1,q1],公钥为yi=gxi

环签名生成算法(ring-sign):

设成员k要对消息m进行环签名

  1. 计算h=Hash2(y1,y2,,yn),t=hxk
  2. 选择随机数r,s1,,sk1,sk+1,,sn,c1,,ck1,ck+1,,cn[0,q1]
  3. 对于i=1,2,,k1,k+1,,n,计算ui=gsiyici vi=hsitci
  4. 计算uk=gr vk=hr
  5. 计算ck=Hash1(m,t,u1,,un,v1,,vn)Σi=1,,k1,k+1,,nci sk=rckxk
  6. (t,s1,,sn,c1,,cn)作为签名输出.

环签名验证算法(ring-verify):

给定消息m,签名(t,s1,,sn,c1,,cn),公钥y1,,yn,验证者计算

h=Hash2(y1,,yn)

ui=gsiyici

vi=hsitci 

然后检查如下等式是否成立:

Σi=1nci=Hash1(m,t,u1,,un,v1,,vn)

如果成立,则接受签名.

显然,若不考虑哈希碰撞的话,当且仅当uk=ukvk=vk时签名有效

观察

uk=gskykck=grckxkykck=gr(gxk)ckykck=gr(yk)ckykck=gr=uk

vk=hsktck=hrckxktck=hr(hxk)cktck=hr(t)cktck=hr=vk

环签名链接算法(link):

给定签名(t,s1,,sn,c1,,cn),(t,s1,,sn,c1,,cn),要检验是否为环上同一人签署,先验证二者是否是合法签名,然后判断是否有t=t,若相等,由于t=hxk,则说明两个签名为环上的同一个人所签署.

当环内成员试图陷害环内其他成员k时,由于即使是环内成员,因为不知道xk,也无法构造出t=hxk

而当环内成员只是试图隐藏自己的身份,不去管到底嫁祸给了谁时,它尝试截获其他场合获得的某个过期的t用在自己伪造的签名中,然而,由于不知道这个t对应的xk,它也无法构造出合法的sk=rckxk使得签名成立.

基于身份的数字签名(Identity Based Signature, IBS):

(回顾:基于身份的密钥分配密码协议学习笔记(2):密钥交换协议 - Isakovsky - 博客园 (cnblogs.com))

将用户的公开身份信息(电子邮件,身份证号)等作为公钥(或将其哈希值作为公钥)私钥则通过可信第三方由密钥生成器(Private Key Generator, PKG)生成.并通过安全信道发送给用户.

IBS的构成:

常用的IBS体系由以下四个算法构成:

初始化(Setup):

PKG生成系统的主密钥和参数param,将参数公开发布,主密钥s秘密保存

私钥提取(Extract):

PKG获得用户身份信息ID{0,1}后,利用自己的主密钥s和系统参数,计算出ID对应的私钥dID,然后通过安全信道发送给用户.

签名(Sign):

用户使用系统参数param,自己的私钥dID,待签名的消息m,输出签名σ=Sign(param,dID,m)

验证(Verify):

验证者使用系统参数param,签名者的身份(公钥)ID,消息签名对(m,σ),计算Verify(param,ID,m,σ)判断签名是否有效.

安全性需求:

一般地,说数字签名体制是安全的,是指它具有在适应性选择消息攻击下的不可伪造性.

说一个基于身份的数字签名体制是安全的,是指它具有在适应性选择消息和选择身份攻击下的不可伪造性.

更严格地,可以使用下面的形式化定义:

设IBS=(Setup,Extract,Sign,Verify)是一个基于身份的数字签名体系,防御者Charlie和攻击者Alice以交互的方式进行如下的博弈:

Charlie   Alice
运行Setup算法,生成系统参数param和主密钥s param  
  ID1 任意选择身份信息ID1并提交
生成dID1并返回 dID1  
  ID2 任意选择身份信息ID2并提交
生成dID2并返回 dID2

 

 

 

  (ID,m,σ)

最后,生成一个三元组(ID,m,σ),但ID不能是之前询问过的.

运行验证算法Verify(param,ID,m,σ)

若验证的结果是签名有效,则称Alice赢得了博弈.

 

 

如果攻击者无法在多项式时间内以不可忽略的概率在上述博弈中获胜,则称IBS在适应性选择消息身份攻击下是不可伪造的.

使用双线性对技术的IBS:

Setup:

q为一大素数,G1q阶加法循环群,P为其的一个生成元,G2为同阶的乘法循环群,e:G1×G1G2为双线性映射

Hash1:{0,1}[0,q1]是输出结果为整数的哈希函数.

Hash2:{0,1}G1是输出结果为G1上元素的哈希函数.

PKG随机选择s[1,q1],令Ppub=sP

s作为主密钥秘密保存

param=(q,G1,G2,P,e,Hash1,Hash2,Ppub)作为系统参数公开.

Extract:

用户提交一个身份信息ID,PKG计算QID=Hash2(ID),dID=sQID,将dID作为私钥,在安全信道上发送给用户.而QID则可看作用户的公钥

Sign:

给定消息m,持有私钥dID的用户选取随机数r[1,q1],计算

U=rQID

h=Hash1(m,U)

V=(r+h)dID

最后输出σ=(U,V)作为签名.

Verify:

验证签名σ=(U,V)是否是身份信息为ID的用户对消息m产生的,验证者可计算

h=Hash1(m,U)

然后验证下列等式是否成立:

e(Ppub,U+hQID)=e(P,V)

若成立,则认为签名有效.

实际上:

e(Ppub,U+hQID)=e(sP,rQID+hQID)=e(sP,(r+h)QID)=e(P,(r+h)sQID)(双线性性)=e(P,(r+h)dID)=e(P,V)

不使用双线性对的IBS(基于RSA):

由于双线性对计算开销较大,因此一些不使用双线性对的技术也被提出了

(回顾:RSA签名体系:密码协议学习笔记(1.5):几种常用的非对称密码体系 - Isakovsky - 博客园 (cnblogs.com))

Setup:

PKG选择两个大素数p,q,计算N=pq,选择一个与ϕ(N)=(p1)(q1)互质的数e(实际上在[max(p,q)+1,ϕ(N)1]上任选就行),计算d=e1modϕ(N)

选择哈希函数Hash:{0,1}[0,n1]

(博主注:书中写的哈希函数值域是[0,ϕ(N)1],但博主认为为了防止泄露ϕ(N),值域应当为[0,n1])

param=(N,e,H)作为系统参数公开.

d作为主密钥秘密保留.

Extract:

用户发送ID,PKG计算gID=IDd,然后将gID通过安全信道发送给用户作为私钥

Sign:

对于消息m,持有签名gID的用户取随机数r[1,n1],然后计算

t=remodN

s=gIDrHash(t||m)

(t,s)作为签名发布.

Verify:

验证者计算下列等式是否成立:

se=IDtH(t||m)modn

成立则认为签名有效.

实际上:

se=(gIDrHash(t||m))e=gIDereHash(t||m)=(IDd)e(re)Hash(t||m)=IDtHash(t||m)(modn)

 

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