ABE或IBE中属性撤销的寻找最小覆盖集的基本算法
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中属性撤销的寻找最小覆盖集的基本算法相关推荐
- Unity 2.Space Shooter(碰撞器Collider,WebGL,刚体中属性,(定时)实例化、销毁游戏对象,触碰OnTriggerEnter/Exit,爆炸效果,音频,文字,定时调方法)
目录 项目介绍 WebGL发布 游戏对象设置 灯光.相机 背景 移动游戏对象 Debug 制作子弹 射击动作 清理离开边界的游戏对象 制作危险物 添加爆炸,移动小行星,作为预制件 创建游戏控制器 循环 ...
- 【python】使用python脚本将CelebA中图片按照 list_attr_celeba.txt 中属性处理(删除、复制、移动)
1.目的 CelebA中的照片有四十种属性,参见: [AI]CelebA数据介绍.下载及说明 根据需求从celebA中获取我们想要的图片,方法是将CelebA中图片按照 list_attr_celeb ...
- python隐藏部分代码_python隐藏类中属性的3种实现方法
方法一: 效果图一: 代码一: # 定义一个矩形的类 class Rectangle: # 定义初始化方法 def __init__(self,width,height): self.hidden_w ...
- es了解集群中属性 4
2019独角兽企业重金招聘Python工程师标准>>> 了解集群中属性 GET /_cluster/health status 字段是我们最关心的. status 字段指示着当前集群 ...
- 为 protocol 中属性添加默认值
首先放个简单的Playground做下示范. 普通 protocol 中的 get set protocol中属性可以声明为{ get }或者{ get set }.大多数人第一眼肯定觉得{ get ...
- java中属性文件读取案例_java相关:Spring中属性文件properties的读取与使用详解
java相关:Spring中属性文件properties的读取与使用详解 发布于 2020-6-3| 复制链接 摘记: Spring中属性文件properties的读取与使用详解实际项目中,通常将一些 ...
- java中属性外部化_用Java可外部化
java中属性外部化 在理解Externalizable接口之前,您需要了解序列化.您可以在java中的序列化上阅读有关序列化的更多信息. Java提供了一种称为序列化的机制,以按字节的有序或字节序列 ...
- avue下拉框中属性可以显示,但不能选中
1.avue下拉框中属性可以显示,但不能选中 追其原因,我对表单分组了,下拉框放在了group组内的column组里面,导致层数过多,产生死循环的bug 2.解决方法: 取消分组,把所有的属性放到co ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)...
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- css样式有行内式还有什么,在行内式CSS样式中,属性和值的书写规范与CSS样式规则不相同...
摘要: 下列护棚料的对防顶材说法,行则正确的是,棚顶,能力棚顶具有应当防护抗砸.下列原始的是属于数据,样S样统计体单特征掌握征的总体明总据B部门位特的数的数.说数据说明.式中属性式规同度同度综合指数中 ...
最新文章
- 我国科学家首次揭示“时空”记忆在猕猴大脑中表征的几何结构
- Python偷懒小技巧-提高10倍工作效率
- linux下配置myBase7.ini
- 创造包容的环境和上升空间
- 网络层常见知识点剖析
- .net 任务(Task)
- mysql 创建表字段长度范围_Mysql的建表规范与注意事项
- rust这么拆除钢墙_rust腐蚀如何拆墙
- 中农大计算机组成原理在线作业1,河北农大2017计算机组成原理_在线作业_1课案.docx...
- 【语音隐藏】基于matlab LSB语音信息隐藏【含Matlab源码 577期】
- kettle 简介及入门
- 干货 | 携程平台化常态化数据治理之路
- APP如何上架App Store?
- flutter网络请求基础知识铺垫、及实战举例
- Centos6安装SGE以及集群配置
- 问卷调查 批量模拟真人填写 爬虫 实战
- 人人都是产品经理之用Axure制作微信主页原型图
- 2008最火爆的十大网络流行语:
- jenkin swindows启动_windows本地安装以及使用Jenkins
- web前端面试重点难点问题