1.引言

在IBE和ABE中较为经典的方案[1,2]都用到了一个关键的撤销树,在文献[1]中叫做MT树,文献[2]中叫做KEK树,两个方案的基本实现方法都是寻找最小覆盖集合.现在将  寻找最小覆盖集合的代码加以实现。

2.基本思路

在IBE中,对所有用户需要构建这样的一颗二叉树,若v是叶子节点,则PATH(v)表示从v到根集合的所有节点集合(包括叶子节点v和根节点),若v是一个非叶子节点,则表示v的左孩子节点,表示其右孩子节点,我们假设树中的节点被编码为唯一的字符串。

定义一个函数KUNodes,用于计算需要为其发布密钥更新的最小节点集,以便只有在t时刻没有撤销的用户才能解密密文。函数输入二叉树T,撤销列表rl和时间t。输出一个节点集合Y,其为T中节点的最小集合:

集合Y中的任何节点都不是rl中对应时间<=t的节点(在时间t或之前撤销)的祖先(或本身),而所有其他叶节点(对应于未撤销的用户)在集合中恰好有一个祖先(或本身)。

该函数的操作如下。首先将已撤销节点的所有祖先标记为已撤销节点,然后输出已撤销节点的所有未撤销子节点。

算法如下:

上述算法感觉较为晦涩,举一个例子:

第一个图是用户未被撤销,第二个图是用户u3被撤销。得到的最小覆盖集为画勾的节点。

3.代码实现

注意:

1.本代码实现的是满二叉树,即叶子节点个数为2^n.

2.由于只是用于实验,并未考虑时间t.

首先写出树中节点的类:

package tree;public class TreeNode {private String id;private TreeNode parent;private TreeNode leftChild;private TreeNode rightChild;public boolean isLeaf;TreeNode() {}TreeNode(String id) {this.id = id;}@Overridepublic boolean equals(Object obj) {if (!(obj instanceof TreeNode)) {return false;}return this.id == ((TreeNode) obj).id;}public String getId() {return id;}public void setId(String id) {this.id = id;}public TreeNode getParent() {return parent;}public void setParent(TreeNode parent) {this.parent = parent;}public TreeNode getLeftChild() {if (!isLeaf)return leftChild;elsereturn null;}public void setLeftChild(TreeNode leftChild) {if (!isLeaf)this.leftChild = leftChild;}public TreeNode getRightChild() {if (!isLeaf)return rightChild;elsereturn null;}public void setRightChild(TreeNode rightChild) {if (!isLeaf)this.rightChild = rightChild;}
}

再给出对树的基本操作类:

package tree;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class TreeUtil {/*** 返回树中节点个数* @param root* @return*/public static int getTreeNodeNum(TreeNode root){if(root.getLeftChild()==null && root.getRightChild()==null){return 1;}return getTreeNodeNum(root.getLeftChild())+getTreeNodeNum(root.getRightChild())+1;}/*** 返回叶子节点到树根的路径* @param leaf* @return*/public static List<TreeNode> getPath(TreeNode leaf){if(leaf==null){return null;}List<TreeNode> pathNodeList=new ArrayList<TreeNode>();TreeNode TempNode=leaf;while(TempNode.getParent()!=null){pathNodeList.add(TempNode);TempNode=TempNode.getParent();}pathNodeList.add(TempNode);return pathNodeList;}/*** 获得最小覆盖集* @param T* @param reList* @return*/public static Set<TreeNode> KUNNodes(TreeNode T,List<TreeNode> reList){Set<TreeNode> X=new HashSet<TreeNode>();Set<TreeNode> Y=new HashSet<TreeNode>();for (TreeNode treeNode : reList) {X.addAll(getPath(treeNode));}for (TreeNode treeNode : X) {if(treeNode.getLeftChild()!=null && !X.contains(treeNode.getLeftChild())){Y.add(treeNode.getLeftChild());}if(treeNode.getRightChild()!=null && !X.contains(treeNode.getRightChild())){Y.add(treeNode.getRightChild());}}if(Y.isEmpty())Y.add(T);return Y;}/*** 创建包含n个叶子节点的树* @param n* @return*/public static TreeNode createTree(int n){List<TreeNode> nodeList=new ArrayList<TreeNode>();nodeList.add(new TreeNode("node"+0));//node0为占位节点int depth=(int)(Math.log(n)/Math.log(2))+1;for(int i=1;i<=depth;i++){for(int j=(int)(Math.pow(2, i-1));j<(int)(Math.pow(2, i));j++){nodeList.add(new TreeNode("node"+j));nodeList.get(j).isLeaf=false;if(i==depth){nodeList.get(j).isLeaf=true;}}}      for(int i=1;i<nodeList.size();i++){if(i!=1)nodeList.get(i).setParent(nodeList.get(i/2));if(!nodeList.get(i).isLeaf){nodeList.get(i).setLeftChild(nodeList.get(2*i));nodeList.get(i).setRightChild(nodeList.get(2*i+1));}}return nodeList.get(1);}
}

最后写出测试类进行测试:

package tree;import java.util.ArrayList;
import java.util.List;
import java.util.Set;public class Test2 {public static void main(String[] args) {TreeNode node1=TreeUtil.createTree(8);    //创建含8个叶子节点的访问树TreeNode node10=node1.getLeftChild().getRightChild().getLeftChild();TreeNode node14=node1.getRightChild().getRightChild().getLeftChild();System.out.println(node10.getId());System.out.println(node14.getId());List<TreeNode> revList=new ArrayList<TreeNode>();revList.add(node10);revList.add(node14);Set<TreeNode> Y=TreeUtil.KUNNodes(node1, revList);for (TreeNode treeNode : Y) {System.out.println(treeNode.getId());}}
}

得到结果为:

解释一下结果:

整棵树的构造为:

node10和node14为我们需要撤销的用户集合,

所以最后最小覆盖集应该为:node4,node11,node6,node15

4.结语

这里只是对算法进行了简单实现,后续会将算法改进,加入到具体的IBE或ABE撤销方案中。

5.参考文献

[1] Boldyreva, Alexandra & Goyal, Vipul & Kumar, Virendra. (2008). Identity-based encryption with efficient revocation. 417-426. 10.1145/1455770.1455823.

[2] Hur, Junbeom & Noh, Dong Kun. (2011). Attribute-Based Access Control with Efficient Revocation in Data Outsourcing Systems. Parallel and Distributed Systems, IEEE Transactions on. 22. 1214 - 1221. 10.1109/TPDS.2010.203.

ABE或IBE中属性撤销的寻找最小覆盖集的基本算法相关推荐

  1. Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)

    目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...

  2. 【python】使用python脚本将CelebA中图片按照 list_attr_celeba.txt 中属性处理(删除、复制、移动)

    1.目的 CelebA中的照片有四十种属性,参见: [AI]CelebA数据介绍.下载及说明 根据需求从celebA中获取我们想要的图片,方法是将CelebA中图片按照 list_attr_celeb ...

  3. python隐藏部分代码_python隐藏类中属性的3种实现方法

    方法一: 效果图一: 代码一: # 定义一个矩形的类 class Rectangle: # 定义初始化方法 def __init__(self,width,height): self.hidden_w ...

  4. es了解集群中属性 4

    2019独角兽企业重金招聘Python工程师标准>>> 了解集群中属性 GET /_cluster/health status 字段是我们最关心的. status 字段指示着当前集群 ...

  5. 为 protocol 中属性添加默认值

    首先放个简单的Playground做下示范. 普通 protocol 中的 get set protocol中属性可以声明为{ get }或者{ get set }.大多数人第一眼肯定觉得{ get ...

  6. java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解

    java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...

  7. java中属性外部化_用Java可外部化

    java中属性外部化 在理解Externalizable接口之前,您需要了解序列化.您可以在java中的序列化上阅读有关序列化的更多信息. Java提供了一种称为序列化的机制,以按字节的有序或字节序列 ...

  8. avue下拉框中属性可以显示,但不能选中

    1.avue下拉框中属性可以显示,但不能选中 追其原因,我对表单分组了,下拉框放在了group组内的column组里面,导致层数过多,产生死循环的bug 2.解决方法: 取消分组,把所有的属性放到co ...

  9. [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  10. css样式有行内式还有什么,在行内式CSS样式中,属性和值的书写规范与CSS样式规则不相同...

    摘要: 下列护棚料的对防顶材说法,行则正确的是,棚顶,能力棚顶具有应当防护抗砸.下列原始的是属于数据,样S样统计体单特征掌握征的总体明总据B部门位特的数的数.说数据说明.式中属性式规同度同度综合指数中 ...

最新文章

  1. 我国科学家首次揭示“时空”记忆在猕猴大脑中表征的几何结构
  2. Python偷懒小技巧-提高10倍工作效率
  3. linux下配置myBase7.ini
  4. 创造包容的环境和上升空间
  5. 网络层常见知识点剖析
  6. .net 任务(Task)
  7. mysql 创建表字段长度范围_Mysql的建表规范与注意事项
  8. rust这么拆除钢墙_rust腐蚀如何拆墙
  9. 中农大计算机组成原理在线作业1,河北农大2017计算机组成原理_在线作业_1课案.docx...
  10. 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
  11. kettle 简介及入门
  12. 干货 | 携程平台化常态化数据治理之路
  13. APP如何上架App Store?
  14. flutter网络请求基础知识铺垫、及实战举例
  15. Centos6安装SGE以及集群配置
  16. 问卷调查 批量模拟真人填写 爬虫 实战
  17. 人人都是产品经理之用Axure制作微信主页原型图
  18. 2008最火爆的十大网络流行语:
  19. jenkin swindows启动_windows本地安装以及使用Jenkins
  20. web前端面试重点难点问题

热门文章

  1. Excel VBA单元格数据自增1
  2. X11-forwarding笔记
  3. 计算一阶导数的四阶中心差分格式
  4. 程序员快速记忆英文单词的专属诀窍
  5. redis基本命令和help使用
  6. 网页显示不正常怎么修复
  7. Android 安卓动画 补间动画 - 缩放动画
  8. 管理系统中计算机应用VIF,vif第1章课件.ppt
  9. python土味情话_GitHub - MMstarry/itchat: 微信机器人 土味情话
  10. 腾讯计算机安全实验室,TRP-AI反病毒引擎创新:腾讯安全最新成果入围顶级学术会议...