我正在使用 Charm Crypto Library Charm实施基于椭圆曲线的论文 CPABE中提出的 CPABE 方案。我已经正确编写了设置函数,但是在生成不同多项式的 KeyGen、Encrytp 和 Decrypt 函数中遇到问题。对此有何建议?
我假设属性 Universe 和用户属性分别为 10 和 5 个属性,如下所示:
attrs_universe = ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'TEN']
user_attrs = ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE']
以下是 Setup 和 KeyGen 的代码:
设置
@Output(pk_t, mk_t)
def setup(self, U):
g, h, sec = group.random(G1), group.random(G1), group.random(G1)
alphaZ, k1Z , k2Z= group.random(ZR), group.random(ZR), group.random(ZR)
# initialize pre-processing for generators , 'H':group.hash
g.initPP(); h.initPP()
P_i, U_i, V_i = {}, {}, {}
for attr in U:
P_i[attr] = g * ( group.hash(attr, G1) ** alphaZ )
U_i[attr] = P_i[attr] * k1Z
V_i[attr] = P_i[attr] * k2Z
pk = { 'g':g, 'h':h, 'Pi':P_i, 'Ui':U_i, 'Vi':V_i, 'U':U, 'sec':sec }
mk = {'alphaZ':alphaZ, 'k1Z':k1Z, 'k2Z':k2Z }
return (pk, mk)
KeyGen KeyGen 考虑所有不在用户属性集中的属性,并在 (attrs_universe - user_attrs) 集上生成多项式
@Input(pk_t, mk_t, [str])
@Output(sk_t)
def keygen(self, pk, mk, S):
prodPolyKG =1
ru = group.random(G1)
tu = group.random(G1)
for attr in S:
tempPolyKG = pk['h'] + group.hash(attr, G1)
prodPolyKG = prodPolyKG * tempPolyKG
prodPolyKG_invert = 1/prodPolyKG
# Computing su
#k2ruInvert = 1/ (mk['k2Z'] * ru)
k2ru = mk['k2Z'] * ru
suTemp = prodPolyKG_invert - k2ru
suTemp1 = 1/mk['k1Z']
su = suTemp * suTemp1
#Computing u1 and u2
u1Temp = mk['k1Z'] * tu
u1 = ru + u1Temp
u2Temp = mk['k2Z'] * tu
u2 = su - u2Temp
#sk = { 'poly':prodPolyKG, 'polyInvert':prodPolyKG_invert,'k2':k2ru, 'su':su , 'u1':u1, 'u2':u2, 'S':S }
sk = { 'u1':u1, 'u2':u2, 'S':S }
return (sk)