PBC 库使用总结

常用函数解析

先总结下常用函数,更多函数介绍,请移步参考资料中的使用手册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//声明变量
pairing_t pairing;//声明一个对
element_t;//声明元素类型的变量
//初始化
pairing_init_inp_str(pairing,stdin);//以标准输入的形式,初始化配对类型变量
element_init_Zr(element_t e,pairing);//注意Z大写,将变量初始化为Zr中的元素
element_init_G1(element_t e,pairing);//初始化G1上的元素
elemrnt_init_G2(element_t e,pairing);
element_init_GT(element_t e,pairing);
//随机数选取
element_random(element_t e);//选择随机数
element_from_hash(element_t e, void *data, int len);//用来模拟特殊的hash函数,将hash值映射到群中。第一个参数为输出值,第二个为hash值,最后一个为hash的长度(字节)
//运算函数
element_add(element_t n, element_t a, element_t b);//加法,n=a+b
element_mul(element_t n, element_t a, element_t b);//乘法,n=a*b
element_mul_zn(element_t c, element_t a, element_t z);//域中的乘法运算,第三个参数必须为整数环zn中的元素。c=z*a,顺序不能改变
element_pow_zn(element_t x, element_t a, element_t n);//指数,x=a^n
element_pow2_zn(element_t x, element_t a1, element_t n1,element_t a2, element_t n2)//x=(a1^n)*(a2^n2),比分两次指数运算速度快
element_square(element_t n, element_t a);//平方,n=a^2
element_neg(element_t n, element_t a);//n=-a
element_invert();//取逆运算
element_pairing(element_t out, element_t in1, element_t in2);//对运算,e=(in1,in2)
pairing_apply(element_t out, element_t in1, element_t in2,pairing_t pairing);//对运算,不太清楚与上个函数的区别,计算结果没有取别
//其他函数
element_cmp();//比较,相等返回0,不等返回1
element_length_in_bytes();//返回变量的字节数
element_printf();//输出
pbc_get_time();//获取当前的系统时间,也可以用get_time()
element_clear();//释放变量内存
pairing_clear();//释放对内存

重点及易错点

  • 函数的输出参数通常在输入参数之前

  • 注意乘法运算的顺序,不能改变

  • 同一个变量在一次函数调用中既可以作输入也可以作输出。例如求逆函数 element_invert(t,t)->t=1/t

  • 变量使用前必须初始化,当不再使用时,必须释放资源。使用element_clean()pairing_clean()函数

  • 整数环中元素之间运算,结果还是整数环变量,整数环元素与群运算,结果为群变量。有点拗口,举个例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    element_t s,a,y,p,p_pub;//声明变量
    element_init_Zr(s);//初始化为zr中元素
    element_init_Zr(a);
    element_init_Zr(y);
    element_init_G1(p);//初始化为群G1上的元素
    init_init_G1(p_pub);
    element_random(s);//选取随机数
    element_random(a);
    element_random(p);
    element_mul_zn(p_pub,p,s);//p_pub=s*p,注意参数位置,不能颠倒
    element_mul_zn(y,a,s);//y=s*a

    例子中a,s,y为整数环 $Zr$ 中的元素,p为群上元素。$p{pub}=sp$ , $p_{pub}$ 也为群上元素。$y=sa$ , y为整数环 $Z_r$ 中的元素。群上元素其实就是椭圆曲线坐标,可以把整数环中元素当成整数,群上元素看成坐标,这样很容易就理解了。

    获取系统当前时间可以使用两个函数,get_time() 在 VC++ 6.0 中使用,Visual Studio 2012使用pbc_get_time() . 关于Visual Studio 2012的配置,参考我以前博客 win10下使用MINGW编译PBC库 如果使用cpp,可能会出现链接错误。因为有些库函数是用c语法编写,所以要更改部分函数,具体见 error LNK2019: 无法解析的外部符号之分析

    在获取程序运行时间时,库给出的函数总是不精确,找了很长时间也没找到原因。最终利用for循环运行500次,求平均,最终算是得到较为稳定的时间差。

参考资料

PBC library manual

赞赏是对作者最大的支持!
0%