公钥可搜索加密及其python 实现
⽬录
公钥可搜索加密公钥可搜索加密(Public-Key Encryption with Keyword Search,简称PEKS)定义如下:
:初始化算法,输⼊安全参数,获取私钥和公钥。
:关键词加密算法,输⼊公钥和⽂档关键词,输出⽂档关键词对应的密⽂。
:陷门⽣成算法,输⼊私钥和搜索关键词,输出搜索关键词对应的陷门。
:测试算法,输⼊陷门和密⽂,输出布尔变量,当陷门和密⽂对应同⼀关键词时,否则。PEKSBoneh2004⽅案构造如下:
令为双线性对,两个函数和为哈希函数。
:输⼊安全参数,该安全参数决定和的阶,随机挑选 和的⽣成元,输出和。:输⼊公钥和关键词,随机挑选,计算,输出。
:
输⼊私钥和关键词,输出。
:输⼊陷门和密⽂,记密⽂为,若,输出,否则输出。
定义数组方法验证正确性:,进⼀步有。
直觉上(⾮理论层⾯,⾮严谨数学思维)对⽅案构造安全性进⾏分析:将当成随机谕⾔机,利⽤的单向性,敌⼿很难根据逆推出,同样很难根据逆推出。
为什么不直接使⽤和的形式?注意,在该形式中,即使敌⼿没有私钥,它同样也可以⽣成有效陷门;但在PEKSBoneh2004⽅案中,若没有私钥,那么它⽆法⽣成正确的陷门。
为什么不直接使⽤和的形式,然后在加密⽅和搜索⽅共享⼀条密钥?注意,该形式存在密钥管理问题,若有个加密⽅,那么搜索⽅需要将共享给这个加密⽅,加密⽅有可能是普通⽤户,不具备安全⾼防性,其易遭受⿊客攻击,从⽽泄露。对⽐之下,在PEKSBoneh2004⽅案中,加密⽅仅需持有公钥,私钥泄露的风险⼤⼤减⼩。
并且上述两个做法对应的是固定的,若两个加密⽅同时加密同⼀,那么它们产⽣的两个密⽂是完全⼀样的,这显得有点不“安全”,监听者⽆需攻击服务器(⼀般假设云服务器具有安全⾼防性,需重点防范的是监听),仅需监听数据就可以⾃⼰对密⽂相关性进⾏⼀个分析。⼀种粗糙的应对策略是利⽤服务
器的⼆次加密,但这样做服务器需要维护⼀条公钥,这增加了云服务商的花费开销,显得有点“不理想”。云服务商可能仅想提供计算服务,由搜索⽅⾃⼰去维护⾃⼰的公钥。(⾄于防陷门监听,可以利⽤对称加密AES,注意,公钥可搜索加密在上传密⽂阶段是对,⽽在搜索阶段是对。)密码⼯具库
PEKSBoneh2004⽅案⽤到双线性对,这⾥推荐⼀个实⽤的python密码⼯具库charm-crypto,该⼯具库由约翰斯·霍普⾦斯⼤学科研⼈员开发,© Copyright 2013, Johns Hopkins University ISI. Last updated on Feb 20, 2018. 写论⽂若使⽤该⼯具进⾏科研实验,请在Reference中标明
PEKSBoneh2004⽅案代码实现
#coding=utf-8
from charm .toolbox .pairinggroup import PairingGroup , ZR , G1, G2, GT , pair
import hashlib
python基础代码大全黑客Hash1pre = hashlib .md5
Setup (1)→λ(sk ,pk )1λsk pk Enc (pk ,w )→c w c TdGen (sk ,w )→td w td Test (td ,c )→b b b =1b =0e :G ×1G →1G 2H :1{0,1}→∗G 1H :2G →2{0,1}log p Setup G 1G 2p α←Z p ∗
G 1g pk :=[g ,h =g ]αsk :=αEnc r ←Z p ∗t :=e (H (w ),h )1r c :=[g ,H (t )]r 2TdGen td :=H (w )1αTest c =[c ,c ]12H (e (td ,c ))=c 212b :=1b :=0e (td ,c )=1e (H (w ),g )=1αr e (H (w ),g )=1αr e (H (w ),h )1r H (e (td ,c ))=c 212H 1H 1A td w c w c :=H (w )td :=H (w )A αtd A αtd c :=H (k ,w )td :=H (k ,w )k n k n k w c w pk ′c pk ′
pk n 111
Hash1pre = hashlib.md5
def Hash1(w):
# 先对关键词w进⾏md5哈希
hv = Hash1pre(str(w).encode('utf8')).hexdigest()
print(hv)
# 再对md5值进⾏group.hash哈希,⽣成对应密⽂
蜂王胎冻干片哪些人不能吃# 完整的Hash1由md5和group.hash组成
hv = group.hash(hv,type=G1)
return hv
Hash2 = hashlib.sha256
def Setup(param_id='SS512'):
# 代码符号G1 x G2 → GT
group = PairingGroup(param_id)
# ⽅案选⽤的是对称双线性对,故G2 = G1
g = group.random(G1)
alpha = group.random(ZR)
# ⽣成私钥与公钥并进⾏序列化
# Serialize a pairing object into bytes
sk = group.serialize(alpha)
pk =[group.serialize(g), group.serialize(g ** alpha)]
return[sk, pk]
def Enc(pk, w, param_id='SS512'):
group = PairingGroup(param_id)
# 进⾏反序列化
g, h = group.deserialize(pk[0]), group.deserialize(pk[1])
r = group.random(ZR)
t = pair(Hash1(w), h ** r)
c1 = g ** r
c2 = t
# 对密⽂进⾏序列化
print(group.serialize(c2))
return[group.serialize(c1), Hash2(group.serialize(c2)).hexdigest()]
def TdGen(sk, w, param_id='SS512'):
executive secretaries电影group = PairingGroup(param_id)
sk = group.deserialize(sk)
td = Hash1(w)** sk
# 对陷门进⾏序列化
return group.serialize(td)
def Test(td, c, param_id='SS512'):
group = PairingGroup(param_id)
c1 = group.deserialize(c[0])
c2 = c[1]
print(c2)
td = group.deserialize(td)
return Hash2(group.serialize(pair(td, c1))).hexdigest()== c2
if __name__ =='__main__':
# 'SS512'是对称双线性对
param_id ='SS512'
[sk, pk]= Setup(param_id)
group = PairingGroup(param_id)
c = Enc(pk,"yes")
td = TdGen(sk,"yes")
assert(Test(td, c))
td = TdGen(sk,"no")
assert(not Test(td, c))
c = Enc(pk,"Su*re")
assert(not Test(td, c))
syntax意思assert(not Test(td, c))
c = Enc(pk,"no")
assert(Test(td, c))
c = Enc(pk,9**100)
td = TdGen(sk,9**100)
assert(Test(td, c))
td = TdGen(sk,9**100+1)
assert(not Test(td, c))
Reference
[1] Dan Boneh, Giovanni Di Crescenzo, Rafail Ostrovsky, et al. Public Key Encryption with Keyword Search[C]// Advances in Cryptology - EUROCRYPT 2004, International Conference on the Theory and Applications of Cryptographic Techniques, Interlaken, Switzerland, May 2-6, 2004, Proceedings. 2004.
this的读音[2] 双线性对映射 概念理解
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论