KP-ABE

@KP-ABE知识整合

一、KP-ABE

KP-ABE(基于密钥策略的属性加密,Key-Policy ABE,KP-ABE)是将策略嵌入到用户密钥中,属性嵌入到密文中。密钥对应于一个访问结构而密文对应于一个属性集合,解密当且仅当属性集合中的属性能够满足此访问策略。这种设计比较接近静态场景,此时密文用与其相关的属性加密存放在服务器上,当允许用户得到某些消息时,就分配一个特定的访问策略给用户,其应用场景则更加偏向于付费视频网站、日志加密管理等等。如果用户想解密多个文件,那么他必须拥有多个可以满足匹配的密钥,否则不能解密多个文件。
转自

二、访问树

三、KP-ABE与CP-ABE比较

比较项CP-ABEKP-ABE
策略相关密文密钥
属性集合相关密钥密文
数据拥有者是否有权决定数据能被谁访问
属性集合中属性来源用户属性数据/文件属性
适用场景云环境/区块链数据加密共享日志管理、付费视频网站

四、KP-ABE的提出

Goyal等人2006年推出了KP-ABE,这是一种用于细粒度共享加密数据的密码系统。在该方案中,密文由属性集形成,并且用户密钥嵌入策略(即访问结构)。当用户属性满足访问结构时,用户可以解密消息。此处使用的访问结构是一种访问树,其中叶子节点由属性组成,非叶子节点由门限组成,形式为[m,n],n个属性满足m个即可解密。属性紧随其后。如果阈值为[1,n],则它代表“或”门,[n,n]代表“与”门。如果根节点得到满足,则用户可以解密数据,否则无法解密数据。假设属性是X1,X2,X3,访问策略是X1 AND(X2 OR X3),如图6所示。这里[1,2]表示“或”门,[2,2]代表“与”门。KP-ABE可以应用在 共享审计日志信息 和 广播加密方面。
转自

五、KP-ABE流程

①设置:这是一个随机算法,输入隐藏的安全参数,输出公开参数PK和一个主密钥MK。

②加密:这是一个随机算法,输入一个消息m、一组属性Y、公开参数PK,输出密文E。​

③密钥生成:这是一个随机算法,输入访问结构A、主密钥MK、公开参数PK,输出一个解密密钥D。

④解密算法输入:​基于属性组Y加密的密文E,对应访问结构A的解密密钥D,公开参数PK。

如果Y∈A,输出X消息m。
KP-ABE流程
①设置:这是一个随机算法,输入隐藏的安全参数,输出公开参数PK和一个主密钥MK。

②加密:这是一个随机算法,输入一个消息m、一组属性Y、公开参数PK,输出密文E。​

③密钥生成:这是一个随机算法,输入访问结构A、主密钥MK、公开参数PK,输出一个解密密钥D。

④解密算法输入:​基于属性组Y加密的密文E,对应访问结构A的解密密钥D,公开参数PK。

如果Y∈A,输出X消息m。

六、方案构造

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是KP-ABE算法的Java实现示例: ```java import it.unisa.dia.gas.jpbc.Element; import it.unisa.dia.gas.jpbc.Pairing; import it.unisa.dia.gas.jpbc.PairingFactory; import it.unisa.dia.gas.jpbc.Field; import it.unisa.dia.gas.jpbc.Field.ElementPowPreProcessing; import it.unisa.dia.gas.plaf.jpbc.pairing.a.TypeACurveGenerator; import it.unisa.dia.gas.plaf.jpbc.pairing.parameters.PropertiesParameters; import it.unisa.dia.gas.plaf.jpbc.pairing.parameters.PropertiesParametersGenerator; import it.unisa.dia.gas.plaf.jpbc.util.ElementUtils; import java.util.ArrayList;import java.util.HashMap; import java.util.Map; public class KPABE { private Pairing pairing; private Field G1, GT, Zr; private Element g, h, f; private Map<String, Element> D; private Map<String, ElementPowPreProcessing> D_pre; private Map<String, Element> D1; private Map<String, ElementPowPreProcessing> D1_pre; public KPABE() { PropertiesParametersGenerator pg = new PropertiesParametersGenerator(); pg.init(new TypeACurveGenerator(3, 32)); PropertiesParameters params = pg.generate(); this.pairing = PairingFactory.getPairing(params); this.G1 = pairing.getG1(); this.GT = pairing.getGT(); this.Zr = pairing.getZr(); this.g = G1.newRandomElement().getImmutable(); this.h = G1.newRandomElement().getImmutable(); this.f = GT.newRandomElement().getImmutable(); this.D = new HashMap<String, Element>(); this.D_pre = new HashMap<String, ElementPowPreProcessing>(); this.D1 = new HashMap<String, Element>(); this.D1_pre = new HashMap<String, ElementPowPreProcessing>(); } public void setup(int n) { Element alpha = Zr.newRandomElement().getImmutable(); Element beta = Zr.newRandomElement().getImmutable(); Element g_alpha = g.powZn(alpha).getImmutable(); Element h_beta = h.powZn(beta).getImmutable(); Element f_alpha = f.powZn(alpha).getImmutable(); D.put("g_alpha", g_alpha); D_pre.put("g_alpha", G1.newElement().set(g_alpha).getImmutable().getElementPowPreProcessing()); D.put("h_beta", h_beta); D_pre.put("h_beta", G1.newElement().set(h_beta).getImmutable().getElementPowPreProcessing()); D.put("f_alpha", f_alpha); D_pre.put("f_alpha", GT.newElement().set(f_alpha).getImmutable().getElementPowPreProcessing()); for (int i = 1; i <= n; i++) { Element r = Zr.newRandomElement().getImmutable(); Element g_r = g.powZn(r).getImmutable(); Element h_r = h.powZn(r).getImmutable(); D.put("g_" + i, g_r); D_pre.put("g_" + i, G1.newElement().set(g_r).getImmutable().getElementPowPreProcessing()); D.put("h_" + i, h_r); D_pre.put("h_" + i, G1.newElement().set(h_r).getImmutable().getElementPowPreProcessing()); Element D1_i = g_alpha.mul(h_beta).mul(g_r).getImmutable(); D1.put("D1_" + i, D1_i); D1_pre.put("D1_" + i, G1.newElement().set(D1_i).getImmutable().getElementPowPreProcessing()); } } public Map<String, Element> keygen(String[] attrs) { Map<String, Element> sk = new HashMap<String, Element>(); Element r = Zr.newRandomElement().getImmutable(); Element D2 = g.powZn(r).getImmutable(); sk.put("D2", D2); for (String attr : attrs) { Element r_attr = Zr.newRandomElement().getImmutable(); Element D3_attr = g.powZn(r_attr).getImmutable(); Element D4_attr = D.get("h_" + attr).powZn(r).mul(h).powZn(r_attr).getImmutable(); sk.put("D3_" + attr, D3_attr); sk.put("D4_" + attr, D4_attr); } return sk; } public Element encrypt(String[] attrs, String message) { Element s = Zr.newRandomElement().getImmutable(); Element C0 = f.mul(pairing.pairing(g, h.powZn(s))).getImmutable(); Element C1 = g.powZn(s).getImmutable(); ArrayList<Element> C2_list = new ArrayList<Element>(); for (String attr : attrs) { Element C2_attr = D.get("g_" + attr).powZn(s).getImmutable(); C2_list.add(C2_attr); } Element C2 = ElementUtils.getProdOfElements(C2_list).getImmutable(); Element C3 = GT.newElement().setToHash(message.getBytes(), 0, message.getBytes().length).powZn(s).getImmutable(); return pairing.getGT().newElement().setToCipherText(C0, C1, C2, C3).getImmutable(); } public Element decrypt(Map<String, Element> sk, Element ct) { Element D2 = sk.get("D2"); ArrayList<Element> D3_list = new ArrayList<Element>(); ArrayList<Element> D4_list = new ArrayList<Element>(); for (String attr : sk.keySet()) { if (attr.startsWith("D3_")) { D3_list.add(sk.get(attr)); } else if (attr.startsWith("D4_")) { D4_list.add(sk.get(attr)); } } Element numerator = pairing.pairing(ct.get(1), D2).getImmutable(); ArrayList<Element> denominator_list = new ArrayList<Element>(); for (int i = 0; i < D3_list.size(); i++) { Element D3_i = D3_list.get(i); Element D4_i = D4_list.get(i); Element C2_i = ct.get(2).powZn(D3_i).mul(D4_i).getImmutable(); denominator_list.add(pairing.pairing(D_pre.get("h_" + i), C2_i)); } Element denominator = ElementUtils.getProdOfElements(denominator_list).getImmutable(); return ct.get(3).mul(numerator.div(denominator)).getImmutable(); } public static void main(String[] args) { KPABE kpabe = new KPABE(); kpabe.setup(5); Map<String, Element> sk = kpabe.keygen(new String[]{"1", "2", "3"}); Element ct = kpabe.encrypt(new String[]{"1", "2"}, "hello world"); Element m = kpabe.decrypt(sk, ct); System.out.println(m); } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值