PBC图书馆的元素mul

时间:2013-03-07 15:24:28

标签: c

我有这个使用PB​​C库的代码:

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

更新 如果pk初始化为Zr中的元素,则加法有效。

3 个答案:

答案 0 :(得分:3)

element_mul_zn(pk, pk, pk_temp);

但实际上,你的pk_temp是G2而不是Zn。

参见include / 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->field是否为Zn,只会将G2转换为mpz。 如果您想将G2转换为mpz,而element_to_mpz只给您0,则没有意义。

答案 1 :(得分:1)

我不确定你使用哪种配对,所以我想你使用A型配对。功能

element_set1(pk);

将pk设置为 O ,即无穷远处的点,因为pk是G2的元素。所以结果应该是这样的

element_set1(pk);
pk = O

After pk=pk+pk
pk = O

After pk = pk * pk_temp
pk
O

pk * pk_temp的结果是 O ,因为对于所有标量数c, O = c * O

答案 2 :(得分:0)

我们一般不接受此处的代码审查问题;或许stackexchange(而不是crypto)会更好。

另一方面,我注意到你这样做:

element_set1(pk);

这会将pk设置为1吗?如果是这样,为什么在将pk添加到自身后将pk设置为2会令人感到意外?