IBE-使用PBC库

IBE-使用PBC库

identity-based encryption

#include <pbc/pbc.h>

int main(int argc, char **argv) {
    mpz_t z,V,M;
    element_t s,r,P,Ppub,Qid,dID,gID,gIDr,U,tem1;
    pairing_pp_t pp;

    pairing_t pairing;
    char param[1024];
    size_t count = fread(param, 1, 1024, stdin);
    if (!count) pbc_die("input error");
    pairing_init_set_buf(pairing, param, count);


    //整数
    mpz_init(z);
    mpz_init(V);
    //初始化并给消息赋值
    mpz_init_set_str(M, "201806014", 0);
    gmp_printf ("M: %Zd\n", M);

    //在1和r之间的整数
    element_init_Zr(s, pairing);
    element_init_Zr(r, pairing);

    //循环群G1
    element_init_G1(P, pairing);
    element_init_G1(Ppub, pairing);
    element_init_G1(Qid, pairing);
    element_init_G1(dID, pairing);
    element_init_G1(U, pairing);

    //循环群GT
    element_init_GT(gID, pairing);
    element_init_GT(gIDr, pairing);
    element_init_GT(tem1, pairing);

    //Setup, system parameters generation
    printf("SETUP STAGE\n");
    element_random(P);
    element_random(s);
    element_mul_zn(Ppub, P, s);//Ppub=sP

    //Extract, key calculation
    printf("EXTRACT STAGE\n");
    element_from_hash(Qid, "A", 1);//Qid=H("A")
    element_mul_zn(dID, Qid, s);

    //Encrypt encrypt M with ID
    printf("Encrypt STAGE\n");
    element_random(r);
    element_mul_zn(U, P, r);
    pairing_pp_init(pp, Ppub, pairing);
    pairing_pp_apply(gID, Qid, pp); //gID=e(Qid,Ppub)
    pairing_pp_clear(pp);
    element_mul_zn(gIDr, gID, r); //gIDr=gID^r
    element_to_mpz(z,gIDr); //H(gIDr)
    mpz_xor(V,M,z); //V=M xor z
    element_printf("U: %B\n", gIDr);
    gmp_printf ("V: %Zd\n", V);

    //Decrypt decrypt C = <U,V>
    printf("Decrypt STAGE\n");
    pairing_pp_init(pp, U, pairing);
    pairing_pp_apply(tem1,dID, pp);
    pairing_pp_clear(pp);
    element_to_mpz(z,tem1);
    mpz_xor(M,V,z);
    gmp_printf("M: %Zd\n", M);

    //释放内存
    mpz_clear(z);
    mpz_clear(V);
    mpz_clear(M);
    element_clear(s);
    element_clear(r);
    element_clear(P);
    element_clear(Ppub);
    element_clear(Qid);
    element_clear(dID);
    element_clear(gID);
    element_clear(gIDr);
    element_clear(U);
    element_clear(tem1);

    return 0;
}
  • 运行结果
    这里写图片描述
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值