这个仓库主要是用来实现一些 ABE(attribute-based encryption) 方案。 因为个人时间和能力问题,整个仓库只是实现一些 ABE 方案的小 demo,但是,也有一些特别的地方,如我们的访问策略树和 LSSS 秘密分享方案与 ABE 方案的结合。
在我实现的 ABE 方案中,我使用了特殊形式的字符串来表示加密阶段使用的策略, 例如 ((A,B,C,2),(D,E,F,2),2)。我们可以把这个访问策略看成是一颗树,整个字符串代表是我们的根节点,子串就代表了根节点的孩子节点,孩子节点就可以作为一个子树并作为这个新子树的根节点,一直递归到叶子节点,即到一个没有孩子节点的位置上。其中,我们用圆括号代表一个非叶子节点,在这一对括号中,里面包含的圆括号的个数代表这个节点的孩子节点的个数,而最后的数字代表了这个节点的阈值,没有用圆括号括起来的就是我们的属性值,也就是树的叶子节点。例如前面举的例子,用这个思路还原出整个访问策略树结构的步骤如下:
((A,B,C,2),(D,E,F,2),2) | 步骤 1 | |
---|---|---|
(A,B,C,2), (D,E,F,2) | 步骤 2 | |
A,B,C,D,E,F | 步骤 3 |
在这个访问策略中,如果只有在根节点的两个子结点都满足的情况下,整个访问策略才是满足的。同时,要使根节点的两个子结点满足的话,那么左边一个节点至少要满足三个属性中的两个属性时才能保证这个节点满足策略,同样的道理对右边这个节点。因此,“A,B,D,E” 就是一个满足访问策略的属性集合,而 “A,D,E,F“ 就不满足访问策略。
访问策略树表示的思路来自于 Liu 等人在“Efficient Generation of Linear Secret Sharing Scheme Matrices from Threshold Access Trees“这篇文章中的工作。在这篇文章中,作者们实现了把访问策略变为一个秘密分享矩阵,进而使用这个秘密分享矩阵去获得每个属性对象所对应的秘密值。
具体关于访问策略树的代码实现,可以参考仓库中的 include/LSSSMatrix.h 和 source/LSSSMatrix.cpp 这两个文件。
在 Waters 2011年的论文 Ciphertext-Policy Attribute-Based Encryption:An Expressive, Efficient, and Provably Secure Realization 中使用了 LSSS 秘密分享方案设计了一个可证明安全 CPABE 方案。截至到现在 2020年9月30日,因为没有查以前是否有工作完成了用 LSSS 去实现 CPABE 方案,如果,已经存在这样的工作,那么大家就当作是一种复习。
详细的关于 LSSS (Linear secret sharing scheme) 大家可以参卡 Beimel 的名为 Secure Schemes for Secret Sharing and Key Distribution 的博士论文。我在这里主要解决的是:CPABE 方案在加密阶段使用了一个用 LSSS 矩阵 (从访问策略得来),来得到访问策略中每个属性所拥有的秘密值;而到了解密阶段时,在我看到的论文当中,所有的作者都是用一句"根据密文中 LSSS矩阵和每个属性获得的秘密值,可以在多项式时间内还原出最开始分享的秘密值。"来解释解密过程。但是,关于这个秘密值的还原的方法,作者并没有给出来。我在这里就是要找出这个秘密值还原的方法,并用代码去实现。
首先,我介绍还原秘密值的方法。在介绍方法时,我先给出一些方法中使用到的符号表示:
符号 | 解释 |
---|---|
$M$ |
|
$v$ | $v$ 代表秘密分享向量,用列向量表示 |
$m$ | $M$ 矩阵的行数 |
$n$ | $M$ 矩阵的列数 |
例如,我们有一个秘密分享矩阵 $M$ 为一个 $m$*$n$ 的矩阵:
$$
M=\left(\begin{matrix}a_{11}&a_{12}&\begin{matrix}\cdots&a_{1n}\\end{matrix}\\begin{matrix}a_{21}\\vdots\\end{matrix}&\begin{matrix}a_{22}\\vdots\\end{matrix}&\begin{matrix}\begin{matrix}\ldots\\ddots\\end{matrix}&\begin{matrix}a_{2n}\\vdots\\end{matrix}\\end{matrix}\a_{m1}&a_{m2}&\begin{matrix}\ldots&a_{mn}\\end{matrix}\\end{matrix}\right)
$$
和一个秘密分享向量 $v$ 为一个 $n$ 维的向量:
$$
v^T=\left(\begin{matrix}s&y_2&\begin{matrix}\ldots&y_n\\end{matrix}\\end{matrix}\right),
$$
其中,$s$ 代表我们需要分享的秘密值,而 $y_2,..., y_n $ 为 $n - 1$ 个随机值。这样,我们就可以得到 $m$ 个秘密值,分别属于 $m$ 个属性。注意,在我实现的方案中,我只考虑属性不重复的情况。即,我们也可以得到一个秘密值向量
具体的方案实现部分,读者可以参考 include/ElementInZrMatrix.h, include/ElementInZrVector.h, source/ElementInZrMatrix.cpp 和 source/ElementInZrVector.cpp这几个源码进行上面思路的具体实现。
在实现 ABE 加密算法过程时,您所需要的依赖库有 gmp 和由斯坦福大学的 Ben Lynn 等人实现的 PBC Library。具体如何安装请参考这两个依赖包的安装说明文档,需要注意的是,在我实现的方案中,我是用 C++ 语言取实现的 ABE 方案。因此,我安装的是 PBC 的 C 语言安装,如果你使用 Java 语言进行实现的话,我建议你使用 JPBC 这个 Java 库。
假设
-
双线性: 对任意的元素
$u,v \in \mathbb{G}$ 和任意的元素$a,b \in \mathbb{Z_p}$ , 我们有$e(u^a, v^b) = e(u,v)^ {ab}$ 成立。 -
非简化性:
$e(g,g) \not= 1$ - 这个双线性映射要是很容易计算,并且这个双线性映射满足对称性。
- 首先,需要生成整个系统所需要的使用的属性,包括属性的数量
$U$ 以及属性值; - 根据选定的安全参数,生成整个系统需要使用的配对代数结构及其参数;生成阶为
$p$ 的群$\mathbb{G}$ ,确定一个群$\mathbb{G}$ 上的一个生成元$g$ 。同时,为系统的$U$ 个属性分别分配一个$\mathbb{G}$ 上的元素:$ h_1, h_2, ..., h_{|U|} \in \mathbb{G}$。 - 选取两个随机元素:$\alpha, a \in \mathbb{Z_p}$。
根据上面的过程,Waters 的 CPABE 方案中的公钥为
-
在加密阶段,需要使用到系统初始化阶段生成的公共参数
$PK$ ,同时,需要一个用被加密的消息$M \in \mathbb{G_T}$ ; -
CPABE 加密方案的访问策略保存在密文中,因此,需要让加密方根据自己的需求去设定一个访问策略(在我的方案中,访问策略的形式在前面的内容已经给出);因为 Waters 的这个 CPABE 方案是用 LSSS 矩阵 来实现的,因此,如何把一个访问策略变成一个 LSSS 矩阵 的方案也在前面给出,这里我们就直接使用这个为
$m*n$ 的矩阵。其中$m$ 为访问策略中的属性数量(注意:在这个方案中,我们要求访问策略中的属性不能重复);$n$ 与发送方设定的访问策略有关系。同时,我们还需要一个映射函数$\rho$ ,它的功能就是把 LSSS 矩阵 的每一行与访问策略属性集中的某个属性进行关联。 -
为了让访问策略中的每个属性获得一个秘密分享值,根据我前面提到的 LSSS 的思想,我们需要个随机矩阵 $ v = (s, y_2, ..., y_n) \in \mathbb{Z_p^n}$;其中,$s$ 就是我们需要被进行分享的秘密值,其他
$n-1$ 个为随机值;因此,我们可以给这个$m$ 个属性分别获得对应的秘密值:$ i = 1 ... m$, 我们有$\lambda_i = v * M_i$ ,其中$M_i$ 为访问矩阵$M$ 的第$i$ 行。同时,加密方需要生成$m$ 个随机元素:$r_1, ... , r_m \in \mathbb{Z_p}$。 -
经过上面三个阶段以后,我们就可以计算密文: $$ C = \mathcal{M}*e(g,g)^{\alpha s} $$
$$ C^{\prime} = g^s $$
$$ (C_1 = g^{a\lambda_1}h_{\rho(1)}^{-r_1}, D_1 = g^{r_1}),..., (C_m = g^{a\lambda_m}h_{\rho(m)}^{-r_m}, D_m = g^{r_m}) $$
经过上面四个阶段,我们就可以得到加密阶段的密文:$C, C^\prime, (C_1,D_1),...,(C_m,D_m)$,同时,还有加密阶段使用的线性秘密分享矩阵
这个阶段主要完成,根据用户具有的属性集合(这个集合为系统所有属性集的子集),生成其对应的用户私钥,解密使用。
-
首先,需要系统的主密钥
$MSK$ 和用户的属性集合$S$ ; -
生成每个用户的密钥时,随机生成一个值
$t \in \mathbb{Z_p}$ ,同时,计算其对应的密钥: $$ K = g^\alpha g^{at} $$$$ L = g^t $$
$$ \forall x\in S, K_x= h_x^t $$
因此,每个用户对应的私钥为:$K,L, \forall x \in S: K_x$。
当有用户想要去访问发送方加密的明文时,接收方就需要对加密的密文进行解密,密文中含有的内容有:$C, C^\prime, (C_1,D_1),...,(C_m,D_m)$和秘密分享矩阵矩阵$M$ 和映射函数
-
为了还原出明文
$\mathcal{M}$ ,我们需要用密文中的访问策略和接收方用户的属性集合得到秘密值$s$ ; -
因为,在 Waters 的 CPABE 方案中,他仅仅是给出了可以在多项式时间内找到一个这个解向量 ${\omega_i \in \mathbb{Z_p}}{i \in I}$,使得 $\sum{i\in I}{\omega_i}*{\lambda_i} = s$成立,其中
$I={i:\rho(i) \in S}$ ,$S$ 为用户的属性集合;但是 Waters 而没有给出具体的求解方案,因此在前面的内容中,我给出了具体的求解思路,在这里我们就直接使用这些根据用户的属性集合求解出来的解用于解密; $$ e(C^\prime,K)/(\prod_{i\in I}(e(C_i,L)*e(D_i,K_{\rho(i)}))^{\omega_i})= e(g,g)^{\alpha s}*e(g,g)^{ast}/(\prod_{i \in I}e(g,g)^{at\lambda_i\omega_i})=e(g,g)^{\alpha s} $$$$ C/e(g,g)^{\alpha s} = \mathcal{M} $$
只要用户的属性集合满足密文中的访问策略,那么使用我们求解方法,一定就可以得到对应属性集合上的解,进而完成对密文的解密。如果,接收方的属性集合不满足访问策略的话,那么其接受到密文
目前,我所熟知的 IBE (Identity-based Encryption) 和 ABE (Attributes-based Encryption) 加密方案都可以算作是加密访问控制的方案。但是, IBE 与 ABE 又存在不同的地方。IBE 可以有传统公钥加密方案的特性,即它有公钥(即用户的身份为其公钥),而私钥是与公钥满足某种运算关系,如下图就是一个 IBE 加密方案的大致过程:
- 如果 Alice 想要给 Bob发送消息,那么 Alice 可以使用 Bob 的公钥($i$,身份即是用户的公钥)(例如:Bob 的邮箱 IP地址 MAC地址 身份证号等)对消息进行加密;
- 消息通过一个不可信的通道发送给了 Bob;
- Bob 用户可以根据自己的身份($i$),通过一个 Key Generation 算法获得其对应的私钥钥($kd$);
- 在 Bob 获得其私钥和密文以后,就可以根据自己的私钥对消息进行解密;
- 同样,Bob 也可以给 Alice 发送消息,只是在加密时,用的是 Alice 的身份作为其公钥,Alice 的解密过程与上面一致,也需要获得自己身份对应的私钥。
在这里为了更加具体,我给出一个关于 IBE 加密方案的具体实例,这是 Dan Boneh 等人在2001年首次提出的全安全的 IBE 方案,论文的名称为 Identity-based encryption from the weil pairing。
首先,Dan 的等人的这个方案是建立在 BDH (Bilinear Diffie-Hellman) 假设上的一个方案,在这篇文章中,作者们提出了两个方案,一个是简单版的,但是效率更高;另一个是完全版,更加安全,但是效率会底一些。这里我就只介绍一下这个简单版的方案,方案的具体过程如下:
系统初始化算法 (Setup) 。给定一个系统的安全参数
- 阶为
$q$ 的循环群$\mathbb{G_1}$ 和$\mathbb{G_2}$ ,以及一个双线性映射关系:$e : \mathbb{G_1} \times \mathbb{G_1} \rightarrow \mathbb{G_2}$; - 并且,选择一个
$\mathbb{G_1}$ 这个代数结构上的一个生成元$P$ ; - 选择一个随机元素 $s \in \mathbb{Z_q^}$,并且计算系统中的公钥 $P_{pub} = sP$;
- 选择两个加密哈希函数
$H_1$ 和$H_2$ ,其中,$H_1 : {0,1}^* \rightarrow \mathbb{G_1^*}$,而$H_2 : \mathbb{G_2} \rightarrow {0,1}^n$ ;
因此,这个阶段就生成了整个系统的参数:$param = <q, \mathbb{G_1}, \mathbb{ G_2}, e, n, P, P_{pub}, H_1, H_2>$,以及系统主私钥:$MSK = s$。
用户密钥生成算法 (Key Generation)。给定一个用户的身份
- 根据哈希函数
$H_1$ 将用户的身份映射到群$\mathbb{G_1}$ 上一元素:$Q_{ID} = H_1(ID)$; - 使用系统的主密钥 MSK 生成用户身份对应的私钥:$d_{ID} = s * Q_{ID}$。
加密算法 (Encryption)。给定一个消息
- 根据接收方的身份 ID,使用
$H_1$ 密码哈希函数,计算其对应到群$\mathbb{G_1}$ 上对应的元素:$Q_{ID} = H_1(ID) \in \mathbb{G_1^*}$; - 选择一个随机元素:$r \in \mathbb{Z_q^*}$;
- 计算对应的密文:$C = <rP, M \bigoplus H_2(g_{ID}^r)>$ where $g_{ID} = e(Q_{ID}, P_{pub}) \in \mathbb{G_2^}$
解密算法 (Decryption)。根据接受到的密文
- 密钥生成阶段:根据安全参数,生成系统需要使用的配对代数结果的各项参数,包括:阶为
$q$ 的循环群$\mathbb{G_1}$ 和$\mathbb{G_2}$ ,以及一个双线性映射关系:$e : \mathbb{G_1} \times \mathbb{G_1} \rightarrow \mathbb{G_2}$;以及,确定两个哈希函数$H_1 : {0,1}^* \rightarrow \mathbb{G_1^*}$ ;确定群$\mathbb{G_1}$ 上的生成元$P$ ; - 用户公/私钥对生成:和私钥 $ x \in \mathbb{Z_p^}$ 和对应的公钥$Q_{ID} = xP$;
- 签名阶段:对于消息
$m$ ,计算对消息$m$ 的签名,$W = x*H_1(m)$; - 验证阶段:当受到签名消息后,使用用户的公钥验证等式是否成立:$e(P,W) = e(Q_{ID},H_1(m))$;
可以从上面的两个例子来看,IBE 的加密和签名方案可以满足传统公钥加密中存在公/私钥对,但是对于 ABE 这中加密方案来讲。2005年 Sahai 和 Waters 在论文 Fuzzy Identity-Based Encryption 中提出 ABE 以来,它本身并没有传统公钥加密系统中的公/私钥对的概念,而是作为一种用特殊的加密技术用于访问控制场景中。例如,从 ABE 演变出的 KP-ABE 和 CP-ABE ,分别为密钥策略以及密文策略的属性基加密方案。自此,大家的研究就是对这两种方案进行改进研究,包括:实现对方案过程中使用的访问策略进行隐藏以保证用户的隐私;系统中使用的属性事关用户的隐私,如何保护这些属性信息;如何将这种加密访问策略方案用于数据的安全共享的应用场景;以及由 KP-ABE 演变的可搜索加密技术和多个属性授权方管理下的属性基加密方案等等(以上是我目前所看到过的)。
为了和其他公钥加密系统的方案做一个对比,我在这里简单的介绍一下 Sahai 和 Waters 关于 ABE 的整个过程。在这篇文章中, Sahai 等人的想法是我们用了一个集合的元素
系统初始化阶段
根据安全参数,生成阶为
同时,确定一个在
并且,定义了一个朗格朗日系数,$S$ 为元素的集合:
$$
\Delta_{i,S}(x)=\prod_{j\in S,j\not= i}\frac{x-j}{i-j}
$$
确定整个系统用于加密使用的元素及其个数,$\mathcal{U}$ 和
接着,生成整个系统的公钥参数: $$ T_1 = g^{t_1}, \dots, T_{|\mathcal{U}|}=g^{t_{|\mathcal{U}|}},Y=e(g,g)^y $$ 和系统主密钥为:$t_1, \dots, t_{|\mathcal{U}|} \in \mathbb{Z_p^*}, y$ 。
密钥生成阶段
给定一个用户的元素结合
紧接着生成这个集合下的私钥:$(D_i = g^{\frac{q(i)}{t_i}})_{i \in \omega}$
加密阶段
确定加密阶段的元素集合
随机选择一个元素
根据用户的元素集合
通过上面的 IBE 加密和签名与 Sahai 的 ABE 方案对比,我可以发现在 ABE 方案中,不存在所谓的公/私钥。其加解密过程使用的参数主要为建立在一个元素(属性)集合上,同时,在中间过程中规定了用户拥有了哪些元素(属性)集合才能对密文进行解密(这里的 ABE 主要是通过在密钥中建立了一个访问策略来实现,思路和 KP-ABE 是一致的)。
另外,与传统的公钥加密系统相比。传统的公钥加密系统中的密文长度是由算法来决定的,顶多不会超过两个或三个代数结构上的元素来表示;而到了 ABE 这种方案,密文的长度与方案使用的元素(属性)集合的大小成正比的,那么带来的结果就是:我们有一个消息用群
关于函数加密的内容,我看得不是很多,在这里简单介绍一函数加密的定义,详细的内容可以参考 Dan Boneh 的 2011 年的论文 Functional encryption: Definitions and challenges 。
函数加密方案主要包括四个多项式算法,并且需要一个定义在
-
Setup.
$\bf (pp, mk) \leftarrow setup(1^{\lambda})$ ,主要用来生成公钥/主秘钥对; -
Keygen.
$\bf sk \leftarrow keygen(mk,k)$ ,根据$k\in K$ 和系统的主秘钥来生成$k$ 对应的私钥; -
Encrypt.
$\bf c\leftarrow enc(pp,x)$ ,加密消息$x\in X$ ,获得密文; -
Decrypt.
$\bf y \leftarrow dec(sk,c)$ ,使用$sk$ 从密文$c$ 中计算$F(k,x)$ 。
在这里需要注意的是,这里的函数
在公钥加密技术被发明以前,要保证信息通信的双方能安全的通讯的方法就是,在双方之间形成一把都拥有的私钥,把这把钥匙来保证通讯的安全。这种方法拥有它自身的特性,可以满足一定场景的需求,但是对于大规模互联网应用场景而言,这种对称的加密方案存在其局限性。也就是在这样的背景下,30年前, Diffie 和 Hellman 提出了公钥加密的技术,这种加密技术的特点就是,通信双方不需要进行商量出共同的钥匙,就能进行安全的通信。
如今,公钥加密技术在Web通信(如HTTPS和SSH)、语音通信和存储系统中十分重要,且无处不在。然而,公钥加密技术又经过这么久的发展与研究,技术界一直以来根深蒂固的看法是:
- 访问加密的数据,“要么获得数据的全部,要么什么都获取不了”,即,要么可以对密文进行解密,要么也就只能获得明文的长度,其他的什么都获得不了;
- 加密的过程就是对数据进行编码,只有唯一的一个私钥才能解密;
这样的看法带来的一个可能问题是,如果我们想要加密一个数据,只有当解密方满足否中我们提前设计好的策略时,才能对其进行解密的话,使用已经存在的公钥加密技术存在的问题是:
- 我们如何去所有满足策略个体的公钥?
- 如果当数据已经被加密存储了,当新的用户加入到系统中或获得新的属性(凭证)时,如何保证其对数据访问?
- 如果我们只想让某些人,根据他们自身的属性访问部分加密数据的话,又该如何?
- 一个给定的用户是否应该被允许学习所有拥有特定证书的个人的身份?
因为,公钥加密技术本身的限制,在这篇文章中作者们倡议使用一个新的概念:函数加密 (Functional Encryption)。在这种加密技术中,解密密钥可以让用户去获得一个关于加密数据或者什么都没有的特殊函数。整个过程大致为:在这个加密技术中,存在一个可信的授权方,只有它能拥有一个叫做主秘钥的钥匙;当权威机构被给于一个关于函数
用符号来表示的话,如果
-
加密邮件中的垃圾邮件过滤 (Spam filtering on encrypted mail)
如果我们的邮件接收方想要一个邮件过滤机构对自己加密邮件中的垃圾邮件进行清除的话,他只需要使用自己的私钥
$sk$ 根据一个函数$f(x)$ 生成一个私钥$sk[f]$ 给于这个过滤机构;过滤器用$sk[f]$ 对加密的邮件进行解密,当有$D(sk[f],c) = f(x) =0$ 时,认为不是垃圾邮件,就可以推送给对应的用户;如果$f(x) = 1$ 则代表为垃圾邮件,就需要把这个邮件进行过滤掉; -
可以表达的访问控制 (Expressive Access Control )
用户在加密数据
$m$ 时,可以给数据一个访问策略$P$ (用来表达自己共享数据的方法)。于是,加密时就可以对$x= (P, m)$ 进行加密,而用户的私钥$sk[f]$ 会去检查用户的身份和属性是否满足这个访问策略,进而获得明文$m$ 。 -
挖掘大规模数据集
数据挖掘作为一门重要的数据处理技术,被应用于很多行业。但是,想要让人挖掘到数据背后价值的同时,却获取不了数据本身信息的话,函数加密技术就有了自己的长处。例如,医疗行业、金融行业、电子商务行业等。
在公钥加密方案中,一般包含了三个算法:Setup 、Encryption、Decryption 。而函数加密系统中,需要四个算法来完成,比公钥加密系统多了一个算法:KeyGen 。其中,在 Setup 阶段产生的私钥被称为主私钥
以下的几个例子,用函数加密的思想来解释身份基加密 (IBE) 和属性基加密 (ABE)。
Identity-based encryption
如果用函数加密的思路来介绍身份基加密方案的话,身份基加密可以被看作是一个等式测试函数的函数加密。$pk$ 和
Attributed-based encryption
在 ABE 中,加密方给出一个建立在属性集合上访问策略
总之来讲,函数加密技术与公钥加密技术,两者的关系是一种属于关系,公钥加密可以看成是函数加密的一种特殊形式。
就我自己现在看的内容来讲,更多的还是关于 ABE 方案中的 CP-ABE,且目前接触的方向为对访问策略和属性的隐藏以保护用户的隐私,策略隐藏有全策略隐藏和部分策略隐藏这两个方面。而访问策略的隐藏相关的技术,就我目前所接触到的,我觉得很有意思的一个方向,就是用布隆过滤器来实现对访问策略的隐藏。在这里,就介绍一篇 2017 年发表在 IEEE Internet of Things Journal 杂志上的一篇文章 “An Efficient and Fine-Grained Big Data Access Control Scheme with Privacy-Preserving Policy” ,在这里面作者使用了布隆过滤器来实现用 LSSS 矩阵表示访问策略的 CP-ABE 加密方案的策略隐藏。
关于布隆过滤器的知识,在这里就不多做介绍,有兴趣的可以去参考 Bloom Fileter 的介绍。
在这篇文章中的实现方案上,主要包括了四个算法:
系统初始化 (System Setup):
- 属性授权方根据安全参数,生成整个系统需要使用各项参数,包括:系统所有的属性、双线性配对代数结构;因为使用到了布隆过滤器,系统参数里面还需要包含:表示属性所需要的最大位长
$L_{att}$ 和表示 LSSS 矩阵行数的最大位长$L_{rownum}$ ,以及用$k$ 来表示在属性布隆过滤器 (ABF)中使用的哈希函数的数量,$L_{ABF}$ 代表属性布隆过滤器需要位数组的长度; - 属性授权方根据群
$\mathbb{G_1}$ 和阶$p$ 生产一下参数。生成元$g \in \mathbb{G_1}$ ;随机元素$\alpha, a \in \mathbb{Z_p^*}$ ;和$|\mathcal{U}|$ 个随机元素$h_1,\dots, h_U \in \mathbb{G_1}$ ;同时,还需要选取$k$ 个哈希函数$H_1(), H_2(),\dots,H_k()$ ,把输入映射到$[1,L_{ABF}]$ 这个空间上;
因此,系统的公钥为
密钥生成阶段 (Key Generation):
每个用户都需要在属性授权机构那里授权获得自己的属性结合
- 首先,随机选取一个元素
$t\in\mathbb{Z_p^*}$ ; - 随后,根据每个用户授权的属性集合获得对应的秘钥。$K = g^\alpha g^{at}$;
$L=g^t$ ;${K_x=h_x^t}_{x \in S}$。
因此,用户的私钥为
数据加密阶段 (Data Encrypiton):
在这篇文章中,作者使用的访问策略表达形式为 LSSS 矩阵,和 2011年 Waters 里面的方案是一模一样的。这里的
这个算法和前面介绍的 Waters 的那篇文章中加密过程一样,最终生成的密文信息为:
我在这里主要详细介绍一下第二个算法整个过程,因为在传统的 CP-ABE 中,访问策略和映射函数是要和密文一起发送给接受方,如此带来了用户的隐私问题。因此,在这篇文章中,作者移除了属性映射函数
传统的布隆过滤器只能用来判断一个属性是否存在于集合当中,而这里需要准确的知道这个属性是位于那个行号;同时,传统的布隆过滤器存在假样例(属性实际不存在与集合,但是判断却显示存在)的情况,因此不能直接使用传统的布隆过滤器。因此,在这里,作者使用了一个叫做 "garbled 布隆过滤器"来对属性进行准确定位。传统的布隆过滤器使用的是多个位的数组来保存元素的映射,而 ”garbled BF” 使用的是长度为
首先,根据访问矩阵中的行号已经对应的属性,我们可一个获得一个元素集合
把获得的元素集合
当我们继续属性布隆过滤器中添加元素
最终,加密阶段过程形成的密文信息为
数据解密阶段 (Data Decryption):$\bf (\mathbb{M},ABF,PK,SK,CT)\rightarrow m$
当用户接受到密文形式的数据以后,就可以根据自身所拥有的属性集合对密文进行解密,只有当用户的属性集合满足访问策略时,才能正确完成对密文的解密;相反,如果用户的属性集合不满足访问策略,则什么都获得不了。
在本方案中,因为加入了属性布隆过滤器来实现对映射函数的隐藏。等加密数据到了用户端时,他/她不清楚自己的属性对应秘密矩阵的哪一行,进而就不能准确的完成解密过程。因为在加密阶段把属性以及其对应的行号通过属性布隆过滤器进行了保存,到了解密阶段就可以通过属性的查找来发现当前属性是否位于访问策略中,并且能准确的找到位于那行。具体的过程,通过一下两个算法来实现:
在这里的
剩下的解密过程和前面 Waters 在 2011 年那篇一样,即可完成对密文的解析。通过上面的过程,我们可以发现,本文中的方案在 2011 年 Waters 的那篇文章中的方案很相似,不同的地方在于,本文使用一个被称为属性布隆过滤器的技术,实现对属性到对应行号映射函数的消除,以实现对访问策略的隐藏,保护用户的隐私。
通过上面介绍的关于用属性布隆过滤器实现对访问策略的隐藏,我心中就产生了一个疑问,那就是在布隆过滤器中使用的哈希函数是如何工作的;通过文章实验部分的介绍,作者使用的是一种被称为 Murmurhash 的哈希算法。关于 Murmurha 的具体实现方法,大家可以去参看 Austin Appleby 关于 Murmurhash 的源码实现与测试。
继续回到这篇文章的属性策略隐藏来看,虽然通过属性布隆过滤器 (garbled BF) 实现了对映射函数替代,在一定程度上实现了对访问策略的隐藏。但是,从整个方案过程来看,LSSS 矩阵是直接以明文的形式保存,而我们也知道 LSSS 矩阵是一种特殊的矩阵,加上用户自己的属性集合,在很大程度上可以还原出大致的访问策略,对用户隐私依旧形成影响。因此,有没有办法实现对 LSSS 矩阵的保护,以求得 100% 的策略隐藏,这是一个可以值得研究的思路。我想在自己的论文里面可以有对 LSSS 矩阵的隐藏能力,但是这将导致一个问题就是计算效率可能会降低,如何在隐私保护和计算效率之间形成一种折中,也是一个不错解决办法。
最近,也是在师兄的推荐下,看了一篇用到 区块链 技术加 CP-ABE 加密技术来实现可信访问控制的方案,这是一篇发表在 IEEE Transactions on Vehicular Technology 上,名为 TrustAccess: A Trustworthy Secure Ciphertext-Policy and Attribute Hiding Access Control Scheme Based on Blockchain。而这篇文章中关于 CP-ABE 方面的策略隐藏及其安全性证明部分都是来自于 2011 年 Lai 等人在 Fully secure cipertext-policy hiding CP-ABE 这篇文章中的工作,在这里我们先回顾一下 Lai 等人在 2011 年关于 CP-ABE 的工作内容。
这篇文章与我以前看到关于 CP-ABE 不同的第一个地方在于,使用的是合数阶上面的双向性映射群。具体关于合数阶双线性映射群的介绍请参考论文 Evaluating 2-dnf formulas on ciphertexts,在这里我做一个简单的关于合数阶双线性群映射的介绍:
根据安全参数
- 双线性。
$\forall g,h \in \mathbb{G},a,b\in \mathbb{Z}_N,e(g^a, h^b)=e(g,h)^{ab}$ ; - 非简化性。$\exists g\in \mathbb{G}$ 满足
$e(g,g)$ 的阶为$N$ 。
同时,要求这个双线性映射计算可以在有限时间完成。以上特性和一般的双线性映射一致,这里是合数阶。另外,不同的一个特点就是正交性。我们假设
同时,为了实现对密文访问策略的隐藏,这篇文章中使用了一个叫做 内积谓词加密 技术,而这个概念其实就是前面介绍的函数加密里面的一种特殊函数,即我们熟悉的内积操作。其实这篇文章中的内积谓词加密和函数加密的标准定义有些不同的地方,但是只要清楚:用户的属性集合作为一个向量,访问策略中属性集合作为一个向量,只有当解密方的属性集合向量与密文策略中的向量的内积为 0 时,才能完成对密文的解析,否则不能解密。
其中,任何一个合取/析取范式和属性集合都可以使用一个
这个访问策略通过多项式:
$$
p(x_1,x_2,x_3)\
=r(x_1-I_1)+(x_2-I_2)\cdot(x_3-I_3)\
=0\cdot x_1x_2x_3+0\cdot x_1x_2+0\cdot x_1x_3+1\cdot x_2x_3+r\cdot x_1\
+(-I_3)\cdot x_2+(-I_2)\cdot x_3+(I_2I_3-rI_1)
$$
其中,$r\in \mathbb{Z}_N$ 随机选择的,$I_1=H(Department:\ CIA),\ I_2=H(Position:\ Manager),\ I_3=H(Seniority:\ Senior)$,而哈希函数
而对于一个用户的属性集合为
其中,$I_1^\prime=H(Department:\ CIA),I_2^\prime=H(Position:\ Director),I_3^\prime=H(Seniority:\ Senior)$。于是,如果用户的属性集合满足访问策略
现在我们具体来看一下,Lai 等人关于带有隐藏密文策略的 CP-ABE 的具体实现方案。
在这个只能支持有限访问结构的 CP-ABE 方案中,对系统中的属性进行划分,即属性=属性值的形式。所有的属性有
用符号表示的话,全局属性可以用
- 通过给定安全参数,生成合数阶上的双线性配对映射代数结构:$\mathcal{G}(1^\lambda)\rightarrow(p,q,r,\mathbb{G},\mathbb{G}_T,e)$,其中,$\mathbb{G},\mathbb{G}_T$ 的阶为
$N=pqr$ ; - 同时,选取 $\mathbb{G}_p,\mathbb{G}r$ 上的生成元分别为 $g_p,g_r$,$a{i,j}\in \mathbb{Z}N,R{i,j}\in \mathbb{G}_r$,且
$1 \leq i \leq m, 1 \leq j \leq n$ ,即针对系统中的每个属性对应的每个属性值,都要分配一个随机值; - 最后,再随机的选取
$\omega \in \mathbb{Z}_N$ 和$R_0\in \mathbb{G}_r$;
因此,最后形成公钥:$PK=<A_0 = g_p\cdot R_0,{A_{i,j}=g_p^{a_{i,j}}\cdot R_{i,j}}{1\leq i \leq m,1 \leq j \leq n},g_r,Y=e(g_p,g_p)^\omega>$;主秘钥为:$MSK=<g_p,{a{i,j}}_{1\leq i \leq m,1 \leq j \leq n},\omega>$。
在这里的集合
- 首先,随机的选取
$m$ 个值$t_i \in \mathbb{Z}_N$ ,并且取$t=\sum _{i=1} ^ n t_i$ ; - 然后,就可以计算
$D_0=g_p^{\omega - t}$ 和${g_p^{t_i/a_{i,j_i}} }_{1 \leq i \leq m}$ ;
于是乎,我们就可以得到
确定访问策略
-
首先,算法随机的选取
$s\in \mathbb{Z}_N$ 和$R_0^\prime \in \mathbb{G}_r$ ; -
接着,选取 $s_{i,j}\in \mathbb{Z}N$ 和 $R{i,j}^\prime \in \mathbb{G}_r$;其中,$1 \leq i \leq m, 1\leq j \leq n$;
-
然后,就可以计算密文与密文策略:$C=m\cdot Y^s$,$C_0=A_0^s \cdot R_0^\prime$;而对于密文策略而言,这篇文章中却是对系统中的所有属性进行了参与运算,只是分是否位于访问策略中: $$ C_{i,j}=\left{ \begin{aligned} A_{i,j}^s\cdot R_{i,j}^\prime,\ \ if\ v_{i,j}\in W_i\ A_{i,j}^{s_{i,j}}\cdot R_{i,j}^\prime, \ \ otherwise \end{aligned} \right. $$
因此,最终的密文及密文策略为:$c=<C,C_0,{C_{i,j} }_{1 \leq i \leq m, 1\leq j \leq n}>$。
在这里,就需要根据用户的属性集合
TrustAccess: A Trustworthy Secure Ciphertext-Policy and Attribute Hiding Access Control Scheme Based on Blockchain
在前面的内容,我也提到了本文中的 CP-ABE 方面内容和前面讲的 Lai 在 2011 年的那篇工作一样,唯一不同的地方在于系统初始化阶段,减少了系统主秘钥参数,用一个参数 $a\in \mathbb{Z}N$ 去替换了 $a{i,j} \in \mathbb{Z}N $ 的作用,并且,用 $A_1$ 去替换了 $A{i,j}$,但是后面的秘钥生成、加密和解密过程就只需要这一个主秘钥参数
在这里,我主要介绍这篇文章中如何把带有策略隐藏的 CP-ABE 方案与区块链技术进行结合。因为,涉及到了区块链的知识,这是一个我不熟悉的领域。不过这篇文章中,更多是使用区块链去中心化思想,加上区块链中最为重要事务和智能合约这两个工具,给出了实现可信访问的四个事务和智能合约算法,而没有在以太坊上实现事务与智能合约的算法,但这也可以作为后续工作的方向,大家有兴趣的话,可以沿着这个思路做一做。关于区块链的知识,大家可以去网上进行搜索了解,这里给出一个以太坊 和智能合约编程语言 Solidity 的链接。
这篇文章除了使用区块链技术以实现可信的访问,为了保护用户属性的隐私,作者们还是用建立在 ElGamal 加密系统之上的乘法同态算法,而主要是在智能合约中实现用户属性向量与访问策略向量的同态乘,以保护用户侧的属性隐私。
整个 TrustAccess 的系统架构如下图:
在这个架构中步骤 1、步骤 7和步骤 8 和 Lai 的 CP-ABE 方案是一样的,在这里我们重点介绍步骤 2、步骤 3、步骤 4、步骤 5 和步骤 6,关于区块链事务与智能合约实现部分。现在,重点看一下本文中的四个过程:
Setup Phase
确定合数阶上配对运算的代数结构
随机选取
最终确定,公钥:$PK=<A_0 = g_p\cdot R_0,A_1=g_p^a\cdot R_1,g_r,Y=e(g,g)^\omega>$和主秘钥
根据这篇文章中构建的模型和内容介绍说,系统的初始化阶段是由数据拥有者 DO 来完成,意思就是说每个人要上传数据时,都要进行这个过程,而这些需要参与运算的参数也都由数据拥有者来保管,符合区块链去中心化特性,不需要一个中心化机构来集中式管理整个系统的参数。但是,从用户侧来看,只要自己生成了一次参数,可以用一段时间以后,更新自己的各项参数,以达到安全目的,消耗依旧是用户侧算力,也算是一种折中。
Encryption Phase
这里的访问策略
最终,可以获得加密阶段的密文和密文策略:$CT=<\vec{x},C,C_0,{C_{i,j} }_{1 \leq i \leq m, 1 \leq j \leq n}>$。
On-blockchain Phase
当数据拥有者 DO 完成对数据和策略的加密后,在本文中作者假设的场景是把数据保留在本地;然后,DO 根据算法 1,即生成密文和密文策略的存储事务:
算法 1:生成区块链上的存储事务 |
---|
Input: |
Output:$Tx_{storage}$ 区块链中的存储事务 |
1. |
2. |
3. |
4. |
5. |
在数据拥有者 DO 完成存储事务生成算法以后,它就会被广播到区块链的其他节点上,以便用于认证,主要是通过里面的密文校验码认证密文的完整性;用签名认证密文的合法性。验证过程,主要通过算法 2来实现。主要是通过比较前后的数字摘要和密文校验码是否相同,来验证存储事务的合法性。
算法 2:验证存储事务 |
---|
Input: $Tx_{storage} = <S,storeAddress,checkCode,sign>$;$BPK_{DO}$ 数据拥有者的公钥; |
Output:$Tx$ 与 |
1. |
2. |
3. 如果 |
4. |
5. 如果 |
6. |
7. |
一旦完成对存储事务的验证,这个事务经过拜占庭容错协议 就会被打包成块,保存到区块链中去。
如果存在数据用户想要访问这个被加密的数据时,为了保护用户的属性隐私,只需要在用户侧判断用户的属性集合是否满足访问策略,即,用我前面讲的内积谓词加密技术。如果,用户的属性向量
其中,$BPK_{DU}$ 为用户的公钥;$storeAddress$ 代表 DU 想要访问的密文地址;$E(\vec{v})$ 代表用户属性向量经过 ElGamal 加密系统产生的向量;$sign$ 代表 DU 对 Proof 的签名,
一旦,DU 完成了 Proof,就要产生一个验证过程,以确定当前用户是满足访问需求的,主要通过算法 3来完成。其中,在这个过程中使用了 ElGamal 加密方案的同态乘特性,以实现对用户属性的隐私保护。
算法 3:验证 DU 是否具有访问权限 |
---|
Input:$E(\vec{v})=(E(v_1),E(v_2),\dots,E(v_n))$ 用户的属性经过ElGamal加密;$\vec{x}=(x_1,x_2,\dots,x_n)$ 密文中表示向量形式的访问测了;$(\mathbb{G}_1,q_1,g_1,h)$ ElGamal 加密系统的参数;$r \in \mathbb{G}_1$ 随机元素; |
Output:用户访问权限的验证结果 |
1. |
2. |
3. |
4. |
5. 如果 |
6. |
7. |
一旦 DU 的 Proof 被验证为合法,那么就要产生一个访问事务,以记录 DU 的属性集合满足 DO 密文的访问策略,这个访问事务的创建过程用算法 4来完成。随后,就是把这个事务进行打包成块,并用一致性协议同步到其他区块链节点上。
算法 4:生成一个 DU 的访问事务 |
---|
Inpu: |
Output:$Tx_{access}$ 访问事务 |
1. 如果 Proof 合法,则 |
2. |
3. |
4. |
5. |
6. |
7. |
Access Phase
这个访问阶段主要包括两个算法。因为,通过前面的认证过程,DU 已经被授权可以解密访问 DO 的密文,于是通过:
- 随机选取
$m$ 个元素 $t_i \in \mathbb{Z}N$,并且,取 $t=\sum{t=1}^mt_i$; - 计算密钥:$D_0=g_p^{\omega-t},D_i=g_p^{t_i/a}$
获取到用户 DU 的秘钥
这里需要使用到用户 DU 的属性集合
最后在这里,对这篇文章做一个总结:
在这篇文章中,作者使用支持密文策略隐藏的 CP-ABE 方案和区块链技术,在保护策略隐私的同时,保护用户侧的属性因此,进而实现可信访问,即所有访问过程信息都通过区块链技术,以块形式保存到链上。这种用区块链技术来做访问控制的思想,具有创新性,可以在某个场景中具有重要应用价值,这个场景是什么的话。需要被访问的内容十分重要,但这个内容又不能被一个中心化机构来管理。
按照这篇文章的逻辑,被访问内容由其拥有者自己来管理,区块链只是对访问过程进行记录,作为后续的认证和追溯;同时,数据拥有者需要为访问自己数据的用户生成对应的秘钥(因为没有一个中心化的机构来管理嘛,就让他/她来做了),而当用户进行访问时,都已经产生经过认证的 Proof ,即已经确定当前用户已经具备访问的权利,这两个过程是否可以进行简化;另外,当访问的用户数量很大时,对数据拥有者来讲,计算开销以及通信代价很大,是否可以将加密后的数据保存至云服务中心,利用云的算力和通信带宽,可以提升整体效率;这篇文章中的细粒度访问策略只支持 AND 和 OR 这两种逻辑运算,是否可以提出支持
$(t,n)$ 阈值形式;关于区块链上的事务以及智能合约,是否可以用代码进行实现,也是一个值得研究的方向。
经过一段时间,在代码关于属性布隆过滤器的算法过程中,因为各种 bug 出现的原因,我发现出现的原因在于,选取的哈希函数个数和 Garbled BF 可以保存的二进制串个数会影响哈希函数映射位置的冲突率。为减少同一个哈希函数对映射空间 [1,n] 的冲突率,需要一定的理论证明来确定这两者之间的限制关系,以确定实际应用的选取范围。为了有一个理论上的支撑,我学习了 When private set intersection meets big data: An efficient and scalable protocol 这篇文章中关于 garbled Bloom Filter 的详细介绍。
对于一个正多项式
布隆过滤器的比特位数 | |
---|---|
集合 |
|
布隆过滤器需要进行哈希的元素集合 | |
使用布隆过滤器对集合 |
|
布隆过滤器第 |
|
集合 |
详细关于布隆过滤器的介绍可以参考前面的链接。
因为元素
对于给定布隆过滤器,其对应下标处设置为 1 的概率为
因为,出现假阳例的概率和
秘密分享,也就是和前面介绍的 LSSS 很相似,可以看成是一个
GBF 和一般的 BF 其实没有本质的区别,唯一的区别在于布隆过滤器使用比特位来反映当前元素是否在这数组中,而 GBF 则是用一个比特串来表示,不但能反映其元素是否在集合中,还能通过比特串保存一些额外的信息。在这里我主要介绍这篇文章中关于 GBF 的构建以及元素的查找。
算法一:$BuildGBF(S,n,m,k,H,\lambda)$ |
---|
Input: 集合 |
Outp: |
1. |
2. |
3. |
4. end |
5. for each |
6. |
7. for i=0 to k-1 do |
8. |
9. if |
10. if |
11. |
12. else |
13. |
14. |
15. end |
16. end |
17. end |
18. |
19. end |
20. **for |
21. if |
22. |
23. end |
24. end |
算法2:$QueryGBF(GBF_S,x,k,H)$ |
---|
Input: |
Output: |
1. |
2. for |
3. |
4. |
5. end |
6. if |
7. |
8. else |
9. |
10.end |
定理1:算法1至少有
$1-p^\prime \times (1+O(\frac{k}{p^\prime}\sqrt{\frac{\ln m - k\ln p^\prime}{m}}))$ 的概率成功,其中,$p^\prime =1-(1-1/m)^{k(n-1)}$。证明:当在算法 1 中的
$emptyPos = -1$ 时,算法才会失败。而这种情况是当我们添加元素到$GBF_S$ 的过程中,每个哈希函数映射的位置都被之前的元素所占据。因为,在这种情况下,至多已经有$n-1$ 个元素被添加到$GBF_S$ 中,所以,一个位置被占据的概率至多为$p^\prime =1-(1-1/m)^{k(n-1)}$ ;而$k$ 个哈希函数映射位置被占据的概率和布隆过滤器出现假阳例的概率一样,最大为$p^\prime \times (1+O(\frac{k}{p^\prime}\sqrt{\frac{\ln m - k\ln p^\prime}{m}}))$ ;进而,成功的概率为 1 减去出现假阳例的最大值,即可证明定理1。
根据上面两个算法构造的
定理2:对于
$GBF_S$ ,
$\forall \notin S,x\in S:Pr[(\bigoplus^{k-1}_{i=0}GBF_S[h_i(y)])=y]\leq \epsilon$ ,而$\epsilon$ 为上面介绍的出现最大假阳例的概率;
$y\notin S:Pr[(\bigoplus_{i=0}^{k-1}GBF_S[h_i(y)])=y]\leq2^{-\lambda}$ 。
总之就是,在合适的参数条件下,$GBF_S$ 不会出现假阴例和可以忽略不计的假阳例。
使用 Garbled Bloom Filter 实现对访问策略中属性与行号映射函数
算法一:Row Index Garbled Bloom Filter 行索引乱码布隆过滤器构建 |
---|
Input: |
Output: |
1. 初始化 |
2. |
3. |
4. end |
5. |
6. |
7. **for |
8. |
9. if |
10. **if |
11. |
12. else |
13. |
14. |
15. |
16. else |
17. |
18. |
19. end |
20. end |
21. for |
22. if |
23. |
24. |
25. end |
26. **return |
通过上述算法一,可以构建一个 LSSS 矩阵行索引的乱码布隆过滤器,其行索引由映射函数
算法二:Row Index Query 行索引查找 |
---|
Input: |
Output: |
1. |
2. for |
3. |
4. end |
5. return |
具有分布式账本特性的区块链技术,可以用来记录访问过程的记录账本,以实现对访问过程的可追溯性。因此,分别设计了密文数据的存储事务和访问事务算法,以及对应事务的验证算法。
算法一:生成一个存储事务;$Tx_{storage}$ |
---|
Input: |
Output: |
1. |
2. |
3. |
4. |
5. **return |
算法一的过程,主要是通过加密方的私钥对密文数据的摘要进行签名,进而生成一个存储事务,以便于存储在区块中。为了使整个链上块中的事务唯一,每个节点都需要对存储事务进行验证,以确定此地址存储的密文是该用户的。因此,给出了算法二,存储事务的验证算法。
算法二:验证存储事务 |
---|
Input: |
**Output:**The validation of |
1. |
2. |
3. if |
4. return |
5. else |
6. return |
算法二作为算法一的验证过程,主要用于事务广播到链上其他节点时,去验证广播过来的事务是否合法。只有当前节点的所有事务都是合法以后,才能通过一致性协议把事务打包成块,存入链上。待有用户需要对加密数据进行访问时,需要通过算法三的访问事务,来记录其访问过程。
算法三:generate access transaction 生成访问事务 |
---|
Input: |
Output: |
1. |
2. if |
3. |
4. |
5. |
6. return |
7. else |
8. **return |
算法三,首先对解密方下载的数据进行合法性验证,主要通过密文的数字摘要与下载数据计算后的摘要进行对比。只要密文数据的合法性得到验证以后,才能生成访问事务,并返回。为了使存储事务保存到区块中,需要对生成的访问事务进行合法性认证,认证过程通过算法四。
算法四:verify access transaction 验证存储事务 |
---|
**Input: **$Tx_{access}={A,storeAddress,sign,accessTime}$: access transaction; |
Output: the validation of transaction |
1. |
2. |
3. if |
4. **return |
5. else |
6. **return |
经过算法四便可以确定当前的访问事务是否合法,在验证合法后,各个节点经过一致性协议便可以打包成块,加入到链上。
在 CP-ABE 加密阶段,通过秘密分享的方法,用户把自己设定的访问策略(访问策略建立在一个属性集合上)保存在密文中,只有满足访问策略属性集合用户才能还原出分享的秘密值,进而完成对密文解密。而针对 LSSS 秘密分享方案的秘密值还原,目前还没论文计算秘密还原算法,在这里我主要设计了两个算法:一个是 LSSS 矩阵行列变换和通过线性方程组完成给定属性集合上秘密值的还原,如果给定属性集合满足访问策略,则返回正确的秘密值;否则要么线性方程无解,要么返回一个错误的秘密值。
算法1:模 |
---|
Input: |
Output: 有特解解则返回特解向量 |
1. |
2. |
3. **for |
4. if |
5. if succeefully find row |
6. |
7. else |
8. |
9. else if |
10. making the first element of row |
11. making the element below |
12. end |
13. **for |
14. |
15. **making |
16. making element below |
17. end |
18. **for |
19. **for |
20. **find index |
21. |
22. |
23. end |
24. **for |
25. making element above |
26. end |
27. **for |
28. |
29. end |
30. **for $i=minRC-1 $ to |
31. **if |
32. **return $ \bot$ ** |
33. else |
34. |
35. end |
36. **return $ \vec x$ ** |
根据给定 LSSS 矩阵
算法2:秘密值还原算法 |
---|
Input: |
**Output:**如果集合 |
1. |
2. **if |
3. |
4. |
5. end |
6. **for |
7. |
8. end |
9. |
10. 根据算法一计算 |
11. **if |
12. return |
13. else |
14. **return |
- Waters B. (2011) Ciphertext-Policy Attribute-Based Encryption: An Expressive, Efficient, and Provably Secure Realization. In: Catalano D., Fazio N., Gennaro R., Nicolosi A. (eds) Public Key Cryptography – PKC 2011. PKC 2011. Lecture Notes in Computer Science, vol 6571. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-19379-8_4
- Amos Beimel. Secure Schemes for Secret Sharing and Key Distribution. PhD thesis, Israel Institute of Technology, Technion, Haifa, Israel, 1996.
- Dan Boneh and Matthew K. Franklin. 2001. Identity-Based Encryption from the Weil Pairing. In Proceedings of the 21st Annual International Cryptology Conference on Advances in Cryptology (CRYPTO '01). Springer-Verlag, Berlin, Heidelberg, 213–229.
- Dan Boneh, Ben Lynn, and Hovav Shacham. 2001. Short Signatures from the Weil Pairing. In Proceedings of the 7th International Conference on the Theory and Application of Cryptology and Information Security: Advances in Cryptology (ASIACRYPT '01). Springer-Verlag, Berlin, Heidelberg, 514–532.
- Sahai A., Waters B. (2005) Fuzzy Identity-Based Encryption. In: Cramer R. (eds) Advances in Cryptology – EUROCRYPT 2005. EUROCRYPT 2005. Lecture Notes in Computer Science, vol 3494. Springer, Berlin, Heidelberg. https://doi.org/10.1007/11426639_27
- Boneh D., Sahai A., Waters B. (2011) Functional Encryption: Definitions and Challenges. In: Ishai Y. (eds) Theory of Cryptography. TCC 2011. Lecture Notes in Computer Science, vol 6597. Springer, Berlin, Heidelberg. https://doi.org/10.1007/978-3-642-19571-6_16
- Dan Boneh, Amit Sahai, and Brent Waters. 2012. Functional encryption: a new vision for public-key cryptography. Commun. ACM 55, 11 (November 2012), 56–64. DOI:https://doi.org/10.1145/2366316.2366333
- K. Yang, Q. Han, H. Li, K. Zheng, Z. Su and X. Shen, "An Efficient and Fine-Grained Big Data Access Control Scheme With Privacy-Preserving Policy," in IEEE Internet of Things Journal, vol. 4, no. 2, pp. 563-571, April 2017, doi: 10.1109/JIOT.2016.2571718.
- Junzuo Lai, Robert H. Deng, and Yingjiu Li. 2011. Fully secure cipertext-policy hiding CP-ABE. In Proceedings of the 7th international conference on Information security practice and experience (ISPEC'11). Springer-Verlag, Berlin, Heidelberg, 24–39.
- S. Gao, G. Piao, J. Zhu, X. Ma and J. Ma, "TrustAccess: A Trustworthy Secure Ciphertext-Policy and Attribute Hiding Access Control Scheme Based on Blockchain," in IEEE Transactions on Vehicular Technology, vol. 69, no. 6, pp. 5784-5798, June 2020, doi: 10.1109/TVT.2020.2967099.
- Dan Boneh, Eu-Jin Goh, and Kobbi Nissim. 2005. Evaluating 2-DNF formulas on ciphertexts. In Proceedings of the Second international conference on Theory of Cryptography (TCC'05). Springer-Verlag, Berlin, Heidelberg, 325–341. DOI:https://doi.org/10.1007/978-3-540-30576-7_18
- Changyu Dong, Liqun Chen, and Zikai Wen. 2013. When private set intersection meets big data: an efficient and scalable protocol. In Proceedings of the 2013 ACM SIGSAC conference on Computer & communications security (CCS '13). Association for Computing Machinery, New York, NY, USA, 789–800. DOI:https://doi.org/10.1145/2508859.2516701
- Prosenjit Bose, Hua Guo, Evangelos Kranakis, Anil Maheshwari, Pat Morin, Jason Morrison, Michiel Smid, Yihui Tang, On the false-positive rate of Bloom filters, Information Processing Letters, Volume 108, Issue 4, 2008, Pages 210-213, ISSN 0020-0190.
- Zhen Liu, Zhenfu Cao and Duncan S. Wong, "Efficient Generation of Linear Secret Sharing Scheme Matrices from Threshold Access Trees", Cryptology ePrint Archive, Report 2010/374, https://eprint.iacr.org/2010/374.
This repository is some implementation of ABE (attribute-based encryption) scheme. Thanks to personal abilities, this repository is just a few ABE demos. However, these demos will give some ideas about cryptography to you. For example, in our implementations, I use a special string to express the access policy, such as ((A,B,C,2),(D,E,F,2),2). In each access policy, we could regard the string as a tree and substrings are child tree. The whole string is located in the root node.
This scheme's implementation is located in inlude/Waters11Scheme.h and source/Waters11Scheme.cpp.
The setup algorithm is used to initialize the full parameters of CPABE scheme. Thanks to ABE scheme is based on bilinear pairing, at first step, we need to initialize the parameters of bilinear pairing. In order to fulfill this purpose, we need the PBC library implemented by Ben Lynn in Stanford University.