我有这个使用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中的元素,则加法有效。
答案 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会令人感到意外?