Hess签名方案

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;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值