返回

基于属性的加密

概述

基于属性的加密(attribute-based ecryption, ABE)根据属性加密消息,无需关注接收者的身份,只有符合属性要求的用户才能解密密文,保证了数据的机密性。此外,ABE中的用户密钥与随机多项式或随机数相关,不同用户的密钥无法联合,防止用户合谋攻击。

但是由于基本的ABE无法支持灵活的访问控制策略,在ABE基础上,Goyal等人提出了KP-ABE(Key-Policy Attribute-Based Encryption,密钥策略属性基加密系统),密文对应于属性集合,而密钥对应于访问结构,解密当且仅当属性集合中的属性能够满足此访问结构。这种设计比较接近静态场景,此时密文用与其相关的属性加密存放在服务器上,当允许用户得到某些消息时,就分配一个特定的访问结构给用户,适用于视频点播、数据库访问。

访问结构(access structure):访问结构是安全系统研究的术语,系统的访问结构是指被授权的集合的结构。

而后,Bethencourt等人提出了CP-ABE(Ciphertext-Policy Attribute-Based Encryption,密文策略属性基加密系统),密文对应于访问结构,而密钥对应于属性集合,解密当且仅当属性集合中的属性能够满足此访问结构。这种设计比较接近于现实中的应用场景,可以假象每个用户根据自身条件或者属性从属性机构得到密钥,然后加密者来制定对消息的访问控制,信息拥有者可以规定密文访问策略,适用于消息分发场景。

CP-ABE

算法流程

CP-ABE包含了四个基本算法:Setup、Encrypt、KeyGen、Decrypt

  • Setup:只接受隐式的安全参数作为输入。输出公共密钥 PK 和主密钥 MK 。
  • Encrypt(PK, M, A):输入 PK,消息 M 和访问结构 A,对 M 进行加密,产生密文 CT。
  • Key Generation(MK, S):输入主密钥 MK 和描述密钥的属性集合 S,输出私钥 SK。其中,SK 由属性来确定。
  • Decrypt(PK, CT, SK):输入公共密钥 PK、包含访问结构 A 的密文 CT,以及私钥 SK。注意这里的私钥由属性集合 S 生成。如果 S 能够满足 A,则对 CT 进行解密并返回消息 M。

应用

传统公钥体系中公钥和私钥一一对应,需要使用接收者的公钥进行加密,接收者再使用自己的私钥进行解密。使用传统公钥体系分发消息时,需要为所有接收者进行一次加密操作。ABE属于公钥加密体系,但是与其他公钥算法不同的是,ABE的加密不需要使用特定接收者的公钥,而是使用属性来规定密文的访问策略,这样就避免了对同一消息的多次加密操作,因此适用于一对多的消息分发场景。

在分布式系统中,通常需要可信服务器存储访问控制系统所需要的数据,但是这些服务器一旦被攻陷,数据也就不再安全。而使用CP-ABE加密之后,可以提高数据的安全性,即使服务器不可信,也能保证信息不泄露。

此外,由于CP-ABE允许数据加密方规定访问结构,并且访问结构中的属性具有逻辑关系,因此可以满足细粒度的访问控制需求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main

import (
    "fmt"
    "github.com/fentec-project/gofe/abe"
)

func main() {
    inst := abe.NewFAME()

    // 生成公共密钥和主密钥
    pubKey, masKey, err := inst.GenerateMasterKeys()
    if err != nil {
        fmt.Println("生成公共密钥和主密钥失败")
        panic(err)

    }

    // 明文数据信息
    msg := "我是敏感数据,解密后才能看到哦~"

    // 构造策略信息
    // "((0 AND 1) OR (2 AND 3)) OR 5",
    msp, err := abe.BooleanToMSP("((清华 AND 计算机) OR (北大 AND 数学)) OR 西电", 
                                 false)
    if err != nil {
        fmt.Println("构造策略信息失败")
        panic(err)
    }

    // 生成密文数据
    cipher, err := inst.Encrypt(msg, msp, pubKey)
    if err != nil {
        fmt.Println("生成密文数据失败")
        panic(err)
    }

    // 解密时构造属性
    //gamma := []string{"清华", "计算机"} // true
    //gamma := []string{"计算机"} // false
    gamma := []string{"西电"} // true

    // 生成私钥
    secKeys, err := inst.GenerateAttribKeys(gamma, masKey)
    if err != nil {
        fmt.Println("构造解密私钥失败")
        panic(err)
    }

    //解密
    msgCheck, err := inst.Decrypt(cipher, secKeys, pubKey)
    if err != nil {
        fmt.Println("解密失败")
        panic(err)
    }

    fmt.Println(msgCheck)
}

参考文献

基于属性的加密算法(一)——CP-ABE

CP-ABE和KP-ABE

Golang CPABE 调用示例

Built with Hugo
Theme Stack designed by Jimmy