0


密文策略属性基加密(CP-ABE)

密文策略属性基加密(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。接下来选择两个随机指数\alpha ,\beta \in Z_{p},公钥公布如下:

                                         ![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为:(\beta ,g^{\alpha }),这里的f仅仅用来委托。

Encrypt(PK,M,\tau):加密算法将在访问结构\tau下加密消息M。首先为树\tau中的每个节点选择一个多项式q_{x}。(包括叶子节点),这些多项式从根节点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)构造密文如下:

CT=(\tau ,C\widetilde{}=Me(g,g)^{\alpha s},C=h^{s},\forall y\in Y:C_{y}=g^{q_{y}(0)},C{}'_{y}=H(att(y))^{q_{y}(0)})

**KeyGen(MK,S):**密钥生成算法以一组属性S作为输入,并输出以该集合表示的密钥。算法首先选择一个随机r\in Z_{p},然后为每个属性j\in S选择随机r_{j}\in Z_{p},然后计算密钥为:

SK=(D=g^{(\alpha +r)/\beta },\forall j\in S:D_{j}=g^{r}\cdot H(j)^{r_{j}},D{}'_{j}=g^{r_{j}})

Delegate(SK,S\widetilde{}):委托算法接受一个密钥SK,用于一组属性S和令一组属性S\widetilde{},其中S\widetilde{}\subseteq S。密钥的形式为SK=(D,\forall j\in S:D_{j},D{}'_{j}),算法选择一个随机r\widetilde{}r\widetilde{}_{k}\forall k\in S\widetilde{},然后它创造一个新的密钥:

\widetilde{SK}=(\widetilde{D}=Df^{\widetilde{r}},\forall k\in \widetilde{S}:\widetilde{D_{k}}=D_{k}g^{\widetilde{r}}H(k)^{\widetilde{r}k},\widetilde{D{}'_{k}}=D{}'_{k}g^{\widetilde{r}k})

得到的密钥\widetilde{SK}是集合\widetilde{S}的密钥。因为这个算法重新随机化了密钥,所以委托密钥等同于直接从权威机构得到一个。

**Decrypt(CT,SK):**解密过程是一个递归过程。我们首先定义一个递归算法DecryptNode(CT,SK,x),以密文CT=(\tau ,\widetilde{C},C,\forall y\in Y:C_{y},C{}'_{y}),一个与一组属性关联的私钥SK和\tau中的一个节点为输入。如果节点x为叶子节点,令i=att(x),定义如下:如果i\in S,则

DecryptNode(CT,SK,x) = \frac{e(D_{i},C_{x})}{e(D{}'_{i},C{}'_{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)

如果i\notin S,定义DecryptNode(CT,SK,x) =\perp

    当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)=e(g,g)^{rq_{R}(0)}=e(g,g)^{rs}。这个算法通过计算\widetilde{C}/(e(C,D)/A)=\widetilde{C}/(e(h^{s},g^{(\alpha +r)/\beta })/e(g,g)^{rs})=M,这样就得到了明文信息。

参考文献

BETHENCOURT J, SAHAI A, WATERS B. Ciphertext-policy attribute-based encryption[C]

标签: 安全 算法

本文转载自: https://blog.csdn.net/m0_52322997/article/details/125020044
版权归原作者 lntuzgm 所有, 如有侵权,请联系我们删除。

“密文策略属性基加密(CP-ABE)”的评论:

还没有评论