简介
属性加密(Attribute Based Encryption, ABE)可以认为是一种泛化的基于身份加密。相较于需要接收者的公钥对消息进行加密的传统公私钥加密方案,基于身份的加密允许用户使用消息接收者的ID加密消息,基于属性的加密进一步允许用户基于消息接收者拥有的属性加密消息。使得只有某个属性约束(Policy)被满足时用户才能解密该消息。
这里“属性”是一个集合。例如,对于属性集合{A,B,C,D},发送者可以基于属性A∧B对消息进行加密,使拥有属性{A,C}或者{A}等的用户无法解密信息,而只有拥有属性Q使{A,B}∈Q的用户可以解密信息。
上面我们描述了一种将属性约束嵌入到密文中的加密方案,这种方案被称为Ciphertext-Policy ABE (CP-ABE)。
另一种加密方案是Key-Policy ABE (KP-ABE),在这种方案下,发送者基于一个属性集合对消息进行加密,属性约束被嵌入到用户的私钥中。例如,发送者基于集合{A,B}加密消息后,用户A∨C可以解密消息,但用户A∧C不能解密消息。
Fuzzy-Identity Based Encryption
Fuzzy IBE是最早提出属性加密的方案。在Fuzzy IBE方案中,用户的身份是一个属性的集合ω∈U,其中U是所有可能属性的集合。消息发送者可以使用任意的属性集合ω′∈U加密消息。对于给定的阈值d,当且仅当∣ω∩ω′∣≥d时,用户才能解密消息,即用户必须持有d个吻合的属性才能解密消息。
双线性对
对于素数阶的群G1,G2,双线性对e定义了一种映射G1×G1→G2,并且该映射具有如下性质:
双线性:对于所有的a,b,有e(ga,gb)=e(g,g)ab
非退化性:e(g,g)=1
其中g为G1的生成元。当G1为加法群,G2为乘法群时,双线性对还可以表示为e(ag,bg)=e(g,g)ab。
由于G1,G2的阶为素数,它们是循环群。对于任意的s,t∈G1,存在k1,k2使s=gk1,t=gk2。因此
e(a,st)=e(a,gk1+k2)=e(a,g)k1+k2=e(a,g)k1e(a,g)k2=e(a,gk1)e(a,gk2)=e(a,s)e(a,t) 我们可以看到,该结论与之前提到的双线性性质在循环群中是等价的。类似的,我们还有
e(st,a)=e(s,a)e(t,a) (换成除法同样适用)
e(a,b)=e(b,a)
Fuzzy IBE方案
Fuzzy IBE与传统IBE类似,都需要KGC的参与。该方案的组成部分如下:
KGC密钥生成:假设所有属性的集合为U,为了简单起见,取U为Zp∗中的前∣U∣个元素,即1,2,...,∣U∣。e:G1×G1→G2是一个定义在阶为素数p的群上的双线性对。
从Zp中随机取t1,...,t∣U∣,y作为主密钥保密存储
将T1=gt1,...,T∣U∣=gt∣U∣,Y=e(g,g)y作为公开参数公开
用户密钥生成:对于持有属性集合ω∈U的用户(假设∣ω∣≥d),KGC随机选取一个系数在Zp中的d−1阶多项式q使得q(0)=y。用户的私钥即为(Di)i∈ω,Di=gtiq(i)。(注意我们这里能直接使用q(i),i∈ω是因为密钥生成阶段作出的假设U⊂Zp∗)
加密:假设加密使用的属性集合为ω′,待加密消息M∈G2。
随机选取s∈Zp
计算E=(ω′,E′=MYs,{Ei=Tis}i∈ω′)作为密文
解密: 当且仅当∣ω′∩ω∣≥d时,我们可以解密消息。 取S=ω′∩ω,∣S∣=d,记Δi,S为拉格朗日插值中点(i,q(i))对应的系数,即
Δi,S(x)=j∈S,j=i∏xi−xjx−xj (上式中xi=i,xj=j) 将密文中的E′展开有:
E′=MYs=Me(g,g)ys 根据拉格朗日插值公式,我们有
y=q(0)=i∈S∑q(i)Δi,S(0) 因此
e(g,g)ys=e(g,g)∑i∈Sq(i)Δi,S(0)s=i∈S∏e(g,g)q(i)Δi,S(0)s=i∈S∏e(g,g)tiq(i)stiΔi,S(0)=i∈S∏e(gtiq(i),gsti)Δi,S(0)=i∈S∏e(Di,Ei)Δi,S(0)
因此消息M=E′/∏i∈Se(Di,Ei)Δi,S(0)
我们可以看到,在上述方案中,KGC的主密钥和公共参数的大小随着属性取值空间∣U∣的增大而线性增大。这无疑限制了其应用场景。因此下面我们将介绍一个改进的Fuzzy IBE方案。
更大的属性空间
论文作者提供了另一种方案,该方案允许将Zp∗作为其属性空间,但是加密使用的身份中的最大属性数量被限制为一个固定的值n。
在这个更大的属性空间下,用户可以使用任意的字符串作为其属性,然后通过一个可靠的哈希函数H:{0,1}∗→Zp∗将其映射到上述属性空间中。
该方案的组成部分如下:
KGC密钥生成:
选择g1=gy,g2∈G1。
从G1中随机选取t1,...,tn+1,定义N={1,...,n+1}以及函数T:
T(x)=g2xni=1∏n+1tiΔi,N(x) 这里T可以被看作某个n阶多项式g2xngh(x)的函数,其中h(i)=ki,gki=ti。
将y作为主密钥,g1,g2,t1,...,tn+1作为公开参数
密钥生成:对于拥有身份ω的用户
KGC随机选择一个d−1阶多项式q使得q(0)=y
用户私钥分为两部分,分别为{Di}i∈ω,Di=g2q(i)T(i)ri以及{di}i∈ω,di=gri。其中ri是从Zp中随机选取的。
加密:使用身份ω′加密消息M∈G2的过程如下:
随机选取s∈Zp
计算密文E=(ω′,E′=Me(g1,g2)s,E′′=gs,{Ei=T(i)s}i∈ω)
解密:由于
e(g1,g2)s=e(gy,g2)s=e(gs,g2)y=e(E′′,g2)∑i∈Sq(i)Δi,S(0)=i∈S∏e(E′′,g2q(i))Δi,S(0)=i∈S∏(e(E′′,T(i)ri)e(E′′,Di))Δi,S(0)=i∈S∏(e(gri,T(i)s)e(E′′,Di))Δi,S(0)=i∈S∏(e(di,Ei)e(E′′,Di))Δi,S(0) 我们可以得到M=E′/∏i∈S(e(di,Ei)e(E′′,Di))Δi,S(0)=E′∏i∈S(e(E′′,Di)e(di,Ei))Δi,S(0)
TODO: 这是怎么构造出来的?
参考资料