bgn.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. #include "bgn.hpp"
  2. int main(int argc, char *argv[])
  3. {
  4. //signature;
  5. /** début chrono **/
  6. using Clock = std::chrono::high_resolution_clock;
  7. using std::chrono::nanoseconds;
  8. using std::chrono::duration_cast;
  9. auto temps_initial = Clock::now();
  10. double temps_en_nanosecondes;
  11. double temps_en_secondes, temps_en_secondes_par_symbole;
  12. //clock_t temps_initial, temps_final;
  13. //
  14. //temps_initial = clock (); /* initial time in microseconds */
  15. /** gengetopt **/
  16. gengetopt_args_info args_info;
  17. if (cmdline_parser(argc, argv, &args_info) != 0)
  18. {
  19. exit(1) ;
  20. }
  21. /** message clair **/
  22. string message_clair;
  23. //if (args_info.subtitle_source_arg==DEV)
  24. if(!args_info.subtitle_given)
  25. {
  26. message_clair="~{|`}azertyQWERTY&é,;:!asdfasdfasdfasdfsadfasdfasdfasdfasdfasdfasdfasdfasgfdyeryh bfht gsSLRJslrkgjDLGJDALKDJ:SILFJOIElkdefgwlkerjgtfeswrjg;wrtjhlksdfmhtls/fdkmjhtsltjhmlsrtjhlsfmtjdlj.dtjhmldtjhmmmtlkmtdrlhkmmmmmmhyjldtmrh.lmd.ltlsgrtmglhksdr.tmhdtlkhmmdkrthmlkdrtmld.rkhk.rthlkdrtmhd.rktmh.ldrktmhkr.mdth.lrij"; //clair défini par le dév
  27. //message_clair="3\/-7rU$7"; // langage leet avec des caractères spéciaux
  28. }
  29. else
  30. {
  31. message_clair=args_info.subtitle_arg;
  32. //cout << "Entrez un message : " << endl;
  33. //cin >> message_clair; //clair défini par l'utilisateur
  34. }
  35. {
  36. }
  37. int nombre_symboles=message_clair.length();
  38. if (args_info.circuit_arg==MINMAJ || args_info.circuit_arg==MINMAJ2 || args_info.circuit_arg==MINMAJ3 || args_info.circuit_arg==CHIFFREMENT || args_info.circuit_arg==TIME)
  39. {
  40. zout(nombre_symboles,message_clair);
  41. }
  42. string evalue_dechiffre;
  43. evalue_dechiffre.resize(nombre_symboles);
  44. //extern PublicKey public_key;
  45. //debug(clef privée globale pour debug - à modifier après);
  46. PrivateKey private_key;
  47. keygen(public_key, private_key);
  48. //private_key.get();
  49. //public_key.get();
  50. /** génération d'une graine aléatoire **/
  51. unsigned int graine_urandom;
  52. FILE * urandom;
  53. urandom = fopen ("/dev/urandom","r");
  54. if (urandom == NULL)
  55. {
  56. fprintf(stderr, "Could not open device file /dev/urandom");
  57. exit(1);
  58. }
  59. fread(&graine_urandom,sizeof(unsigned int),1,urandom);// la graine sert pour creer indirectement un nombre aléatoire via un PRNG
  60. // voir test_encrypt.cpp pour la génération d'aléa directement à partir d'urandom
  61. fclose (urandom);
  62. srand(graine_urandom);
  63. /** chiffrement message clair **/
  64. if (args_info.circuit_arg==MINMAJ || args_info.circuit_arg==MINMAJ2|| args_info.circuit_arg==MINMAJ3 || args_info.circuit_arg==CHIFFREMENT)
  65. {
  66. // omp_set_num_threads(1); //version séquentielle
  67. omp_set_num_threads(omp_get_max_threads());
  68. #pragma omp parallel
  69. {
  70. #pragma omp single //sinon l'instruction est executée par chaque thread
  71. {
  72. zout(omp_get_num_threads()); //le nombre de thread n'est modifié que dans la section parallel
  73. }
  74. #pragma omp for
  75. for (unsigned int i=0; i<message_clair.length();i++) //pour chaque lettre
  76. {
  77. if (args_info.circuit_arg==MINMAJ)
  78. {
  79. circuit_minmaj(evalue_dechiffre[i],message_clair[i],public_key, private_key);
  80. }
  81. if (args_info.circuit_arg==MINMAJ2)
  82. {
  83. circuit_minmaj2(evalue_dechiffre[i],message_clair[i],public_key, private_key);
  84. }
  85. if (args_info.circuit_arg==MINMAJ3)
  86. {
  87. circuit_minmaj3(evalue_dechiffre[i],message_clair[i],public_key, private_key);
  88. }
  89. if (args_info.circuit_arg==CHIFFREMENT)
  90. {
  91. circuit_chiffrement(message_clair[i],public_key, private_key);
  92. }
  93. }
  94. }
  95. omp_set_num_threads(1);
  96. if (args_info.circuit_arg==MINMAJ|| args_info.circuit_arg==MINMAJ2 || args_info.circuit_arg==MINMAJ3)
  97. {
  98. zout(evalue_dechiffre);
  99. }
  100. else
  101. {
  102. cout << RESET <<"vérification du chiffrement bit à bit et du déchiffrement du message en mode CURVE et TWIST" << endl;
  103. }
  104. }
  105. if (args_info.circuit_arg==DEMO)
  106. {
  107. circuit_demo(evalue_dechiffre[0],message_clair[rand() % nombre_symboles],public_key, private_key);
  108. cout << "Ce mode est verbeux. Utilisez le mode minmaj pour traiter plus d'un caractère." << endl;
  109. }
  110. if (args_info.circuit_arg==SIZE)
  111. {
  112. circuit_size(public_key,private_key);
  113. }
  114. if (args_info.circuit_arg==TIME)
  115. {
  116. circuit_time(message_clair,public_key, private_key);
  117. }
  118. if (args_info.circuit_arg==ADDITIONL1)
  119. {
  120. circuit_additionL1(public_key, private_key);
  121. }
  122. if (args_info.circuit_arg==ADDITIONL2)
  123. {
  124. circuit_additionL2(public_key, private_key);
  125. }
  126. if (args_info.circuit_arg==ADDITIONL3)
  127. {
  128. circuit_additionL3(public_key, private_key);
  129. }
  130. if (args_info.circuit_arg==ADDITIONL4)
  131. {
  132. circuit_additionL4(public_key, private_key);
  133. }
  134. if (args_info.circuit_arg==MULTIPLICATIONL1)
  135. {
  136. circuit_multiplicationL1(public_key, private_key);
  137. }
  138. if (args_info.circuit_arg==MULTIPLICATIONL1L2)
  139. {
  140. circuit_multiplicationL1L2(public_key, private_key);
  141. }
  142. if (args_info.circuit_arg==MULTIPLICATIONL2)
  143. {
  144. circuit_multiplicationL2(public_key, private_key);
  145. }
  146. if (args_info.circuit_arg==IP)
  147. {
  148. circuit_ip(public_key, private_key);
  149. }
  150. if (args_info.circuit_arg==SCALAR_PRODUCT)
  151. {
  152. circuit_scalar_product(public_key, private_key);
  153. }
  154. if (args_info.circuit_arg==TIME2)
  155. {
  156. circuit_time2(public_key, private_key);
  157. }
  158. /** fin chrono **/
  159. //temps_final = clock (); /* final time in microseconds */
  160. //temps_en_secondes = (temps_final - temps_initial) * 1e-6; /* total time in seconds */
  161. ////cout << BLUE << "running time = " << temps_en_secondes << " sec" << RESET << endl;
  162. //zout(temps_en_secondes) ;
  163. //if (args_info.circuit_arg==MINMAJ || args_info.circuit_arg==MINMAJ2 || args_info.circuit_arg==MINMAJ3|| args_info.circuit_arg==CHIFFREMENT)
  164. //{
  165. //temps_en_secondes_par_symbole=temps_en_secondes/nombre_symboles;
  166. //zout(temps_en_secondes_par_symbole);
  167. //}
  168. auto temps_final = Clock::now();
  169. temps_en_nanosecondes = duration_cast<nanoseconds>(temps_final-temps_initial).count(); /* total time in nanoseconds */
  170. 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
  171. if (!args_info.circuit_arg==TIME)
  172. {
  173. zout(temps_en_secondes);
  174. }
  175. if (args_info.circuit_arg==MINMAJ || args_info.circuit_arg==MINMAJ2 || args_info.circuit_arg==MINMAJ3|| args_info.circuit_arg==CHIFFREMENT)
  176. {
  177. temps_en_secondes_par_symbole=temps_en_secondes/nombre_symboles;
  178. zout(temps_en_secondes_par_symbole);
  179. }
  180. return EXIT_SUCCESS;
  181. }
  182. /** chiffrement **/
  183. //cout << YELLOW << "Encryption" << RESET << endl;
  184. ////mesurer le temps
  185. //temps_final = clock (); /* final time in microseconds */
  186. //temps_en_secondes = (temps_final - temps_initial) * 1e-6; /* total time in seconds */
  187. //zout(temps_en_secondes) ;
  188. //temps_initial = temps_final;
  189. /** évaluation **/
  190. //cout << YELLOW << "Homomorphic Evaluation" << RESET << endl;
  191. ////mesurer le temps
  192. //temps_final = clock (); /* final time in microseconds */
  193. //temps_en_secondes = (temps_final - temps_initial) * 1e-6; /* total time in seconds */
  194. //zout(temps_en_secondes) ;
  195. //temps_initial = temps_final;
  196. /** déchiffrement **/
  197. //cout << YELLOW << "Decryption" << RESET << endl;
  198. ////mesurer le temps
  199. //temps_final = clock (); /* final time in microseconds */
  200. //temps_en_secondes = (temps_final - temps_initial) * 1e-6; /* total time in seconds */
  201. //zout(temps_en_secondes) ;
  202. //temps_initial = temps_final;