#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