PBC库很好用,声明变量的时候一定要清楚它应该属于哪个群。
#define PBC_DEBUG
#include<pbc.h>
#include<pbc_test.h>
int main(int argc ,char **argv){
pairing_t pairing;
element_t Qta,P,P1,Sid,Hid,u;
element_t t,k,v,m,r;
element_t temp1,temp2,temp3,temp4,temp5;
double time1,time2;
pbc_demo_pairing_init(pairing,argc,argv);
if(!pairing_is_symmetric(pairing))
pbc_die("pairing must be symmetric");
element_init_G1(P,pairing);
element_init_Zr(t,pairing);
element_init_G1(Qta,pairing);
element_init_G1(Hid,pairing);
element_init_G1(Sid,pairing);
element_init_G1(P1,pairing);
element_init_GT(r,pairing);
element_init_Zr(m,pairing);
element_init_Zr(k,pairing);
//v是一个数字,由于v是明文传输,所以略去v=h(m,r)的运算过程
element_init_Zr(v,pairing);
element_init_G1(u,pairing);
element_init_G1(temp1,pairing);
element_init_G1(temp2,pairing);
element_init_GT(temp3,pairing);
element_init_GT(temp4,pairing);
element_init_GT(temp5,pairing);
//element_init_G1(f,pairing);
time1=pbc_get_time();
//TA进行的操作
element_random(P);
element_printf("system parameter P=%B\n",P);
element_random(t);
element_printf("t=%B\n",t);
element_mul_zn(Qta,P,t);
element_printf("Qta=%B\n",Qta);
element_random(Hid);
element_mul_zn(Sid,Hid,t);
//要加密的消息
element_from_hash(m,"hesstest",8);
element_printf("our messege = %B\n",m);
//签名操作
element_random(P1);
element_random(k);
element_printf("signer's parameter P1=%B\n",P1);
//r=r^k=e(P1,P)^k
element_pairing(r,P1,P);
element_pow_zn(r,r,k);
element_printf("r =%B\n",r);
//suppose that v=h(m,r)
element_random(v);
element_printf("v=%B\n",v);
//u=vSid+kP1
element_mul_zn(temp1,Sid,v);
element_printf("temp1\n");
element_mul_zn(temp2,P1,k);
element_printf("temp2\n");
element_add(u,temp1,temp2);
element_printf("u=%B\n",u);
//验证签名
//on receiving m and (u,v)
element_pairing(temp3,u,P);
element_printf("temp3\n");
//printf("flag=%B\n",flag);
element_neg(Qta,Qta);
element_printf("-Qta\n");
element_pairing(temp4,Hid,Qta);
element_printf("temp4\n");
element_pow_zn(temp4,temp4,v);
element_printf("temp5\n");
element_mul(temp5,temp3,temp4);
element_printf("the verifier gets :%B\n",temp5);
if(!element_cmp(temp5,r))
printf("succeeded ~\n");
else printf("failed\n");
time2=pbc_get_time();
printf("all time = %fs\n",time2-time1);
element_clear(temp1);
element_clear(temp2);
element_clear(temp3);
element_clear(temp4);
element_clear(temp5);
element_clear(Qta);
element_clear(P);
element_clear(P1);
element_clear(Sid);
element_clear(Hid);
element_clear(u);
element_clear(m);
element_clear(t);
element_clear(v);
element_clear(k);
element_clear(r);
//element_clear(f);
pairing_clear(pairing);
return 0;
}