目錄
3.Pairing 函數
使用之前首先要初始化pairing對象,初始化時PBC會設置曲線、羣和其它數學雜項。初始化結束之後可以初始化元素並對其進行密碼操作。
PBC庫的param子目錄中包含了各種pairing的參數,其中一些適合於密碼使用。在gen子目錄中的一些程序可以用於生成參數(詳細參見第七章),或者到PBC網站了解更多pairing參數。
Pairing設計三個素數階羣,PBC庫中稱爲G1、G2、GT,用r表示階數。Pairing是雙線性映射(bilinear map),分別從G1、G2中各取一個元素作爲輸入,輸出一個GT中的元素。
G2中的元素至少和G1中的一樣長,G1必須爲兩者中較短的一個。(不確定是羣元素一樣長還是個數一樣多)有時G1和G2是相同的羣(即pairing是對稱的),因此他們的元素可以自由的混合。在這種情況下pairing_is_symmetric函數返回1。
雙線性對(bilinear pairing)被存儲在pairing_t數據類型中,用於處理雙向性對的函數以pairing_爲前綴。
3.1.初始化pairing
使用ASCIIZ字符串初始化pairing:
pairing_t pairing;
pairing_init_set_str(pairing, s); //s是一個 char *
這裏的字符串s以文本格式保存pairing parameters(pairing參數),param子目錄中包含了幾個示例。
與上面的二選一(兩種初始化方法,第二種直接讀取寫好的參數):
pairing_t pairing;
pairing_init_pbc_param(pairing, param);
其中的param參數是一個初始化了的pbc_param_t(見第五章)。
函數原型:
int pairing_init_set_str(pairing_t pairing, const char *s)
使用一個ASCIIZ字符串str初始化pairing,成功返回0,失敗返回1。
int pairing_init_set_buf(pairing_t pairing, const cahr *s, size_t len)
功能類似,但是最多讀取len個字節(byte)。如果len爲0,則與前面的函數相同。成功返回0,失敗返回1。
void pairing_init_pbc_param(struct pairing_s *pairing, pbc_param_t p)
通過pairing參數p初始化pairing。
void pairing_clear(pairing_t pairing)
釋放pairing所佔用的空間。當不在需要pairing_t變量時調用,只有釋放了與pairing相關的所有元素後纔可以調用這個函數,因爲他們需要pairing結構中的信息。
3.2.應用pairing
可以調用pairing_apply函數應用(apply)雙向性對映射。參數的輸入順序十分重要。第一個用於保存輸出,必須來自GT羣。第二個必須來自G1羣,第三個來自G2羣,第四個必須是一個關聯它們的pairing_t變量。
在某些應用中,程序員可能知道,許多具有相同G1輸入的pairing將會被計算。如果是這樣,應該使用預處理來避免重複計算,以節省時間。一個pairing_pp_t的變量應該被聲明,使用固定的G1元素初始化,然後用於計算pairing:
pairing_pp_t pp;
pairing_pp_t_init(pp, x, pairing);// x是G1中的某個元素
pairing_pp_apply(r1, y1, pp);// r1 = e(x, y1)
pairing_pp_apply(r2, y2, pp);// r2 = e(x, y2)
pairing_pp_clear(pp);// 不再需要pp
不要混合搭配不同pairirng中的G1、G2、GT。
函數原型:
void pairing_pp_init(pairing_pp_t p, element_t in1, pairing_t pairing)
準備執行第一個輸入爲in1的pairing,並將預計算(節省時間)結果存儲在p中。
void pairing_pp_clear(pairing_pp_t p)
不再需要p之後調用函數以釋放p。
void pairing_pp_apply(element_t out, element_t in2, pairing_pp_t p)
使用in2和存儲在p中的預處理信息計算pairing,並將輸出值存儲在out。pairing的輸入是先前用來初始化p的元素和元素in2。
void element_pairing(element_t out, element_t in1, element_t in2)
計算pairing:out = e(in1, in2),其中in1、in2和out必須來自羣G1、G2、GT。
void element_prod_pairing(element_t out, element_t in1[], element_t in2[], int n)
計算pairing的乘積,out = e(in1[0], in2[0] ... e(in1[n-1], in2[n-2])) 。數組in1、in2必須至少含有n個元素且分別屬於羣G1、G2,out必須屬於羣GT。
3.3.其它pairing函數
int pairing_is_symmetric(pairing_t pairing);
// 如果G1和G2是相同的羣則返回true
int pairing_length_in_bytes_G1(pairing_t pairing);
// 返回表示G1中元素所需的長度(以字節爲單位)
int pairing_length_in_bytes_x_on_G1(pairing_t pairing);
// 返回表示G1中元素的x座標所需的長度(以字節爲單位)
int pairing_length_in_bytes_compressed_G1(pairing_t pairing)
// 返回表示G1中元素的壓縮形式所需的字節長度。解壓過程可能會有一些開銷。
int pairing_length_in_bytes_G2(pairing_t pairing);
// 返回表示G2中元素所需的長度(以字節爲單位)
int pairing_length_in_bytes_compressed_G2(pairing_t pairing)
// 返回表示G2中元素的壓縮形式所需的字節長度。解壓過程可能會有一些開銷。
int pairing_length_in_bytes_x_on_G2(pairing_t pairing);
// 返回表示G2中元素的x座標所需的長度(以字節爲單位)
int pairing_length_in_bytes_GT(pairing_t pairing);
// 返回表示GT中元素所需的長度(以字節爲單位)
int pairing_length_in_bytes_Zr(pairing_t pairing);
// 返回表示Zr中元素所需的長度(以字節爲單位)
注:刪除線部分是翻譯不通順或者可能有錯誤的地方。