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.rhkb.cn/news/483538.html

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

相关文章

计算机网络——不同版本的 HTTP 协议

介绍 HTTP,即超文本传输协议(HyperText Transfer Protocol),是应用层的一个简单的请求-响应协议,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

Linux——基础命令(2) 文件内容操作

目录 ​编辑 文件内容操作 1.Vim (1)移动光标 (2)复制 (3)剪切 (4)删除 (5)粘贴 (6)替换,撤销,查找 (7&#xff…

嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压

引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…

30分钟学会正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 作用 匹配 查看一个字符串是否符合正则表达式的语法 搜索 正…

如何手搓一个智能激光逗猫棒

背景 最近家里的猫胖了,所以我就想做个逗猫棒。找了一圈市场上的智能逗猫棒,运行轨迹比较单一,互动性不足。 轨迹单一,活动范围有限 而我希望后续可以结合人工智能物联网,通过摄像头来捕捉猫的位置,让小…

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中,递归的实现会占用内存栈(Call Stack),每次递归调用都会在栈上分配一个新的 “栈帧(Stack Frame)”,用于存储本次调用的函数局部变量、返回地…

Bert+CRF的NER实战

CRF(条件随机场-Conditional Random Field) 原始本文:我在北京吃炸酱面 标注示例(采用BIO标注方式): 我O在O北B-PLA京I-PLA吃O炸B-FOOD酱I-FOOD面I-FOOD CRF: 目的:提出一些不可能…

pycharm链接neo4j数据库(简单)

1.安装pycharm 2.安装库 pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 3.代码试运行 from py2neo import Graph, Node, Relationship# 连接到Neo4j数据库,使用Bolt协议 graph Graph("bolt://localhost:7687", auth("neo…

故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab) 源码设计 %% 初始化 clear close all clc disp(此程序务必用2023b及其以上版本的MATLAB!否则会报错!) warning off %

flask的第一个应用

本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由无参形式有参形式 参数类型不同的http方法本文小结 简单实例 flask的依赖包都安装好之后,我们就可以写一个最简单的web应用程序了,我们把这个应用程序命名为first.py: from fl…

jmeter 压测常用静默参数解释应用

简介: JMeter静默压测(即无界面压测)是一种常用的性能测试方法,用于模拟多个用户同时访问系统并测量系统的响应时间和吞吐量等关键性能指标。在JMeter静默压测中,常用的压测参数及其解释如下: 一、基本…

《Python基础》之Pandas库

目录 一、简介 二、Pandas的核心数据结构 1、Series 2、DataFrame 三、数据读取与写入 1、数据读取 2、数据写入 四、数据清洗与处理 1、处理缺失值 2、处理重复值 3、数据转换 五、数据分析与可视化 1、统计描述 2、分组聚合 3、数据可视化 六、高级技巧 1、时…

【C语言】结构体(四)

本篇重点是typedef关键字 一,是什么? typedef用来定义新的数据类型,通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二,为什么&#xf…

12月2日星期一今日早报简报微语报早读

12月2日星期一,农历十一月初二,早报#微语早读。 1、公安部:全国机动车所有人12月2日起均可申领电子行驶证; 2、2025年国考笔试开考:参考率约为86.7%,约65人录1人; 3、今日头条、拼多多等9款A…

Navicat连接SQL Server及SpringBoot连接SQL Server(jtds)

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录,找到安装程序,安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接,提示连接成功。 Spr…

【机器学习】CatBoost 模型实践:回归与分类的全流程解析

一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS:转载自己的文章也算原创吧。 在机器学习领域,CatBoost 是一款强大的梯度提升框架,特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…

用三维模型的顶点法向量计算法线贴图

法线贴图的核心概念是在不增加额外多边形数目的情况下,通过模拟细节来改善光照效果。具体流程包括: 法线的计算与存储:通过法线映射将三维法线向量转化为法线贴图的 RGB 值。渲染中的使用:在片段着色器中使用法线贴图来替代原有的…

Hadoop分布式文件系统(二)

目录 1. 引言1. Hadoop文件操作命令2. 部分常用的Hadoop FS Shell命令2.1 ls列出文件2.2 mkdir创建目录2.3 put上传文件2.4 cat查看文件2.5 get复制文件2.6 rm删除文件 3. Hadoop系统管理命令4. HDFS Java API 示例参考 1. 引言 大多数HDFS Shell命令的行为和对应的Unix Shell命…

ESP32-S3模组上跑通ES8388(13)

接前一篇文章:ESP32-S3模组上跑通ES8388(12) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析了es8388_init函数中的第6段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在…

LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)

光照 glm::vec3 lightColor(0.0f, 1.0f, 0.0f); glm::vec3 toyColor(1.0f, 0.5f, 0.31f); glm::vec3 result lightColor * toyColor; // (0.0f, 0.5f, 0.0f); 说明:当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。 创建…