Charm-Crypto 中密钥的位长
Bit-length of Key in Charm-Crypto
我正在使用 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()
我想了解如何计算私钥的位长。我知道公式(在这个 paper BSW 中),但我想检查它是否正确。例如,如果在 512 位上定义了一条曲线,并且我有 10 个属性,则密钥位长为:(2*10+1)*512=10752 位。
BSW07 使用一对 e:G<sub>0</sub> x G<sub>0</sub> → G<sub>1 </sub>
,对应Charm中的G1 x G1 → GT
。密钥由 n
属性的 G1
的 2*n+1
个元素组成。
单个元素g
可以用
序列化
groupObj.serialize(g)
这会产生 Base64 编码的字符串。类似 SS512 的东西:
b'1:Nri028S0SySkDoN0JH1Lu6HQo/Jkhq7DCZHI1MUrHOuIgCONonN14GzmhwopYQOxnjOysclhYNOnsvCLjVDLggE='
这个字符串里面有65
个(解码后的)字节(其中一个表示元素的符号),对应512位没有符号。
如果要反序列化字符串表示,可以使用
groupObj.deserialize(b64String)
实际大小可能会有所不同,具体取决于您是真的要存储此 Base64 表示还是自己将其转换为二进制。
实用的方法是生成私钥(keygen),序列化,然后用len()计算位长。
我正在使用 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()
我想了解如何计算私钥的位长。我知道公式(在这个 paper BSW 中),但我想检查它是否正确。例如,如果在 512 位上定义了一条曲线,并且我有 10 个属性,则密钥位长为:(2*10+1)*512=10752 位。
BSW07 使用一对 e:G<sub>0</sub> x G<sub>0</sub> → G<sub>1 </sub>
,对应Charm中的G1 x G1 → GT
。密钥由 n
属性的 G1
的 2*n+1
个元素组成。
单个元素g
可以用
groupObj.serialize(g)
这会产生 Base64 编码的字符串。类似 SS512 的东西:
b'1:Nri028S0SySkDoN0JH1Lu6HQo/Jkhq7DCZHI1MUrHOuIgCONonN14GzmhwopYQOxnjOysclhYNOnsvCLjVDLggE='
这个字符串里面有65
个(解码后的)字节(其中一个表示元素的符号),对应512位没有符号。
如果要反序列化字符串表示,可以使用
groupObj.deserialize(b64String)
实际大小可能会有所不同,具体取决于您是真的要存储此 Base64 表示还是自己将其转换为二进制。
实用的方法是生成私钥(keygen),序列化,然后用len()计算位长。