PBC Library Manual 0.5.14
作者Ben Lynn
BufferPools译
目录
前言
PBC库是一个免费可移植的C语言库,可以允许基于pairing的密码系统的快速原型化。提供了一个双线性对循环群的抽象接口,使程序员不需要知道数学的细节便可以使用。
PBC库是建立在GMP库基础之上的,并且PBC API受GMP API影响比较大。因此本手册试图模仿GMP手册的那种感觉和视觉。
PBC库主页:PBC Library - Pairing-Based Cryptography - About
GMP库主页:The GNU MP Bignum Library
1.安装PBC
PBC库依赖GMP库(The GNU MP Bignum Library)。
构建系统已经经过测试,在Linux和Mac OS X上可以使用fink安装。
$ ./configure
$ make
$ make install
在Windows上,configure命令需要添加两个选项:
$ ./configure -disable-static -enable-shared
默认情况下库安装在/usr/local/lib中。在一些系统上,可能不在库路径中。解决此问题的一种方法是编辑/etc/ld.so.conf然后运行ldconfig。
1.1.简易Makefile
为了速度和简单性,在开发时使用simple.make。自然而然,这样做缺少便携性(portable)。
$ make -f simple.make
PBC使用了一些GNU的C拓展,例如嵌套函数(nested function)。
1.2.快速启动(Quick Start)
我们会使用如下符号。为了我们的目的,pairing是一个从两个循环群G1、G2到第三个群GT的双线性对映射,其中每个群都是素数r阶的。
运行 pbc/pbc 并且输入:
g := rnd(G1);
g;
第一行用于生成一个群G1中的随机元素,而第二行用于打印出g的值。(语法受到了bc的影响,bc是一种任意精度的计算器。)然后输入:
h := rnd(G2);
h;
将G2中的一个随机元素赋值给h。实际上,pbc使用的默认pairing是对称的,因此G1和G2实际上是相同的群,但是通常情况下G1和G2是不同的。要计算应用于g和h的pairing,输入:
pairing(g, h);
g和h都是 r阶的。接下来生成1-r的两个随机数:
a := rnd(Zr);
b := rnd(Zr);
根据双线性,这两条线输出的结果应该是相同的:
pairing(g^a, h^b);
pairing(g, h)^(a*b);
这个程序还有其他的功能,但是这里展示的命令足以快速和交互地实验许多使用实数的基于pairing的密码系统。
1.3.基本知识
使用PBC库的程序应该包含pbc.h:
#include <pbc.h>
并且与PBC库和GMP库进行连接,例如:
$ gcc program.c -L. -lpbc -lgmp
pbc.h文件已经包含了gmp.h。
PBC在一些方面遵循GMP:
- 输出参数通常位于输入参数之前。
- 同一个变量可以在一次调用中用作输入和输出。
- 在使用变量之前,变量必须已经被精确初始化。当不再需要这个变量时必须释放它。
为了提高效率,应该避免不必要的初始化和释放。(这个地方有点没翻译清楚,不理解该如何操作) - 以_t结尾的PBC变量的作用在函数调用时与GMP变量相同:
有效的作为调用引用(effectively as call-by references)(这里翻译不是很通顺,意思大概是相当于c中的引用参数)。换句话说,正如在GMP中,如果一个函数修改了一个输入变量,当把控制权返回给调用者时,该变量也会被修改。 - 与GMP类似,变量在需要时自动分配内存。默认情况下,会调用malloc()和friends,但是有时也可以更改。
- PBC函数大多是可重入的(可重入函数)。
- 因为PBC库是建立在GMP库之上的,所以可以使用GMP的数据类型。PBC类型类似于GMP类型。下面的例子改编自GMP手册中的一个例子,并展示了如何声明PBC数据类型element_t。
element_t sum;
struct foo {element_t x, y;};
element_t ver[20];
GMP的mpz_t类型用于整数,mpq_t用于有理数等等。相比之下,PBC对于不用的代数结构(例如椭圆曲线群、多项式环、有限域)中的元素使用element_t数据类型。函数假定他们的输入来自适当的代数结构。
PBC数据类型和函数可以分为一下几类。仅前两个就可以满足一系列应用程序。
- element_t:代数结构中的元素。
- pairing_t:元素所属的pairing;可以从PBC附带的param子目录中的示例pairing参数初始化。
- pbc_param_t:用于生成pairing参数。
- pbc_cm_t:用CM方法构造曲线的参数;有时在pbc_param_t中需要。
- field_t:代数结构:群、环、域;在pairing_t内部使用。
- 一些杂项函数,例如控制如何生成随机位的函数。
操作给定数据类型的函数通常具有相同的前缀,例如,与element_t有关的对象以element_开头。
注:删除线部分是翻译不通顺或者可能有错误的地方。