我想使用“Hess - Efficient identity based signature schemes based on pairings.”的方案Charm-Crypto。
我需要计算组元素的位长(例如,siganture中的S2)。
据我所知this related question,序列化元素给我一个Base64编码的字符串。从那和this other question about Base64,我得出结论,我需要计算以下内容:
signature = {'S1' : S1, 'S2' : S2}
S2_serial = group.serialize(signature['S2'])
sigLenInBase64 = len(S2_serial)
sigLenInByte = (sigLenInBase64 *3)/4
sigLenInBit = sigLenInByte * 8
由于S2是G1的组元素,我希望大小与基础曲线的大小相同(因此'SS512'为512Bit,'MNT224'为224Bit等)。但是,'SS512'和'MNT224'(分别为540和252位)的大小相差28位,'MNT159'的大小相差21位。这是为什么?如何根据给定的曲线预测它将关闭多少?
我目前的猜测是,我没有考虑一些额外的信息(比如标志的字节)。
更新: 使用接受的答案,我现在可以正确计算这样的大小:
def compute_bitsize(base64_input):
b_padded = base64_input.split(str.encode(":"))[1]
pad_size = b_padded.count(str.encode("="))
b_len_without_pad = len(b_padded)-4
byte_len = (b_len_without_pad *3)/4 +(3-pad_size)-1
bit_len = byte_len * 8
return bit_len
答案 0 :(得分:1)
以SS512'为例进行序列化。来自question you link to。序列化字符串是:
1:Nri028S0SySkDoN0JH1Lu6HQo / Jkhq7DCZHI1MUrHOuIgCONonN14GzmhwopYQOxnjOysclhYNOnsvCLjVDLggE =
看看这一行:
PyObject * result = PyBytes_FromFormat("%d:%s",element-> element_type,(const char *)base64_data_buf);
从the source code for charm我们看到你感兴趣的字符串部分是
Nri028S0SySkDoN0JH1Lu6HQo / Jkhq7DCZHI1MUrHOuIgCONonN14GzmhwopYQOxnjOysclhYNOnsvCLjVDLggE =
按Wikipedia under 'Decoding Base64 with padding'所述对此进行解码,得到65个字节,其中一个字节是"字节,用于元素的符号"根据{{3}}。