2013-03-07 94 views
1

我有這樣的代碼,使用PBC庫:元MUL在PBC圖書館

element_t pk, pk_temp; 

element_init_G2(pk, pairing); 
element_init_G2(pk_temp, pairing); 
element_init_Zr(ci, pairing); 

element_pow_zn(pk_temp, pk_temp, ci); 
element_set1(pk); 
element_add(pk, pk, pk); 

element_mul_zn(pk, pk, pk_temp); 

當我運行這個程序(CI沒有先前計算的值),這是輸出,我得到:

pk_temp 
[116278406325033872100813200201193617766578695181932793603160637278854742066192092884782310233584512588249536578523628847229234460071209045611450183651531, 2021454548422679707182594138446448992982063147118097540714810473185383559710078393323207940613550542761869670939719707936590719813436809712827363459486303] 
ci 
557018308384393102708847545615423648196401851115 

After pk_temp^ci 
pk_temp 
[108256843552655255908398113161102639677286937761571877242159361199581616450078081163742350174144405610156719380747507503987165257266343606269839543701390, 315460454942637140235438889718432767280220200962474346118962958364243678526968323118117335000004382683381426774251553048778733132443252812268528626451784] 

After pk = pk + pk 
pk 
0 

After pk = pk * pk_temp 
pk 
O 

UPDATE 如果pk初始化爲Zr中的一個元素,則加法運作。

+0

一般不使用相同的變量既參數,導致一個操作一個好主意 - 這不僅是因爲不是乾淨的代碼,而且還因爲它可能會導致參數的值被覆蓋,因爲它被函數使用。我不知道「PBC」是否這樣做,但症狀與此解釋一致。 – 2013-03-07 18:01:22

+0

@HenrickHellström僅在該行發生錯誤。 pk_temp的pow操作沒有顯示任何類似的行爲。 – Ajoy 2013-03-08 03:50:07

回答

3
element_mul_zn(pk, pk, pk_temp); 

但事實上,你的pk_temp是G2而不是Zn。

見定義包括/ pbc_field.h

static inline void element_mul_zn(element_t c, element_t a, element_t z) { 
    mpz_t z0; 
    PBC_ASSERT_MATCH2(c, a); 
    //TODO: check z->field is Zn 
    mpz_init(z0); 
    element_to_mpz(z0, z); 
    element_mul_mpz(c, a, z0); 
    mpz_clear(z0); 
} 

的代碼不檢查z->fieldZn,並只會轉換G2mpz。 它,如果你想G2轉換爲mpz沒有意義,而且element_to_mpz只是給你0

+0

好的。我試過'element_mul(pk,pk,pk_temp);'pk的值不爲零。感謝這個想法。 – Ajoy 2013-03-08 10:03:09

+0

是的,你的答案解釋了爲什麼我得到了這樣的輸出 – Ajoy 2013-03-09 10:55:38

0

我們一般不接受代碼審查問題;也許stackexchange(不加密)會更好。

在另一方面,我注意到你這樣做:

element_set1(pk); 

但願組PK爲1?如果是這樣,爲什麼你將pk添加到自己後,pk會被設置爲2會出人意料?

+0

這是預期的。但意想不到的部分是哪裏pk * pk_temp返回0 – Ajoy 2013-03-07 15:42:47

+0

好吧,我應該發佈這個問題,而不是在stackoverflow? – Ajoy 2013-03-07 15:43:52

+0

@Ajoy:實際上,如果其中一個版主遷移它(而不是讓您輸入重複的問題),它會更乾淨。我已經將其標記爲遷移。 – poncho 2013-03-07 15:45:27

1

我不確定你使用哪種類型的配對,所以我想你使用A型配對。功能

element_set1(pk); 

套PK到Õ,無窮遠點,因爲Pk爲G2的要素。所以結果應該是這樣的

element_set1(pk); 
pk = O 

After pk=pk+pk 
pk = O 

After pk = pk * pk_temp 
pk 
O 

PK * pk_temp的結果是Ø因爲所有的標量數量C,Ø = C * Ø

+0

是的,我用過A型 – Ajoy 2013-03-08 03:55:40