模糊身份基加密 (Fuzzy Identity based Encryption)算法及JPBC实现

模糊身份基加密 (Fuzzy Identity based Encryption)算法及JPBC实现

视频地址 https://www.bilibili.com/video/BV1em4y1D7ch?share_source=copy_web
代码地址 https://github.com/hjlpb/FIBE.git
论文地址 https://eprint.iacr.org/2004/086.pdf

预备知识

拉格朗日插值算法

给定 d d d个点 ( x 0 , y 0 ) , ( x 1 , y 1 ) , . . . , ( x d − 1 , y d − 1 ) (x_0,y_0),(x_1,y_1),...,(x_{d-1},y_{d-1}) (x0,y0),(x1,y1),...,(xd1,yd1),可以决定一个 d − 1 d-1 d1次多项式。该多项式可以表示为:

q ( x ) = ∑ i = 0 d − 1 y i δ i ( x ) q(x)=\sum_{i=0}^{d-1}y_i\delta_i(x) q(x)=i=0d1yiδi(x)

其中,拉格朗日因子 δ i ( x ) = ∏ j = 0 , j ≠ i d − 1 x − x j x i − x j \delta_i(x)=\prod_{j=0,j\neq i}^{d-1}\frac{x-x_j}{x_i-x_j} δi(x)=j=0,j=id1xixjxxj

Shamir秘密共享

将秘密 s s s分割后共享给 n n n个人,至少 k k k个人组合后才可以恢复秘密 s s s。分享方案:

选取 k − 1 k-1 k1次随机多项式 q ( x ) q(x) q(x)并使得 q ( 0 ) = s q(0)=s q(0)=s,计算 ( x 1 , q ( x 1 ) ) , ( x 2 , q ( x 2 ) ) , . . . , ( x n , q ( x n ) ) (x_1,q(x_1)),(x_2,q(x_2)),...,(x_{n},q(x_{n})) (x1,q(x1)),(x2,q(x2)),...,(xn,q(xn)),将对应的 q ( x i ) q(x_i) q(xi)分享给第i个用户。

k k k个用户通过其秘密分片进行拉格朗日插值后恢复 q ( x ) q(x) q(x),进而计算出 q ( 0 ) q(0) q(0)

setup

  1. 生成pairing相关公共参数 < e , g , G 1 , G T , Z r > <e, g, G_1, G_T,Z_r> <e,g,G1,GT,Zr>

  2. 确定属性全集 U U U为整数集合 { 1 , 2 , . . . , ∣ U ∣ } \{1, 2,..., |U|\} {1,2,...,U},以及系统门限值 d d d

  3. 针对每个属性 i i i选择随机数 t i ∈ Z r t_i\in Z_r tiZr作为主密钥组件,计算 T i = g t i T_i=g^{t_i} Ti=gti作为对应的公钥组件。

  4. 选取随机数 y ∈ Z r y\in Z_r yZr,并计算 Y = e ( g , g ) y Y=e(g,g)^{y} Y=e(g,g)y

  5. 最终,系统主密钥 m s k = ⟨ t 1 , t 2 , . . . t ∣ U ∣ , y ⟩ msk=\langle t_1,t_2,...t_{|U|}, y \rangle msk=t1,t2,...tU,y,公钥 p k = ⟨ T 1 , T 2 , . . . , T ∣ U ∣ , Y ⟩ pk=\langle T_1,T_2,...,T_{|U|},Y \rangle pk=T1,T2,...,TU,Y

keygen

  1. 随机选择一个 d − 1 d-1 d1次多项式 q ( x ) q(x) q(x),使得 q ( 0 ) = y q(0)=y q(0)=y

  2. 针对用户属性集合 S S S中的每个属性 i i i,计算 q ( i ) q(i) q(i),进一步计算 D i = g q ( i ) t i D_i=g^{\frac{q(i)}{t_i}} Di=gtiq(i)

  3. 用户私钥 s k = { D i } i ∈ S sk= \{D_i\}_{i\in S} sk={Di}iS

encrypt

  1. 选取随机数 s ∈ Z r s\in Zr sZr,针对明文消息 M ∈ G T M\in G_T MGT,计算 E ′ = M ⋅ Y s = M ⋅ e ( g , g ) y s E'=M\cdot Y^s=M\cdot e(g,g)^{ys} E=MYs=Me(g,g)ys
  2. 针对明文属性集合 W W W中的每个属性 i i i,计算 E i = T i s E_i={T_i}^s Ei=Tis
  3. 密文为 c t = ⟨ E ′ , { E i } i ∈ W ⟩ ct=\langle E', \{E_i\}_{i\in W} \rangle ct=E,{Ei}iW

decrypt

  1. 如果用户属性集合 S S S和明文属性集合 W W W重合属性个数不小于 d d d,可按如下方法解密。
  2. 从所有重合属性中选取 d d d个构成属性集合 I I I
  3. 针对 I I I中的每个属性 i i i,计算 P i = e ( E i , D i ) δ i ( 0 ) = e ( g , g ) s q ( i ) δ i ( 0 ) P_i = e(E_i, D_i)^{\delta_i(0)}=e(g,g)^{sq(i)\delta_i(0)} Pi=e(Ei,Di)δi(0)=e(g,g)sq(i)δi(0),其中 δ i ( 0 ) \delta_i(0) δi(0)是拉格朗日因子。
  4. ∏ i ∈ I P i = e ( g , g ) s ∑ i ∈ I q ( i ) δ i ( 0 ) = e ( g , g ) s y \prod_{i\in I} P_i = e(g,g)^{s\sum_{i\in I}q(i)\delta_i(0)}=e(g,g)^{sy} iIPi=e(g,g)siIq(i)δi(0)=e(g,g)sy
  5. E ′ / ∏ i ∈ I P i = M E'/\prod_{i\in I} P_i = M E/iIPi=M

算法实现注意事项

  1. 属性用整数表示。实际应用中通过索引表将每一个整数和一个字符串属性对应起来。
  2. 多项式求值和拉格朗日插值在群Zr上进行,因此相应的int值在计算前要转换为Zr Element。
  3. 对于重复使用的值,一定要记得使用getImmutable()或者duplicate()。尤其是在for循环中。
  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值