如何在charm-crypto中计算组元素的位数?

时间:2017-10-18 21:24:20

标签: signature

我想使用“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

1 个答案:

答案 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}}。