密文策略属性基加密(CP-ABE)
在之前的(KP-ABE)中,密文和属性相关联,私钥与访问策略相关联,可以决定能解密的密文,加密者无法控制谁能够访问他加密的数据。在密文策略属性基加密(CP-ABE)中正好与之相反,私钥与属性相关联,密文与访问结构相关联,能够决定拥有哪些属性的用户可以解密密文,这样设置,加密者就能够控制谁有权访问他加密的数据。这与传统的访问控制方法,基于角色的访问控制(RBAC)类似。在CP-ABE中,使用了一种新颖的私钥随机化技术来保证抗共谋性。使用新的两级随机掩蔽的技术。
在CP-ABE中,与密文相关联的访问结构也被构造为访问树。其中树的内部节点都是一个阈值门,由其子节点和阈值描述。如果![num_{x}](https://latex.codecogs.com/gif.latex?num_%7Bx%7D)是其子节点的个数,![k_{x}](https://latex.codecogs.com/gif.latex?k_%7Bx%7D)是其阈值,则![0< k_{x}\leq num_{x}](https://latex.codecogs.com/gif.latex?0%3C%20k_%7Bx%7D%5Cleq%20num_%7Bx%7D)。与门和或门都可以被构造成阈值门,当![k_{x}=1](https://latex.codecogs.com/gif.latex?k_%7Bx%7D%3D1)时,就是或门,当![k_{x}=num_{x}](https://latex.codecogs.com/gif.latex?k_%7Bx%7D%3Dnum_%7Bx%7D)时就是与门。叶子节点与属性相关联,由属性值和阈值![k_{x}=1](https://latex.codecogs.com/gif.latex?k_%7Bx%7D%3D1)描述。为了便于使用访问数,还定义了一些函数。parent(x)表示树中节点的父节点。att(x)表示与树中叶节点相关联的属性,只有x节点是叶节点时才定义该函数。对于节点的子节点来说,需要对子节点进行编号,index(x)返回子节点的索引值。
满足访问树。令![\tau](https://latex.codecogs.com/gif.latex?%5Ctau)为根为r的访问树,用![\tau _{x}](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7D)表示以节点x为根的![\tau](https://latex.codecogs.com/gif.latex?%5Ctau)的子树,因此![\tau](https://latex.codecogs.com/gif.latex?%5Ctau)与![\tau _{r}](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Br%7D)是一样的,如果一组属性![\gamma](https://latex.codecogs.com/gif.latex?%5Cgamma)满足访问树![\tau _{x}](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7D),我们将其表示为![\tau_{x} (\gamma )=1](https://latex.codecogs.com/gif.latex?%5Ctau_%7Bx%7D%20%28%5Cgamma%20%29%3D1),递归计算![\tau _{x}(\gamma )](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7D%28%5Cgamma%20%29)。如果x是非叶子节点,则计算节点x的子节点![x{}'](https://latex.codecogs.com/gif.latex?x%7B%7D%27)的值![\tau _{x{}'}(\gamma )](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7B%7D%27%7D%28%5Cgamma%20%29),当至少![k_{x}](https://latex.codecogs.com/gif.latex?k_%7Bx%7D)个子节点返回1时![\tau _{x}(\gamma )](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7D%28%5Cgamma%20%29)返回1。如果x是叶子节点,当且仅当![att(x)\in \gamma](https://latex.codecogs.com/gif.latex?att%28x%29%5Cin%20%5Cgamma)时![\tau _{x}(\gamma )](https://latex.codecogs.com/gif.latex?%5Ctau%20_%7Bx%7D%28%5Cgamma%20%29)返回1。
CP-ABE过程
G0是素数阶p的双线性群,g是G0的生成元。此外e:![G0\times G0\rightarrow G1](https://latex.codecogs.com/gif.latex?G0%5Ctimes%20G0%5Crightarrow%20G1)表示双线性映射。安全参数k将确定群的大小。同时为![i\in Z_{p}](https://latex.codecogs.com/gif.latex?i%5Cin%20Z_%7Bp%7D)和![Z_{p}](https://latex.codecogs.com/gif.latex?Z_%7Bp%7D)中元素的集合S定义拉格朗日系数:
![\Delta _{i,S}(x)=\prod_{j\in S,j\neq i}^{}\frac{x-j}{i-j}](https://latex.codecogs.com/gif.latex?%5CDelta%20_%7Bi%2CS%7D%28x%29%3D%5Cprod_%7Bj%5Cin%20S%2Cj%5Cneq%20i%7D%5E%7B%7D%5Cfrac%7Bx-j%7D%7Bi-j%7D)
另外使用一个哈希函数![H:\left \{ 0,1 \right \}^{*}\rightarrow G0](https://latex.codecogs.com/gif.latex?H%3A%5Cleft%20%5C%7B%200%2C1%20%5Cright%20%5C%7D%5E%7B*%7D%5Crightarrow%20G0),将其建模为随机预言机,功能会将任意描述为二进制字符串的属性映射到随机群元素。构造如下:
Setup:选择一个具有生成元g的素数阶p的双线性群G0。接下来选择两个随机指数,公钥公布如下:
![PK=G0,h=g^{\beta },f=g^{\frac{1}{\beta }},e(g,g)^{\alpha }](https://latex.codecogs.com/gif.latex?PK%3DG0%2Ch%3Dg%5E%7B%5Cbeta%20%7D%2Cf%3Dg%5E%7B%5Cfrac%7B1%7D%7B%5Cbeta%20%7D%7D%2Ce%28g%2Cg%29%5E%7B%5Calpha%20%7D)
主密钥MK为:,这里的f仅仅用来委托。
Encrypt(PK,M,):加密算法将在访问结构下加密消息M。首先为树中的每个节点选择一个多项式。(包括叶子节点),这些多项式从根节点R开始以一种自顶向下的方式选择。
对于树中的每个节点x,设置多项式![q_{x}](https://latex.codecogs.com/gif.latex?q_%7Bx%7D)的次数比节点阈值少一,也就是![d_{x}=k_{x}-1](https://latex.codecogs.com/gif.latex?d_%7Bx%7D%3Dk_%7Bx%7D-1)。首先,从根节点R开始,随机选择一个![s\in Z_{p}](https://latex.codecogs.com/gif.latex?s%5Cin%20Z_%7Bp%7D)并且设置![q_{R}(0)=s](https://latex.codecogs.com/gif.latex?q_%7BR%7D%280%29%3Ds),然后![d_{R}](https://latex.codecogs.com/gif.latex?d_%7BR%7D)次多项式![q_{R}](https://latex.codecogs.com/gif.latex?q_%7BR%7D)的其他点完全随机的选取。对于任意的其他节点x,设置![q_{x}(0)=q_{parent(x)}(index(x))](https://latex.codecogs.com/gif.latex?q_%7Bx%7D%280%29%3Dq_%7Bparent%28x%29%7D%28index%28x%29%29),其他点随机选择来定义![q_{x}](https://latex.codecogs.com/gif.latex?q_%7Bx%7D)。令Y为![\tau](https://latex.codecogs.com/gif.latex?%5Ctau)中叶子节点集合,然后通过给出的访问结构![\tau](https://latex.codecogs.com/gif.latex?%5Ctau)构造密文如下:
**KeyGen(MK,S):**密钥生成算法以一组属性S作为输入,并输出以该集合表示的密钥。算法首先选择一个随机,然后为每个属性选择随机,然后计算密钥为:
Delegate(SK,):委托算法接受一个密钥SK,用于一组属性S和令一组属性,其中。密钥的形式为,算法选择一个随机和,然后它创造一个新的密钥:
得到的密钥是集合的密钥。因为这个算法重新随机化了密钥,所以委托密钥等同于直接从权威机构得到一个。
**Decrypt(CT,SK):**解密过程是一个递归过程。我们首先定义一个递归算法DecryptNode(CT,SK,x),以密文,一个与一组属性关联的私钥SK和中的一个节点为输入。如果节点x为叶子节点,令i=att(x),定义如下:如果,则
DecryptNode(CT,SK,x) =
![=\frac{e(g^{r}\cdot H(i)^{r_{i}},h^{q_{x}(0)})}{e(g^{r_{i}},H(i)^{q_{x}(0)})}](https://latex.codecogs.com/gif.latex?%3D%5Cfrac%7Be%28g%5E%7Br%7D%5Ccdot%20H%28i%29%5E%7Br_%7Bi%7D%7D%2Ch%5E%7Bq_%7Bx%7D%280%29%7D%29%7D%7Be%28g%5E%7Br_%7Bi%7D%7D%2CH%28i%29%5E%7Bq_%7Bx%7D%280%29%7D%29%7D)
![=e(g,g)^{rq_{x}(0)}](https://latex.codecogs.com/gif.latex?%3De%28g%2Cg%29%5E%7Brq_%7Bx%7D%280%29%7D)
如果,定义DecryptNode(CT,SK,x) =。
当x不是叶子节点时,DecryptNode(CT,SK,x) 算法过程如下:对于x的所有子节点z,调用DecryptNode(E,D,z)并保存输出为![F_{z}](https://latex.codecogs.com/gif.latex?F_%7Bz%7D),令![S_{x}](https://latex.codecogs.com/gif.latex?S_%7Bx%7D)为任意![k_{x}](https://latex.codecogs.com/gif.latex?k_%7Bx%7D)大小的子节点z的集合,使得![F_{z}\neq \perp](https://latex.codecogs.com/gif.latex?F_%7Bz%7D%5Cneq%20%5Cperp),如果这样的集合不存在,则节点不满足,函数返回![\perp](https://latex.codecogs.com/gif.latex?%5Cperp)。否则,计算如下:
![F_{x}=\prod_{z\in S_{x}}^{}F_{z}^{\Delta _{i,S{}'_{x}}(0)},where i=index(z),S{}'_{x}=\left \{ index(z):z\in S_{x} \right \}](https://latex.codecogs.com/gif.latex?F_%7Bx%7D%3D%5Cprod_%7Bz%5Cin%20S_%7Bx%7D%7D%5E%7B%7DF_%7Bz%7D%5E%7B%5CDelta%20_%7Bi%2CS%7B%7D%27_%7Bx%7D%7D%280%29%7D%2Cwhere%20i%3Dindex%28z%29%2CS%7B%7D%27_%7Bx%7D%3D%5Cleft%20%5C%7B%20index%28z%29%3Az%5Cin%20S_%7Bx%7D%20%5Cright%20%5C%7D)
![=\prod_{z\in S_{x}}^{}(e(g,g)^{r\cdot q_{z}(0)})^{\Delta _{i,S{}'_{x}}(0)}](https://latex.codecogs.com/gif.latex?%3D%5Cprod_%7Bz%5Cin%20S_%7Bx%7D%7D%5E%7B%7D%28e%28g%2Cg%29%5E%7Br%5Ccdot%20q_%7Bz%7D%280%29%7D%29%5E%7B%5CDelta%20_%7Bi%2CS%7B%7D%27_%7Bx%7D%7D%280%29%7D)
![=\prod_{z\in S_{x}}^{}(e(g,g)^{r\cdot q_{parent(z)}(index(z))})^{\Delta _{i,S{}'_{x}}(0)}](https://latex.codecogs.com/gif.latex?%3D%5Cprod_%7Bz%5Cin%20S_%7Bx%7D%7D%5E%7B%7D%28e%28g%2Cg%29%5E%7Br%5Ccdot%20q_%7Bparent%28z%29%7D%28index%28z%29%29%7D%29%5E%7B%5CDelta%20_%7Bi%2CS%7B%7D%27_%7Bx%7D%7D%280%29%7D)
![=\prod_{z\in S_{x}}^{}e(g,g)^{r\cdot q_{x}(i)\cdot \Delta _{i,S{}'_{x}}(0)}](https://latex.codecogs.com/gif.latex?%3D%5Cprod_%7Bz%5Cin%20S_%7Bx%7D%7D%5E%7B%7De%28g%2Cg%29%5E%7Br%5Ccdot%20q_%7Bx%7D%28i%29%5Ccdot%20%5CDelta%20_%7Bi%2CS%7B%7D%27_%7Bx%7D%7D%280%29%7D)
![=e(g,g)^{r\cdot q_{x}(0)}](https://latex.codecogs.com/gif.latex?%3De%28g%2Cg%29%5E%7Br%5Ccdot%20q_%7Bx%7D%280%29%7D)
返回结果,如果这个树被集合S满足,设置A=DecryptNode(CT,SK,r)=。这个算法通过计算,这样就得到了明文信息。
参考文献
BETHENCOURT J, SAHAI A, WATERS B. Ciphertext-policy attribute-based encryption[C]
版权归原作者 lntuzgm 所有, 如有侵权,请联系我们删除。