ABE 中的隐藏属性:DIPPE(去中心化内积谓词加密)

1. 引言

相关论文有:

  • Yan Michalevsky 和 Marc Joye 2018年论文 Decentralized policy-hiding ABE with receiver privacy,发表于23rd European Symposium on Research in Computer Security, ESORICS 2018。
  • Amit Sahai 和 Brent Waters 2005年论文 Fuzzy identity-based encryption ,发表于EUROCRYPT 2005。

利用基于属性的加密(Attribute-Based Encryption,ABE)(见Amit Sahai 和 Brent Waters 2005年论文 Fuzzy identity-based encryption ,发表于EUROCRYPT 2005。),允许具有某些属性的用户解密数据。这可能与位置或登录网络的权限有关。
ABE有两个关键特性:

  • 1)提供多个权威方来提供属性(multi-authority,即MA-ABE),
  • 2)隐藏所使用的访问策略。

利用 DIPPE(Decentralized Inner-Product Predicate Encryption,去中心化内积谓词加密)(详情见:Yan Michalevsky 和 Marc Joye 2018年论文 Decentralized policy-hiding ABE with receiver privacy,发表于23rd European Symposium on Research in Computer Security, ESORICS 2018。):

  • 既可以执行多个权威方提供的属性,
  • 也可以执行访问策略隐藏。

DIPPE为 ABE 提供了一种去中心化的方法。

对于策略隐藏,DIPPE 使用去中心化内积谓词加密方案,其中有一个正交的策略向量和一个用户向量。为此,它们的内积应该为零。

有两个向量u和v,如果它们的内积为零,则它们是正交的:

⟨ u , v ⟩= 0

如对于:
在这里插入图片描述
有:

⟨ u , v ⟩=(0×1)+(−1×1)+(1×1)+(0×−3)+(0×−4)=0

DIPPE基本流程为:

  • 1)Setup:将接受一个输入参数,然后创建公共参数 (pp):
a , err := abe.NewDIPPE ( 3 )
  • 2)AuthSetup:采用公共参数和权威方索引i,并输出权威方的私钥 (sk) 和公钥 (pk):
 // 创建权威方及其公钥auth := make([]*abe.DIPPEAuth, vecLen)pubKeys := make([]*abe.DIPPEPubKey, vecLen)for i := range auth {auth[i], err = a.NewDIPPEAuth(i)if err != nil {fmt.Printf("New authority generation failed: %v\n", err)}pubKeys[i] = &auth[i].Pk}
  • 3)GenKey:采用公共参数、权威方索引 (i)、私钥、来自其他权威方的公共参数、用户全局 ID 和属性向量,并输出一个私钥:
 // 为用户定义 GID
userGID := "Bob" // 设置用户向量。要解密,用户和策略向量必须正交
v=toArray(vector2) 
userVector := data.Vector([]*big.Int{big.NewInt(v[ 0 ]), big.NewInt(v[ 1 ]), big.NewInt(v[ 2 ]), big.NewInt(v[ 3 ]), big.NewInt(v[ 4 ])}) // 从授权机构生成密钥
userKeys := make ([]data.VectorG2, vecLen) for i := range auth { userKeys[i], err = auth[i].DeriveKeyShare(userVector, pubKeys, userGID) if err != nil { fmt.Printf( "User key generation failed: %v\n" , err) } 
}
  • 4)加密:可使用公钥和策略向量进行加密:
v:= toArray (vector1) 
policyVector := data. Vector ([]*big.Int{big .NewInt (v[ 0 ]), big .NewInt (v[ 1 ]), big .NewInt (v[ 2 ]), big .NewInt (v[ 3 ]), big .NewInt (v[ 4 ])}) // 使用策略向量给出的所选策略加密消息,cipher, err := a.Encrypt ( msg, policyVector, pubKeys) 
if err != nil { fmt .Printf ("加密失败:%v\n", err) 
}
  • 5)解密:可使用用户密钥、用户向量和 userGID 解密密码:
msgRecovered, err := a.Decrypt(cipher, userKeys, userVector, userGID)

完整代码见https://asecuritysite.com/abe/go_abe05:

package main
import ("fmt""os""github.com/fentec-project/gofe/abe""github.com/fentec-project/gofe/data""math/big""strings""strconv"
)
func toArray(s string) []int64 {strs := strings.Split(s, " ")a := make([]int64, len(strs))for i := range a {a[i],_ = strconv.ParseInt(strs[i], 10, 64)}return a}func main() {msg:="Hello"vector1:="1 -1 1 0 0"vector2:="0 1 1 -3 4"argCount := len(os.Args[1:])if (argCount>0) { msg= (os.Args[1]) }if (argCount>1) { vector1= (os.Args[2]) }if (argCount>2) { vector2= (os.Args[3]) }a, err := abe.NewDIPPE(3)if err != nil {fmt.Printf("New scheme generation failed: %v\n", err)}vecLen := 5// create authorities and their public keysauth := make([]*abe.DIPPEAuth, vecLen)pubKeys := make([]*abe.DIPPEPubKey, vecLen)for i := range auth {auth[i], err = a.NewDIPPEAuth(i)if err != nil {fmt.Printf("New authority generation failed: %v\n", err)}pubKeys[i] = &auth[i].Pk}// Policy vectorv:=toArray(vector1)policyVector := data.Vector([]*big.Int{big.NewInt(v[0]), big.NewInt(v[1]),big.NewInt(v[2]), big.NewInt(v[3]), big.NewInt(v[4])})// encrypt the message with the chosen policy give by a policy vector,cipher, err := a.Encrypt(msg, policyVector, pubKeys)if err != nil {fmt.Printf("Encryption failure: %v\n", err)}// Define GID for the useruserGID := "Bob"// Setup user vector. To decrypt, the users and policy vector must be orthogonalv=toArray(vector2)userVector := data.Vector([]*big.Int{big.NewInt(v[0]), big.NewInt(v[1]),big.NewInt(v[2]), big.NewInt(v[3]), big.NewInt(v[4])})// Generate keys from authoritiesuserKeys := make([]data.VectorG2, vecLen)for i := range auth {userKeys[i], err = auth[i].DeriveKeyShare(userVector, pubKeys, userGID)if err != nil {fmt.Printf("User key generation failed: %v\n", err)}}// Decryption by the usermsgRecovered, err := a.Decrypt(cipher, userKeys, userVector, userGID)if err != nil {fmt.Printf("Decryption failed: %v\n", err)}fmt.Printf("Policy vector: %v\nUser vector: %v\n\n",policyVector,userVector)fmt.Printf("Message: %v\nRecovered %v",msg, msgRecovered)}

相关示例有:

  • 消息:“Hello”,安全:[1 -1 1 0 0] 用户:[0 1 1 -3 4]。正交。
  • 消息:“Hello”,安全:[1 -2 1 0 1] 用户:[1 1 1 -3 4]。不正交。
  • 消息:“Hello”,安全:[4 -3 2 1 0] 用户:[1 1 1 -3 4]。正交。
  • 消息:“Hello”,安全:[4 -3 2 1 1] 用户:[1 1 1 -3 4]。不正交。

参考资料

[1] Prof Bill Buchanan OBE FRSE 2024年11月18日博客 Hidding Attributes in ABE: DIPPE (Decentralized Inner-Product Predicate Encryption)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解阿里云 OSS:强大的云存储解决方案

在现代互联网应用中,数据存储是一个不可忽视的环节。随着数据量的不断增长,传统的存储方式已经无法满足高速、低成本、大容量的需求。阿里云 OSS(对象存储服务)作为一种高性能、低成本且具备高度扩展性的云存储服务,已…

vue和react的diff算法区别?

Vue和React都使用了虚拟DOM和diff算法来优化渲染性能。但是它们在diff算法的实现上有一些区别。 Vue的patch过程: Vue的diff算法是基于snabbdom修改而来,但Vue进行了优化,例如使用了一个队列来批处理节点的更新,并对不同类型的节…

书生浦语·第四期作业合集

目录 1. Linux基础知识 1.1-Linux基础知识 1.在终端通过ssh 端口映射连接开发机 2. 创建helloworld.py 3.安装相关包并运行 4.端口映射并访问相关网页

小程序-基于java+SpringBoot+Vue的校园快递平台系统设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

【智商检测——DP】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…

鸿蒙面试 --- 1202 下

1、什么是层叠布局&#xff1f; 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素依次入栈&#xff0c;后一个子元…

MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景

在 SQL 中&#xff0c;连接&#xff08;JOIN&#xff09;是用于组合来自两个或更多表的行的一种方法。根据连接的方式不同&#xff0c;可以分为几种类型的连接&#xff1a;内连接&#xff08;INNER JOIN&#xff09;、外连接&#xff08;OUTER JOIN&#xff09;、左连接&#x…

CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)

通过网盘分享的文件&#xff1a;如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…

速盾:高防cdn支持自定义缓存KEY前缀吗?

速盾是一家专业的高防CDN&#xff08;Content Delivery Network&#xff09;服务提供商&#xff0c;为客户提供安全可靠的内容分发服务。在讨论高防CDN支持自定义缓存KEY前缀之前&#xff0c;我们先来了解一下CDN和缓存的概念。 CDN是一种通过将内容分布到全球多个节点上&…

使用flex布局实现一行固定展示n个元素

前言&#xff1a; 最近在公司中完成小程序的UI设计稿时&#xff0c;遇到了布局一个问题&#xff1a;UI设计稿想实现的布局是这样的&#xff1a; 笔者第一反应就是使用flex中的justify-content: space-between;属性&#xff0c;但是使用之后发现&#xff0c;justify-content: …

node.js基础学习-querystring模块-查询字符串处理(三)

一、前言 querystring是 Node.js 中的一个内置模块&#xff0c;主要用于处理 URL 查询字符串。它提供了一些实用的方法来解析和格式化查询字符串&#xff0c;使得在处理 HTTP 请求中的查询参数等场景时非常方便。 还可以防止sql注入 二、解析查询字符串&#xff08;parse方法&a…

AntFlow 0.20.0版发布,增加多数据源多租户支持,进一步助力企业信息化,SAAS化

传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大&#xff0c;也被企业广泛采用&#xff0c;然后也存着在诸如学习曲线陡峭&#xff0c;上手难度大&#xff0c;流程设计操作需要专业人员&#xff0c;普通人无从下手等问题。。。引入工作流引擎往往需要企业储…

IDL学习笔记(一)数据类型、基础运算、控制语句

近期&#xff0c;需要用到modis数据批量预处理&#xff0c;于是重新学习idl,感谢郭师兄推荐&#xff0c;以及张洋老师的详细教导。特以此为学习笔记&#xff0c;望学有所成。 IDL学习笔记&#xff08;一&#xff09; 数据类型数据类型创建数组类型转换函数代码输出print往文件…

【实体配置】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

vue3 基本使用

Vue 3 提供了多种方式来构建用户界面&#xff0c;包括选项式 API 和 Composition API。下面我将详细介绍 Vue 3 的基本使用和语法&#xff0c;主要集中在选项式 API 上&#xff0c;因为这对于初学者来说更容易上手。 1. 创建 Vue 项目 如果你还没有一个 Vue 项目&#xff0c;…

使用 Pytorch 构建 Vanilla GAN

文章目录 一、说明二、什么是 GAN&#xff1f;三、使用 PyTorch 的简单 GAN&#xff08;完整解释的代码示例&#xff09;3.1 配置变量3.2 、PyTorch 加速3.3 构建生成器3.4 构建鉴别器 四、准备数据集五、初始化函数六、前向和后向传递七、执行训练步骤八、结果 一、说明 使用…

Python酷库之旅-第三方库Pandas(251)

目录 一、用法精讲 1186、pandas.tseries.offsets.BusinessMonthEnd.is_year_start方法 1186-1、语法 1186-2、参数 1186-3、功能 1186-4、返回值 1186-5、说明 1186-6、用法 1186-6-1、数据准备 1186-6-2、代码示例 1186-6-3、结果输出 1187、pandas.tseries.offs…

Gazebo插件相机传感器(可订阅/camera/image_raw话题)

在仿真环境中使用相机传感器&#xff0c;通常需要结合Gazebo插件来实现。Gazebo是一个功能强大的机器人仿真工具&#xff0c;支持多种传感器模型&#xff0c;包括相机。下面是如何在Gazebo中使用相机传感器的详细步骤。 1. 修改Xacro文件以包含Gazebo插件 首先&#xff0c;修…

numpy快速入门

文章目录 前言导入numpy创建多维数组提取数组中的元素乘法求平均值求最大值最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;好久没发布新博客了&#xff0c;今天给大家带来的是numpy的快速入门&#xff0c;帮助大家用最短的时间快速学习使用numpy talk is cheap, show y…

爬虫专栏第二篇:Requests 库实战:从基础 GET 到 POST 登录全攻略

简介&#xff1a;本文聚焦 Requests 库的强大功能与应用实战。首先介绍其安装步骤及版本选择要点&#xff0c;随后深入讲解 GET 请求&#xff0c;以百度页面为例&#xff0c;展示如何发起基本 GET 请求、巧妙添加 headers 与参数以精准搜索&#xff0c;以及正确设置 encoding 避…