circuit_time.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "circuit_time.hpp"
  2. void circuit_time(string message, PublicKey public_key, PrivateKey private_key)
  3. {
  4. zout(omp_get_num_procs(),omp_get_max_threads());
  5. int nombre_symboles = message.length();
  6. using Clock = std::chrono::high_resolution_clock;
  7. using std::chrono::nanoseconds;
  8. using std::chrono::duration_cast;
  9. double temps_en_nanosecondes;
  10. double temps_en_secondes, temps_en_millisecondes_par_symbole;
  11. ///circuit minmaj
  12. grostitre(Circuit minmaj : Sans erreur et avec précalcul et postcalcul);
  13. F2 clair1[nombre_symboles]={}, clair2[nombre_symboles]={},clair3[nombre_symboles]={}; // resp de n8, n9, o8 (voir rapport.pdf, page 24)
  14. BitEvalL1<curvepoint_fp_t> n8[nombre_symboles],n9[nombre_symboles],temp_curve[nombre_symboles], chiffre_1_curve[nombre_symboles];
  15. BitEvalL1<twistpoint_fp2_t> o8[nombre_symboles],temp_twist[nombre_symboles], chiffre_1_twist[nombre_symboles];
  16. BitEvalL2 temp_quadripoint[nombre_symboles]; // (1+n9)(1+o8)
  17. BitEvalL3 evalue[nombre_symboles]; // n8(1+n9)(1+o8)
  18. //char dechiffre[nombre_symboles]={}; //GREEN
  19. string dechiffre;
  20. dechiffre.resize(nombre_symboles); // on donne explicitement la taille de la string pour faciliter l'affichage
  21. ///précalcul, chiffrement
  22. ecris(précalcul et chiffrement);
  23. auto temps_initial = Clock::now();
  24. omp_set_num_threads(omp_get_max_threads());
  25. // omp_set_num_threads(1); //version séquentielle
  26. #pragma omp parallel
  27. {
  28. #pragma omp single //sinon l'instruction est executée par chaque thread
  29. {
  30. zout(omp_get_num_threads()); //le nombre de thread n'est modifié que dans la section parallel
  31. }
  32. #pragma omp for
  33. for (int i=0; i<nombre_symboles;i++)
  34. {
  35. precomputation(clair1[i], clair2[i], clair3[i], message[i]);
  36. chiffrement(n8[i],clair1[i],public_key);
  37. chiffrement(n9[i],clair2[i],public_key);
  38. chiffrement(o8[i],clair3[i],public_key);
  39. }
  40. }
  41. auto temps_final = Clock::now();
  42. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  43. 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
  44. //zout(temps_en_secondes);
  45. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  46. zout(temps_en_millisecondes_par_symbole);
  47. ///évaluation homomorphique
  48. ecris(évaluation homomorphique);
  49. temps_initial = Clock::now();
  50. #pragma omp parallel
  51. {
  52. #pragma omp for
  53. for (int i=0; i<nombre_symboles;i++)
  54. {
  55. chiffrement(chiffre_1_curve[i],1, public_key);
  56. chiffrement(chiffre_1_twist[i],1, public_key);
  57. temp_curve[i] = additionL1(chiffre_1_curve[i],n9[i],public_key); //NB il faut rajouter CURVE pour passer de BitChiffre à BitEvalL1, la diff entre les deux, la taille mémoire
  58. temp_twist[i] = additionL1(chiffre_1_twist[i],o8[i],public_key);
  59. temp_quadripoint[i] = multiplicationL1(temp_curve[i],temp_twist[i],public_key);
  60. evalue[i] = multiplicationL1L2(n8[i],temp_quadripoint[i],public_key);
  61. }
  62. }
  63. temps_final = Clock::now();
  64. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  65. 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
  66. //zout(temps_en_secondes);
  67. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  68. zout(temps_en_millisecondes_par_symbole);
  69. /// déchiffrement et poscalcul
  70. ecris(dechiffrement et postcalcul);
  71. //int max=omp_get_max_threads();
  72. //for (int nb_threads=1;nb_threads<=max;nb_threads++)
  73. //{
  74. //omp_set_num_threads(nb_threads);
  75. temps_initial = Clock::now();
  76. #pragma omp parallel
  77. {
  78. #pragma omp for
  79. for (int i=0; i<nombre_symboles;i++)
  80. {
  81. postcomputation(dechiffre[i], message[i], evalue[i], private_key);
  82. }
  83. }
  84. temps_final = Clock::now();
  85. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  86. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  87. zout(dechiffre,temps_en_millisecondes_par_symbole);
  88. //}
  89. ///circuit minmaj2
  90. grostitre(Circuit minmaj2 : avec erreur sur les caractères ~{|`});
  91. BitEvalL1<twistpoint_fp2_t> m6[nombre_symboles];
  92. BitEvalL1<curvepoint_fp_t> m7[nombre_symboles],m8[nombre_symboles];
  93. BitEvalL2 chiffre_L2_1[nombre_symboles];
  94. BitEvalL3 temp_L3[nombre_symboles], chiffre_L3_1[nombre_symboles]; // m6m7(1+m8)
  95. F2 IS_LOWER_CASE[nombre_symboles]={};
  96. ///chiffrement
  97. ecris(chiffrement);
  98. temps_initial = Clock::now();
  99. #pragma omp parallel
  100. {
  101. #pragma omp single //sinon l'instruction est executée par chaque thread
  102. {
  103. zout(omp_get_num_threads()); //le nombre de thread n'est modifié que dans la section parallel
  104. }
  105. #pragma omp for
  106. for (int i=0; i<nombre_symboles;i++)
  107. {
  108. clair1[i]=bitset<sizeof(int)*CHAR_BIT>(message[i])[5] ;
  109. clair2[i]=bitset<sizeof(int)*CHAR_BIT>(message[i])[6] ;
  110. clair3[i]=bitset<sizeof(int)*CHAR_BIT>(message[i])[7] ;
  111. chiffrement(m6[i],clair1[i],public_key);
  112. chiffrement(m7[i],clair2[i],public_key);
  113. chiffrement(m8[i],clair3[i],public_key);
  114. }
  115. }
  116. temps_final = Clock::now();
  117. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  118. 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
  119. //zout(temps_en_secondes);
  120. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  121. zout(temps_en_millisecondes_par_symbole);
  122. ///évaluation homomorphique
  123. ecris(évaluation homomorphique);
  124. temps_initial = Clock::now();
  125. #pragma omp parallel
  126. {
  127. #pragma omp for
  128. for (int i=0; i<nombre_symboles;i++)
  129. {
  130. chiffrement(chiffre_1_curve[i],1, public_key);
  131. chiffrement(chiffre_1_twist[i], 1, public_key);
  132. temp_curve[i] = additionL1(chiffre_1_curve[i],m8[i],public_key); //calcul 1+m8
  133. temp_quadripoint[i] = multiplicationL1(temp_curve[i],m6[i],public_key);
  134. chiffre_L2_1[i] = multiplicationL1(chiffre_1_curve[i],chiffre_1_twist[i],public_key);
  135. chiffre_L3_1[i]=multiplicationL1L2(chiffre_1_curve[i],chiffre_L2_1[i],public_key);
  136. temp_L3[i] = multiplicationL1L2(m7[i],temp_quadripoint[i],public_key);
  137. evalue[i]=additionL3(temp_L3[i],chiffre_L3_1[i],public_key);
  138. }
  139. }
  140. temps_final = Clock::now();
  141. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  142. 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
  143. //zout(temps_en_secondes);
  144. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  145. zout(temps_en_millisecondes_par_symbole);
  146. /// déchiffrement
  147. ecris(dechiffrement);
  148. dechiffre.clear();
  149. dechiffre.resize(nombre_symboles);
  150. temps_initial = Clock::now();
  151. #pragma omp parallel
  152. {
  153. #pragma omp for
  154. for (int i=0; i<nombre_symboles;i++)
  155. {
  156. dechiffrementL3(IS_LOWER_CASE[i],evalue[i],private_key);
  157. if (IS_LOWER_CASE[i] == 0)
  158. {
  159. //cout << symbole << " est sensé être une minuscule!" << endl;
  160. dechiffre[i]=char(message[i]-32);
  161. }
  162. else
  163. {
  164. dechiffre[i]=char(message[i]);
  165. }
  166. //cout << dechiffre[i] << flush;
  167. }
  168. }
  169. jump;
  170. zout(dechiffre);
  171. temps_final = Clock::now();
  172. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  173. 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
  174. //zout(temps_en_secondes);
  175. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  176. zout(temps_en_millisecondes_par_symbole);
  177. ///circuit minmaj3
  178. grostitre(Circuit minmaj3 : avec erreur sur les caractères ~{|`} et avec postcalcul);
  179. ///chiffrement
  180. ecris(chiffrement);
  181. cout << "Circuit de chiffrement identique à circuit minmaj2" << endl;
  182. ///évaluation homomorphique
  183. ecris(évaluation homomorphique);
  184. temps_initial = Clock::now();
  185. #pragma omp parallel
  186. {
  187. #pragma omp for
  188. for (int i=0; i<nombre_symboles;i++)
  189. {
  190. chiffrement(chiffre_1_curve[i],1, public_key);
  191. temp_curve[i] = additionL1(chiffre_1_curve[i],m8[i],public_key); //calcul 1+m8
  192. temp_quadripoint[i] = multiplicationL1(temp_curve[i],m6[i],public_key);
  193. evalue[i] = multiplicationL1L2(m7[i],temp_quadripoint[i],public_key);
  194. }
  195. }
  196. temps_final = Clock::now();
  197. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  198. 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
  199. //zout(temps_en_secondes);
  200. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  201. zout(temps_en_millisecondes_par_symbole);
  202. /// déchiffrement
  203. ecris(dechiffrement);
  204. dechiffre.clear();
  205. dechiffre.resize(nombre_symboles);
  206. temps_initial = Clock::now();
  207. #pragma omp parallel
  208. {
  209. #pragma omp for
  210. for (int i=0; i<nombre_symboles;i++)
  211. {
  212. postcomputation(dechiffre[i], message[i], evalue[i], private_key);
  213. }
  214. }
  215. jump;
  216. zout(dechiffre);
  217. temps_final = Clock::now();
  218. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  219. 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
  220. //zout(temps_en_secondes);
  221. temps_en_millisecondes_par_symbole=temps_en_nanosecondes*1e-6/nombre_symboles;
  222. zout(temps_en_millisecondes_par_symbole);
  223. }