circuit_time2.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. #include "circuit_time2.hpp"
  2. void circuit_time2(PublicKey public_key, PrivateKey private_key)
  3. {
  4. zout(omp_get_num_procs(),omp_get_max_threads());
  5. using Clock = chrono::high_resolution_clock;
  6. using chrono::nanoseconds;
  7. using chrono::duration_cast;
  8. double temps_en_nanosecondes;
  9. double temps_en_secondes, temps_en_millisecondes;
  10. unsigned long graine_faible_time;
  11. graine_faible_time = time(NULL);
  12. srand((unsigned int)graine_faible_time); //cast explicite pour être propre
  13. int nombre_instances=50;
  14. F2 clair;
  15. BitEvalL1<curvepoint_fp_t> chiffre_curve[nombre_instances], sum_curve[nombre_instances];
  16. BitEvalL1<twistpoint_fp2_t> chiffre_twist[nombre_instances], sum_twist[nombre_instances];
  17. BitEvalL2 chiffre_L2[nombre_instances], sum_L2[nombre_instances];
  18. BitEvalL3 chiffre_L3[nombre_instances], sum_L3[nombre_instances];
  19. BitEvalL4 chiffre_L4[nombre_instances], sum_L4[nombre_instances];
  20. /**encryption mode curve **/
  21. green(encryption mode curve);
  22. auto temps_initial = Clock::now();
  23. omp_set_num_threads(omp_get_max_threads());
  24. clair=rand()%2;
  25. #pragma omp parallel
  26. {
  27. #pragma omp for
  28. for (int i=0; i<nombre_instances;i++)
  29. {
  30. //clair=rand()%2;
  31. chiffrement(chiffre_curve[i],clair,public_key);
  32. }
  33. }
  34. auto temps_final = Clock::now();
  35. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  36. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  37. //zout(temps_en_secondes);
  38. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  39. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  40. /**encryption mode twist **/
  41. green(encryption mode twist);
  42. temps_initial = Clock::now();
  43. omp_set_num_threads(omp_get_max_threads());
  44. #pragma omp parallel
  45. {
  46. #pragma omp for
  47. for (int i=0; i<nombre_instances;i++)
  48. {
  49. chiffrement(chiffre_twist[i],clair,public_key);
  50. }
  51. }
  52. temps_final = Clock::now();
  53. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  54. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  55. //zout(temps_en_secondes);
  56. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  57. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  58. /**multiplication L1 **/
  59. yellow(multiplication L1);
  60. temps_initial = Clock::now();
  61. omp_set_num_threads(omp_get_max_threads());
  62. #pragma omp parallel
  63. {
  64. #pragma omp for
  65. for (int i=0; i<nombre_instances;i++)
  66. {
  67. chiffre_L2[i]=multiplicationL1(chiffre_curve[i],chiffre_twist[i],public_key);
  68. }
  69. }
  70. temps_final = Clock::now();
  71. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  72. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  73. //zout(temps_en_secondes);
  74. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  75. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  76. /**multiplication L1L2 curve **/
  77. yellow(multiplication L1L2);
  78. temps_initial = Clock::now();
  79. omp_set_num_threads(omp_get_max_threads());
  80. #pragma omp parallel
  81. {
  82. #pragma omp for
  83. for (int i=0; i<nombre_instances;i++)
  84. {
  85. chiffre_L3[i]=multiplicationL1L2(chiffre_curve[i],chiffre_L2[i],public_key);
  86. }
  87. }
  88. temps_final = Clock::now();
  89. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  90. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  91. //zout(temps_en_secondes);
  92. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  93. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  94. /**multiplication L2 **/
  95. yellow(multiplication L2);
  96. temps_initial = Clock::now();
  97. omp_set_num_threads(omp_get_max_threads());
  98. #pragma omp parallel
  99. {
  100. #pragma omp for
  101. for (int i=0; i<nombre_instances;i++)
  102. {
  103. chiffre_L4[i]=multiplicationL2(chiffre_L2[i],chiffre_L2[i],public_key);
  104. }
  105. }
  106. temps_final = Clock::now();
  107. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  108. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  109. //zout(temps_en_secondes);
  110. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  111. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  112. /**addition L1 mode curve **/
  113. green(addition L1 mode curve);
  114. temps_initial = Clock::now();
  115. omp_set_num_threads(omp_get_max_threads());
  116. clair=rand()%2;
  117. #pragma omp parallel
  118. {
  119. #pragma omp for
  120. for (int i=0; i<nombre_instances-1;i++)
  121. {
  122. //clair=rand()%2;
  123. sum_curve[i]=additionL1(chiffre_curve[i],chiffre_curve[i+1],public_key);
  124. }
  125. }
  126. temps_final = Clock::now();
  127. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  128. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  129. //zout(temps_en_secondes);
  130. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  131. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  132. /**addition L1 mode twist **/
  133. green(addition L1 mode twist);
  134. temps_initial = Clock::now();
  135. omp_set_num_threads(omp_get_max_threads());
  136. clair=rand()%2;
  137. #pragma omp parallel
  138. {
  139. #pragma omp for
  140. for (int i=0; i<nombre_instances-1;i++)
  141. {
  142. //clair=rand()%2;
  143. sum_twist[i]=additionL1(chiffre_twist[i],chiffre_twist[i+1],public_key);
  144. }
  145. }
  146. temps_final = Clock::now();
  147. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  148. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  149. //zout(temps_en_secondes);
  150. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  151. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  152. /**addition L2 **/
  153. green(addition L2);
  154. temps_initial = Clock::now();
  155. omp_set_num_threads(omp_get_max_threads());
  156. clair=rand()%2;
  157. #pragma omp parallel
  158. {
  159. #pragma omp for
  160. for (int i=0; i<nombre_instances-1;i++)
  161. {
  162. //clair=rand()%2;
  163. sum_L2[i]=additionL2(chiffre_L2[i],chiffre_L2[i+1],public_key);
  164. }
  165. }
  166. temps_final = Clock::now();
  167. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  168. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  169. //zout(temps_en_secondes);
  170. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  171. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  172. /**addition L3 **/
  173. green(addition of two L3);
  174. temps_initial = Clock::now();
  175. omp_set_num_threads(omp_get_max_threads());
  176. clair=rand()%2;
  177. #pragma omp parallel
  178. {
  179. #pragma omp for
  180. for (int i=0; i<nombre_instances-1;i++)
  181. {
  182. //clair=rand()%2;
  183. sum_L3[i]=additionL3(chiffre_L3[i],chiffre_L3[i+1],public_key);
  184. }
  185. }
  186. temps_final = Clock::now();
  187. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  188. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  189. //zout(temps_en_secondes);
  190. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  191. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  192. /**addition L4 **/
  193. green(addition of two L4);
  194. temps_initial = Clock::now();
  195. omp_set_num_threads(omp_get_max_threads());
  196. clair=rand()%2;
  197. #pragma omp parallel
  198. {
  199. #pragma omp for
  200. for (int i=0; i<nombre_instances-1;i++)
  201. {
  202. //clair=rand()%2;
  203. sum_L4[i]=additionL4(chiffre_L4[i],chiffre_L4[i+1],public_key);
  204. }
  205. }
  206. temps_final = Clock::now();
  207. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  208. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  209. //zout(temps_en_secondes);
  210. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  211. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  212. /**decryption L1 mode curve **/
  213. green(decryption mode curve);
  214. temps_initial = Clock::now();
  215. omp_set_num_threads(omp_get_max_threads());
  216. #pragma omp parallel
  217. {
  218. #pragma omp for
  219. for (int i=0; i<nombre_instances;i++)
  220. {
  221. dechiffrement(clair,chiffre_curve[i],private_key);
  222. }
  223. }
  224. temps_final = Clock::now();
  225. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  226. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  227. //zout(temps_en_secondes);
  228. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  229. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  230. /**decryption L1 mode twist **/
  231. green(decryption mode twist);
  232. temps_initial = Clock::now();
  233. omp_set_num_threads(omp_get_max_threads());
  234. #pragma omp parallel
  235. {
  236. #pragma omp for
  237. for (int i=0; i<nombre_instances;i++)
  238. {
  239. dechiffrement(clair,chiffre_twist[i],private_key);
  240. }
  241. }
  242. temps_final = Clock::now();
  243. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  244. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  245. //zout(temps_en_secondes);
  246. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  247. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  248. /**decryption L2 **/
  249. red(decryption L2);
  250. temps_initial = Clock::now();
  251. omp_set_num_threads(omp_get_max_threads());
  252. #pragma omp parallel
  253. {
  254. #pragma omp for
  255. for (int i=0; i<nombre_instances;i++)
  256. {
  257. dechiffrementL2(clair,chiffre_L2[i],private_key);
  258. }
  259. }
  260. temps_final = Clock::now();
  261. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  262. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  263. //zout(temps_en_secondes);
  264. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  265. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  266. /**decryption L3 **/
  267. red(decryption L3);
  268. temps_initial = Clock::now();
  269. omp_set_num_threads(omp_get_max_threads());
  270. #pragma omp parallel
  271. {
  272. #pragma omp for
  273. for (int i=0; i<nombre_instances;i++)
  274. {
  275. dechiffrementL3(clair,chiffre_L3[i],private_key);
  276. }
  277. }
  278. temps_final = Clock::now();
  279. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  280. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  281. //zout(temps_en_secondes);
  282. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  283. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  284. /**decryption L4 **/
  285. red(decryption L4);
  286. temps_initial = Clock::now();
  287. omp_set_num_threads(omp_get_max_threads());
  288. #pragma omp parallel
  289. {
  290. #pragma omp for
  291. for (int i=0; i<nombre_instances;i++)
  292. {
  293. dechiffrementL4(clair,chiffre_L4[i],private_key);
  294. }
  295. }
  296. temps_final = Clock::now();
  297. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  298. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  299. //zout(temps_en_secondes);
  300. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  301. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  302. /**decryption sum L3 **/
  303. red(decryption sum of two L3);
  304. temps_initial = Clock::now();
  305. omp_set_num_threads(omp_get_max_threads());
  306. #pragma omp parallel
  307. {
  308. #pragma omp for
  309. for (int i=0; i<nombre_instances-1;i++)
  310. {
  311. dechiffrementL3(clair,sum_L3[i],private_key);
  312. }
  313. }
  314. temps_final = Clock::now();
  315. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  316. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  317. //zout(temps_en_secondes);
  318. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  319. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  320. /**decryption sum L4 **/
  321. red(decryption sum of two L4);
  322. temps_initial = Clock::now();
  323. omp_set_num_threads(omp_get_max_threads());
  324. #pragma omp parallel
  325. {
  326. #pragma omp for
  327. for (int i=0; i<nombre_instances-1;i++)
  328. {
  329. dechiffrementL4(clair,sum_L4[i],private_key);
  330. }
  331. }
  332. temps_final = Clock::now();
  333. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  334. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  335. //zout(temps_en_secondes);
  336. temps_en_millisecondes=temps_en_nanosecondes*1e-6/(nombre_instances-1);
  337. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  338. /**keygen **/
  339. green(keygen);
  340. temps_initial = Clock::now();
  341. omp_set_num_threads(omp_get_max_threads());
  342. clair=rand()%2;
  343. #pragma omp parallel
  344. {
  345. #pragma omp for
  346. for (int i=0; i<nombre_instances;i++)
  347. {
  348. keygen(public_key, private_key);
  349. }
  350. }
  351. temps_final = Clock::now();
  352. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  353. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  354. //zout(temps_en_secondes);
  355. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  356. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  357. /**precomputation L2 **/
  358. red(precompute L2);
  359. temps_initial = Clock::now();
  360. omp_set_num_threads(omp_get_max_threads());
  361. #pragma omp parallel
  362. {
  363. #pragma omp for
  364. for (int i=0; i<nombre_instances;i++)
  365. {
  366. Quadripoint base_log = private_key.pi_T(pairing(public_key.get_bipoint_curve_groupelt(),public_key.get_bipoint_twist_groupelt())); //pi_T(e(u,v))
  367. }
  368. }
  369. temps_final = Clock::now();
  370. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  371. temps_en_secondes= temps_en_nanosecondes*1e-9; //on pourrait passer directement en secondes avec chrono mais on perdrait de la précision avec leurs arrondis
  372. //zout(temps_en_secondes);
  373. temps_en_millisecondes=temps_en_nanosecondes*1e-6/nombre_instances;
  374. cout << setprecision(3) << temps_en_millisecondes << " ms\n";
  375. }