-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbenchmark.c
147 lines (114 loc) · 3.98 KB
/
benchmark.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
* File: benchmark.c
* Author: Yanzhi (Aaron) Dou
* E-mail: [email protected]
* Description: To generate operation benchmark of Paillier cryptosystem.
* Created on December 2, 2014
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
#include "paillier.h"
#include "Parameters.h"
#include <time.h>
#include "tools.h"
int benchmark(){
// initialization
FILE *public_key, *private_key;
paillier_public_key pub;
paillier_private_key priv;
paillier_public_init(&pub);
paillier_private_init(&priv);
clock_t tic, toc;
int k = 300; // number of operations
int n = 2048; // security parameter
unsigned long seed;
gmp_randstate_t state;
seed = time(NULL); // system time
gmp_randinit_default(state);
gmp_randseed_ui(state, seed);
srand(time(NULL));
mpz_t *a1 = malloc(k* sizeof(mpz_t)); // allocate space for k plaintext messages
mpz_t *c1 = malloc(k* sizeof(mpz_t));
mpz_t *a2 = malloc(k* sizeof(mpz_t));
mpz_t *c2 = malloc(k* sizeof(mpz_t));
mpz_t *c3 = malloc(k* sizeof(mpz_t));
mpz_t *ran_20 = malloc(k* sizeof(mpz_t)); // allocate space for k 20-bit random numbers
mpz_t *ran_112 = malloc(k* sizeof(mpz_t)); // allocate space for k 112-bit random numbers
// read key pair from files
public_key = fopen("./pub2048", "r");
private_key = fopen("./priv2048", "r");
paillier_public_in_str(&pub, public_key);
paillier_private_in_str(&priv, private_key);
// Encryption
int i;
for (i=0;i<k;i++){
mpz_init(a1[i]);
mpz_urandomb(a1[i],state,n); // assign random value in the range of 0 to 2^n-1
mpz_init (c1[i]);
mpz_init(a2[i]);
mpz_urandomb(a2[i],state,n);
mpz_init (c2[i]);
mpz_init (c3[i]);
mpz_init(ran_20[i]);
mpz_urandomb(ran_20[i],state,20);
mpz_init(ran_112[i]);
mpz_urandomb(ran_112[i],state,112);
// gmp_printf("%Zd\n", ran_20[i]);
// gmp_printf("%Zd\n", ran_120[i]);
}
// Encryption
tic = clock();
for(i = 0; i < k; i++){
// printf("%d\n",i);
paillier_encrypt(c1[i], a1[i], &pub);
}
toc = clock();
gmp_printf ("One encryption takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC/k*1000000);
for(i = 0; i < k; i++){
// printf("%d\n",i);
paillier_encrypt(c2[i], a2[i], &pub);
}
// Addition
tic = clock();
for(i = 0; i<k; i++){
// printf("%d\n",i);
paillier_homomorphic_add(c3[i], c1[i], c2[i], &pub);
}
toc = clock();
gmp_printf ("One addition takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC/k*1000000);
// Multiplication 20 bit
tic = clock();
for(i = 0; i<k; i++){
// printf("%d\n",i);
paillier_homomorphic_multc(c3[i], c1[i], ran_20[i], &pub);
}
toc = clock();
gmp_printf ("One scalar multiplication by 20-bit random value takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC /k*1000000);
// Multiplication 120 bit
tic = clock();
for(i = 0; i<k; i++){
// printf("%d\n",i);
paillier_homomorphic_multc(c3[i], c1[i], ran_112[i], &pub);
}
toc = clock();
gmp_printf ("One scalar multiplication by 112-bit random value takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC /k*1000000);
// Subtraction
tic = clock();
for(i = 0; i<k; i++){
// printf("%d\n",i);
paillier_homomorphic_sub(c3[i], c1[i], c2[i], &pub);
}
toc = clock();
gmp_printf ("One subtraction takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC /k*1000000);
// Decrypt
tic = clock();
for(i = 0; i<k; i++){
// printf("%d\n",i);
paillier_decrypt(a1[i], c1[i], &priv);
}
toc = clock();
gmp_printf ("One decryption takes %f microseconds\n", (float)(toc-tic)/CLOCKS_PER_SEC /k*1000000);
}