1

我有这段代码,它使用 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

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

4

3 回答 3

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->fieldZn并且只会转换G2mpz. G2如果您想转换为没有意义mpzelement_to_mpz只会给您 0。

于 2013-03-08T05:36:31.003 回答
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

于 2013-03-08T03:48:42.770 回答
0

我们这里一般不接受代码审查问题;也许stackexchange(不是加密)会更好。

另一方面,我确实注意到您这样做:

element_set1(pk);

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

于 2013-03-07T15:37:10.427 回答