本文介绍了属性加密(ABE)在电信行业后量子密码学中的应用,重点介绍了基于属性的加密(CP-ABE)的密文策略以及其在密钥封装机制(KEMs)中的应用,通过属性策略控制密钥的访问,以增强安全性。文章还提供了一个CP-ABE的示例代码和在线演示。
正如你可能知道的,一些电信行业在网络安全方面远远落后于世界其他地区,GSM 网络通常停留在较弱的密码学方法上。但由于量子计算机的威胁,这种情况正在发生变化。就在今天,欧洲电信标准协会 (ETSI) 发布了一个新的框架,该框架支持密钥封装机制 (KEM) [ 这里]:
该标准定义了一种混合方法,该方法支持前量子和后量子方法——被称为混合方法。有了这个,创建的密钥将被封装与用户属性,但这些属性是匿名的。因此,用户必须在封装策略中提供其属性,并且它将检索密钥。如果用户无法提供正确的属性,这些属性将无法访问目标密钥。
显然,某些用户可能具有相同的属性,例如 CTR(国家/地区)=EN、DPT(部门=DEV)和 SEC(安全)=LOW。为此,该方案使用一种跟踪设施,其中跟踪权限可以区分具有相同属性的用户。
通过 KEM(密钥封装方法),我们可以生成会话密钥,然后使用接受者的公钥保护它,以便私钥可以随后用于解密它。使用的方法是传统的公钥方法以及后量子鲁棒封装,它定义了混合方法。
过程是:
我们可以看到 Alice 生成密钥对并将公钥传递给 Bob。然后,Bob 将封装 Alice 的公钥,这将生成一个密钥 (k) 和一个密码 (c)。Bob 将密码传递给 Alice,然后她使用密码和她的私钥解封此密码以显示密钥 (k)。
然后,基于属性的加密用于定义如何恢复密钥。如果属性不匹配,则无法恢复密钥。这样,可以应用策略来显示会话密钥。对于新的混合 KEM,我们使用 ciphertext-policy ABE (CP-ABE),它提供了良好的性能。
该方法定义为带有访问控制的 KEM (KEMAC),其中密钥通过密钥策略 (Y) 颁发,然后会话密钥通过封装策略 (X) 封装。然后,用户只有在 R(X,Y)=1 的情况下才能解封装会话密钥,其中 R() 是策略 X 和 Y 的布尔规则。这可以包括 AND、OR 和 NOT 运算。
通过 CP-ABE,我们可以根据策略和一组属性生成加密密钥。在这种情况下,我们只能使用正确的属性生成正确的解密密钥。我们将实施的政策是:
((location: edinburgh) and (service: payment)) or (role: admin))
这意味着如果用户在爱丁堡并且正在进行付款,那么他们将能够解密加密的消息。如果他们具有“admin”角色,他们也可以解密它。所有其他情况都不允许创建加密密钥。
我们将使用的方法由 Tomida 等人定义 [1]:
通过此方法,我们创建一个公钥来加密我们的消息,然后创建一个密钥(私钥)来解密它。只有当用户可以提供所需的属性来匹配策略时,我们才能生成所需的私钥来解密加密的内容。然后,我们最终得到一个密钥策略 (KP) 并实施一个 ciphertext-policy (CP) ABE 方法。总的来说,处理 KP 是为了识别策略中的冗余部分,例如:
(location: edinburgh and service: payment) or (location: edinburgh or service:withdrawl)
它变为:
(location: edinburgh or service:withdrawl)
大纲代码是 [ 这里]:
package main
import (
"bytes"
"crypto/rand"
"fmt"
"log"
"os"
cpabe "github.com/cloudflare/circl/abe/cpabe/tkn20"
)
func checkPolicy(in map[string][]string) bool {
possiblePairs := map[string][]string{
"location": {"edinburgh", "glasgow", "stirling","aberdeen"},
"service": {"payment", "withdrawl", "balance"},
"role": {"admin", "production", "sales"},
}
isValid := func(key string, value string) bool {
vs, ok := possiblePairs[key]
if !ok {
return false
}
for _, v := range vs {
if value == v {
return true
}
}
return false
}
for k, v := range in {
for _, value := range v {
if !isValid(k, value) {
return false
}
}
}
return true
}
func main() {
argCount := len(os.Args[1:])
msg := `Message`
location:="edinburgh"
service:="payment"
role:="admin"
policyStr := `((location: edinburgh) and (service: payment)) or (role: admin) `
if (argCount>0) {msg= os.Args[1]}
if (argCount>1) {location= os.Args[2]}
if (argCount>2) {role= os.Args[3]}
if (argCount>3) {service= os.Args[4]}
if (argCount>4) {policyStr= os.Args[5]}
attrsMap := map[string]string{"location":location, "service": service, "role": role}
fmt.Printf("Policy: %s\n",policyStr) // 策略
fmt.Printf("Attributes. Location: %s, Service: %s, Role: %s\n\n",location,service, role) // 属性。 位置:%s,服务:%s,角色:%s
publicKey, secretKey, err := cpabe.Setup(rand.Reader)
if err != nil {
log.Fatalf("%s", err)
}
p,_:=publicKey.MarshalBinary()
fmt.Printf("Public key (64 bytes): %+x\n",p[:64] ) // 公钥(64字节)
p,_=secretKey.MarshalBinary()
fmt.Printf("Private key (64 bytes): %+x\n",p[:64] ) // 私钥(64字节)
policy := cpabe.Policy{}
err = policy.FromString(policyStr)
if err != nil {
fmt.Printf("\nError in policy") // 策略错误
}
if checkPolicy(policy.ExtractAttributeValuePairs()) {
fmt.Printf("\nPolicy works\n") // 策略有效
}
ct, _ := publicKey.Encrypt(rand.Reader, policy, []byte(msg))
attributes := cpabe.Attributes{}
attributes.FromMap(attrsMap)
SecretKey, _ := secretKey.KeyGen(rand.Reader, attributes)
rightSat := policy.Satisfaction(attributes)
if !rightSat {
fmt.Printf("\nAttributes match policy") // 属性匹配策略
}
canDecrypt := attributes.CouldDecrypt(ct)
if canDecrypt == true {
fmt.Printf("\nDecryption should work") // 解密应该有效
}
pt, _ := SecretKey.Decrypt(ct)
if !bytes.Equal(pt, []byte(msg)) {
fmt.Printf("\nPlaintext not recovered") // 纯文本未恢复
} else {
fmt.Printf("\nPlaintext recovered successfully: %s", pt) // 纯文本已成功恢复
}
}
总的来说,该策略使用基于配对的密码学。因此,我们有一个公钥 (pk)、一个私钥 (sk) 和 ciphertext (ct):
其中我们在策略中有 n 个标签(每个标签用 i 表示),alpha 是总体密钥。如果你想了解更多关于基于配对的密码学,请尝试 这里。对于符合策略的内容:
Policy: ((location: edinburgh) and (service: payment)) or (role: admin)
Attributes. Location: edinburgh, Service: payment, Role: sales
Public key (64 bytes): 040604000200151468347a05d99fea93226a6cb8e27a08d701fe1403d82bc2c91e5c0dfaf5e98d85dce43f1e337989b5a9d4dfcb39e0105b9aaa8b763825fec2
Private key (64 bytes): c400030002000f4c4f86d6b8bb1e19131e71898c6eed7fe0ceddd6fc40429cc7b2f534389f0d0000000000000000000000000000000000000000000000000000
Policy works
Decryption should work
Plaintext recovered successfully: My message
和“admin” [ 这里]:
Policy: ((location: edinburgh) and (service: payment)) or (role: admin)
Attributes. Location: glasgow, Service: payment, Role: admin
Public key (64 bytes): 0406040002001769642282666a2cc054b059b3785d38397e4871c216f3aaf292ca3e6fbf01b885c65038712a141f5dd5bf413efedceb0230b77e3ce1367fb8a9
Private key (64 bytes): c4000300020073ba919191d5aa357cd57670c9da805f810da99141c598a07bb1d44acdce06210000000000000000000000000000000000000000000000000000
Policy works
Decryption should work
Plaintext recovered successfully: My message
以及一个不匹配的策略 [ 这里]:
Policy: ((location: edinburgh) and (service: payment)) or (role: admin)
Attributes. Location: stirling, Service: payment, Role: production
Public key (64 bytes): 040604000200010eff9555a2c03f8b8488c8eb32db7daa853454d897a03218f82c168ae43ee65541b15cda9b845e35b5e25cef0aa144026dd869a63c56d2f216
Private key (64 bytes): c40003000200499b969f303bf8a18d0855056b296925d218392aae8f1492da26152edbe233b50000000000000000000000000000000000000000000000000000
Policy works
Attributes match policy
Plaintext not recovered
你可以在此处运行演示 [ 这里]:
如果你对 ABE 感兴趣,这里有该方法的发明者之一:
Bill Buchanan OBE
•
[1] Tomida, J., Kawahara, Y., & Nishimaki, R. (2021). Fast, compact, and expressive attribute-based encryption. Designs, Codes and Cryptography, 89, 2577–2626
- 原文链接: medium.com/asecuritysite...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!