PBC Library Manual 0.5.14
作者Ben Lynn
BufferPools譯
目錄
前言
PBC庫是一個免費可移植的C語言庫,可以允許基於pairing的密碼系統的快速原型化。提供了一個雙線性對循環羣的抽象接口,使程序員不需要知道數學的細節便可以使用。
PBC庫是建立在GMP庫基礎之上的,並且PBC API收GMP API影響比較大。因此本手冊試圖模仿GMP手冊的那種感覺和視覺。
PBC庫主頁:https://crypto.stanford.edu/pbc/
GMP庫主頁:https://gmplib.org/
1.安裝PBC
PBC庫依賴GMP庫(https://gmplib.org/)。
構建系統已經經過測試,在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(這裏的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_開頭。
注:刪除線部分是翻譯不通順或者可能有錯誤的地方。