2013-03-07 63 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