Fuzzy identity-based encryption
Work flow of FIBE.
Preliminares
Lagrange interpolation
给定\(d\)个点\((x_0,y_0),(x_1,y_1),...,(x_{d-1},y_{d-1})\),可以决定一个\(d-1\)次多项式。该多项式可以表示为:
\[ q(x)=\sum_{i=0}^{d-1}y_i\delta_i(x) \]
其中,拉格朗日因子\(\delta_i(x)=\prod_{j=0,j\neq i}^{d-1}\frac{x-x_j}{x_i-x_j}\)
Shamir Secret Sharing
将秘密\(s\)分割后共享给\(n\)个人,至少\(k\)个人组合后才可以恢复秘密\(s\)。分享方案:
选取\(k-1\)次随机多项式\(q(x)\)并使得\(q(0)=s\),计算\((x_1,q(x_1)),(x_2,q(x_2)),...,(x_{n},q(x_{n}))\),将对应的\(q(x_i)\)分享给第i个用户。
\(k\)个用户通过其秘密分片进行拉格朗日插值后恢复\(q(x)\),进而计算出\(q(0)\)。
Setup
生成pairing相关公共参数 \(<e, g, G_1, G_T,Z_r>\)。
确定属性全集\(U\)为整数集合\(\{1, 2,..., |U|\}\),以及系统门限值\(d\)。
针对每个属性\(i\)选择随机数\(t_i\in Z_r\)作为主密钥组件,计算\(T_i=g^{t_i}\)作为对应的公钥组件。
选取随机数\(y\in Z_r\),并计算\(Y=e(g,g)^{y}\)。
最终,系统主密钥\(msk=\langle t_1,t_2,...t_{|U|}, y \rangle\),公钥\(pk=\langle T_1,T_2,...,T_{|U|},Y \rangle\)。
Key Generation
随机选择一个\(d-1\)次多项式\(q(x)\),使得\(q(0)=y\)。
针对用户属性集合\(S\)中的每个属性\(i\),计算\(q(i)\),进一步计算\(D_i=g^{\frac{q(i)}{t_i}}\)。
用户私钥\(sk= \{D_i\}_{i\in S}\)。
Encryption
- 选取随机数\(s\in Zr\),针对明文消息\(M\in G_T\),计算\(E'=M\cdot Y^s=M\cdot e(g,g)^{ys}\)。
- 针对明文属性集合\(W\)中的每个属性\(i\),计算\(E_i={T_i}^s\)。
- 密文为\(ct=\langle E', \{E_i\}_{i\in W} \rangle\)。
Decryption
- 如果用户属性集合\(S\)和明文属性集合\(W\)重合属性个数不小于\(d\),可按如下方法解密。
- 从所有重合属性中选取\(d\)个构成属性集合\(I\)。
- 针对\(I\)中的每个属性\(i\),计算\(P_i = e(E_i, D_i)^{\delta_i(0)}=e(g,g)^{sq(i)\delta_i(0)}\),其中\(\delta_i(0)\)是拉格朗日因子。
- \(\prod_{i\in I} P_i = e(g,g)^{s\sum_{i\in I}q(i)\delta_i(0)}=e(g,g)^{sy}\)
- \(E'/\prod_{i\in I} P_i = M\)
算法实现注意事项
- 属性用整数表示。实际应用中通过索引表将每一个整数和一个字符串属性对应起来。
- 多项式求值和拉格朗日插值在群Zr上进行,因此相应的int值在计算前要转换为Zr Element。
- 对于重复使用的值,一定要记得使用getImmutable()或者duplicate()。尤其是在for循环中。