当前位置: 首页 > article >正文

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 keys
 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
 }

 // Policy vector
 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])})

 // 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 user
 userGID := "Bob"
 // Setup user vector. To decrypt, the users and policy vector must be orthogonal
 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])})

 // Generate keys from authorities
 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)
  }
 }
 // Decryption by the user
 msgRecovered, 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.kler.cn/a/420679.html

相关文章:

  • 十,[极客大挑战 2019]Secret File1
  • qt QToolBox详解
  • SpringBoot3.4.0和OpenFeign4.1.4不兼容
  • Google Cloud 混合云部署连接方式最佳实践案例讲解
  • 营业执照 OCR 识别 API 的发展前景
  • 使用无监督机器学习算法进行预测性维护
  • linux 压缩命令,压缩a目录,但是不压缩a目录下的b目录,zip命令
  • termius mac版无需登录注册直接永久使用
  • Mybatis 复习
  • MySQL 数据库学习教程二:深入 MySQL 数据库世界
  • uniapp进阶技巧:如何优雅地封装request实例
  • 《嵌入式硬件设计》
  • 架构学习第五周--Kubernetes(一)
  • python基础(六)
  • 依赖注入之登录验证(Java EE 学习笔记08)
  • [JuMP.jl] 线性规划
  • 107.【C语言】数据结构之二叉树求总节点和第K层节点的个数
  • 针对Qwen-Agent框架的Function Call及ReAct的源码阅读与解析:Agent基类篇
  • 人证合一开启安全认证新时代、C#人证合一接口集成、人脸识别
  • 第一部分:基础知识 3. 数据类型 --[MySQL轻松入门教程]
  • 实战优化公司线上系统JVM:从基础到高级
  • 《Vue零基础入门教程》第十三课:条件渲染
  • PowerShell:查找并关闭打开的文件
  • Modern Effective C++ 条款二十三:理解std::move和std::forward
  • java 网络编程 详解
  • 数据结构判断两棵树是否相等