ABE-使用PBC库

#include <pbc/pbc.h>
#include <pbc/pbc_test.h>
#include <stdio.h>
#include <math.h>
#include <gmp.h>
#include <string.h>


typedef struct {
  field_t Fq, Fq2, Eq;
  int exp2, exp1;
  int sign1;
} *a_pairing_data_ptr;

typedef struct {
  field_ptr field; 
  element_t a, b;  
  mpz_ptr cofac;
  element_t gen_no_cofac;
  element_t gen;
  mpz_ptr quotient_cmp;
} *curve_data_ptr;
void messageToValue(void *message, mpz_t message_mpz, char *m){
  char* c = NULL;
  unsigned int value = 0, size = 0;
  c = message;

  while(*c != '\0'){
  	value = (unsigned int) *c;
	mpz_mul_ui(message_mpz, message_mpz, 256);
  	mpz_add_ui(message_mpz, message_mpz, value);
	c += 1;
  }

  mpz_get_str(m, 10, message_mpz);

}

void valueToMessage(char *message, mpz_t message_mpz){
  char *c = NULL;
  c = (char*) message_mpz->_mp_d;
  unsigned int count = 0;

  while(*(c + count) != '\0'){
	count += 1;
  }
  message[count] = '\0';
  while(count > 0){
  	count -= 1;
  	message[count] = *c;
	c += 1;
  }

}
int main(int argc, char **argv) {
  pairing_t pairing;
  double t0, t1;
  element_t g, h, f, beta, beta_invert, r, OSK, alpha, OPK, s, a, A, cd_pair,
		C, C_bar, D, C_temp, message_ele;
  char raw_message[2048] = "Secret message.\0";
  char message_dec[2048], message[2048];
  mpz_t message_mpz;

  t0 = pbc_get_time(); 
  pbc_demo_pairing_init(pairing, argc, argv);
  if (!pairing_is_symmetric(pairing)) pbc_die("pairing must be symmetric");

  mpz_init(message_mpz);
  element_init_Zr(beta, pairing);
  element_init_Zr(beta_invert, pairing);
  element_init_Zr(r, pairing);
  element_init_Zr(alpha, pairing);
  element_init_Zr(s, pairing);
  element_init_Zr(a, pairing);
  element_init_G1(g, pairing);
  element_init_G1(h, pairing);
  element_init_G1(f, pairing);
  element_init_G1(OSK, pairing);
  element_init_G1(D, pairing);
  element_init_G1(C, pairing);
  element_init_GT(OPK, pairing);
  element_init_GT(C_bar, pairing);
  element_init_GT(A, pairing);
  element_init_GT(cd_pair, pairing);
  element_init_GT(C_temp, pairing);
  element_init_GT(message_ele, pairing);


  element_set(g, ((curve_data_ptr)((a_pairing_data_ptr) pairing->data)->Eq->data)->gen);

  element_random(beta);
  element_random(alpha);
  element_random(s);
  element_random(a);
  element_random(r);

  element_invert(beta_invert, beta);
  element_pow_zn(h, g, beta);
  element_pow_zn(f, g, beta_invert);

  element_pow_zn(OSK, g, alpha);

  element_pairing(OPK, g, g);
  element_pow_zn(OPK, OPK, alpha);

  element_pow_zn(C, h, s);

  printf("Before encryption. The raw message is:\n");
  puts(raw_message);

  messageToValue(raw_message, message_mpz, message_dec);
  strcpy(message, "[");
  strcat(message, message_dec);
  strcat(message, ",0]");
  element_set_str(message_ele, message, 10);

  element_pow_zn(C_temp, OPK, s);
  element_mul(C_bar, C_temp, message_ele);



  element_pow_zn(D, g, r);
  element_pow_zn(D, D, a);
  element_mul(D, D, OSK);
  element_pow_zn(D, D, beta_invert);

  element_pairing(A, g, g);
  element_pow_zn(A, A, r);
  element_pow_zn(A, A, a);
  element_pow_zn(A, A, s);

  element_pairing(cd_pair, C, D);
  element_div(cd_pair, cd_pair, A);
  element_div(cd_pair, C_bar, cd_pair);
  element_to_mpz(message_mpz, cd_pair);
  valueToMessage(message, message_mpz);
  printf("Decrypt successfully. The message is:\n");
  puts(message);
  t1 = pbc_get_time();
  printf("Time cost %fs\n", t1-t0);

  element_clear(g);
  element_clear(h);
  element_clear(f);
  element_clear(beta);
  element_clear(beta_invert);
  element_clear(r);
  element_clear(OSK);
  element_clear(alpha);
  element_clear(OPK);
  element_clear(s);
  element_clear(a);
  element_clear(A);
  element_clear(cd_pair);
  element_clear(C);
  element_clear(C_bar);
  element_clear(D);
  element_clear(C_temp);
  element_clear(message_ele);
  mpz_clear(message_mpz);
}

 运行截图

翻译自https://github.com/s29zhu/PBC


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值