在基于椭圆曲线的CPABE格式中如何计算多项式?

2024-09-24 12:21:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Charm密码库Charm实现论文CPABE based on Elliptic Curves中提出的CPABE方案。我已经正确地编写了setup函数,但是KeyGen、Encrytp和Decrypt函数在生成不同的多项式时遇到了问题。有什么建议吗?你知道吗

我假设属性宇宙和用户属性分别为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考虑所有不在用户属性集中的属性,并在(attrs\u universe-user\u 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)

Tags: 属性grouprandomattrssuattrpkmk