-2

我正在使用Charm-Crypto来了解 CP-ABE 方案。我正在测试这个方案:CPabe_BSW07Test。这是代码:

from charm.schemes.abenc.abenc_bsw07 import CPabe_BSW07
from charm.toolbox.pairinggroup import PairingGroup,GT
import unittest
class CPabe_BSW07Test(unittest.TestCase):
    def testCPabe_BSW07(self):    
        groupObj = PairingGroup('SS512')

        cpabe = CPabe_BSW07(groupObj)

        attrs = ['ONE', 'TWO', 'THREE']
        access_policy = '((four or three) and (three or one))'
        if debug: 
            print("Attributes =>", attrs); print("Policy =>", access_policy)

        (pk, mk) = cpabe.setup()

        sk = cpabe.keygen(pk, mk, attrs)

        print (groupObj)

        rand_msg = groupObj.random(GT) 
        if debug: print("msg =>", rand_msg)
        ct = cpabe.encrypt(pk, rand_msg, access_policy)
        if debug: print("\n\nCiphertext...\n")
        groupObj.debug(ct) 

        rec_msg = cpabe.decrypt(pk, sk, ct)
        if debug: print("\n\nDecrypt...\n")
        if debug: print("Rec msg =>", rec_msg)

        assert rand_msg == rec_msg, "FAILED Decryption: message is incorrect"
        if debug: print("Successful Decryption!!!")

if __name__ == "__main__":
    unittest.main()

我想了解如何计算私钥的位长度。我知道公式(在本文 BSW中),但我想检查它是否正确。例如,如果在 512 位上定义了一条曲线,并且我有 10 个属性,则关键位长为:(2*10+1)*512=10752 位。

4

2 回答 2

0

一种实用的方法是生成私钥(keygen),序列化,然后用 len() 计算位长。

于 2016-06-27T18:30:50.390 回答
0

BSW07 使用一对,对应于 Charm。密钥由for属性的元素组成。e: G0 x G0 → G1G1 x G1 → GT2*n+1G1n

单个元素g可以序列化

groupObj.serialize(g)

这会产生一个 Base64 编码的字符串。SS512 是这样的:

b'1:Nri028S0SySkDoN0JH1Lu6HQo/Jkhq7DCZHI1MUrHOuIgCONonN14GzmhwopYQOxnjOysclhYNOnsvCLjVDLggE='

该字符串中有65(解码的)字节(其中一个表示元素的符号),对应于没有符号的 512 位。

如果要反序列化字符串表示,可以使用

groupObj.deserialize(b64String)

实际大小可能会有所不同,具体取决于您是真的要存储此 Base64 表示还是自己将其转换为二进制。


文档

于 2016-02-21T12:52:59.880 回答