circuit_ip.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. #include "circuit_ip.hpp"
  2. void circuit_ip(PublicKey public_key, PrivateKey private_key)
  3. {
  4. ecris(original server);
  5. /** définition du plaintext clair **/
  6. /** adresses ipv4s en clair **/
  7. unsigned int adress_size=4;
  8. vector<unsigned char> original_server = {10,0,1,10};
  9. vector<unsigned char> cdn1 = {10,0,1,10};
  10. vector<unsigned char> cdn2 = {10,1,1,10};
  11. vector<unsigned char> cdn3 = {10,2,1,10};
  12. vector<unsigned char> cdn4 = {10,3,1,10};
  13. vector<unsigned char> receiver = {100,0,1,10};
  14. vector<unsigned char> null={0,0,0,0};
  15. vector<unsigned char> aes_key = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
  16. vector<unsigned char> offset={0}; //obligé de mettre les {} avec vector contrairement à unsigned char
  17. vector<unsigned char> original_server_addr,original_server_dest,cdn1_addr,cdn1_source,cdn1_dest,cdn2_addr,cdn2_source,cdn2_dest,cdn3_addr,cdn3_source,cdn3_dest,cdn4_addr,cdn4_source,cdn4_dest;
  18. original_server_addr=original_server;
  19. original_server_dest=cdn1;
  20. cdn1_addr=null;
  21. cdn1_source=null;
  22. cdn1_dest=null;
  23. cdn2_addr=null;
  24. cdn2_source=null;
  25. cdn2_dest=null;
  26. cdn3_addr=null;
  27. cdn3_source=null;
  28. cdn3_dest=null;
  29. cdn4_addr=null;
  30. cdn4_source=null;
  31. cdn4_dest=null;
  32. vector<unsigned char> plaintext;
  33. plaintext.reserve(aes_key.size()+offset.size()+original_server_addr.size()+original_server_dest.size()+cdn1_addr.size()+cdn1_source.size()+cdn1_dest.size()+cdn2_addr.size()+cdn2_source.size()+cdn2_dest.size()+cdn3_addr.size()+cdn3_source.size()+cdn3_dest.size()+cdn4_addr.size()+cdn4_source.size()+cdn4_dest.size());
  34. plaintext.insert(plaintext.end(), aes_key.begin(), aes_key.end());
  35. plaintext.insert(plaintext.end(), offset.begin(), offset.end());
  36. plaintext.insert(plaintext.end(), original_server_addr.begin(), original_server_addr.end());
  37. plaintext.insert(plaintext.end(), original_server_dest.begin(), original_server_dest.end());
  38. plaintext.insert(plaintext.end(), cdn1_addr.begin(), cdn1_addr.end());
  39. plaintext.insert(plaintext.end(), cdn1_source.begin(), cdn1_source.end());
  40. plaintext.insert(plaintext.end(), cdn1_dest.begin(), cdn1_dest.end());
  41. plaintext.insert(plaintext.end(), cdn2_addr.begin(), cdn2_addr.end());
  42. plaintext.insert(plaintext.end(), cdn2_source.begin(), cdn2_source.end());
  43. plaintext.insert(plaintext.end(), cdn2_dest.begin(), cdn2_dest.end());
  44. plaintext.insert(plaintext.end(), cdn3_addr.begin(), cdn3_addr.end());
  45. plaintext.insert(plaintext.end(), cdn3_source.begin(), cdn3_source.end());
  46. plaintext.insert(plaintext.end(), cdn3_dest.begin(), cdn3_dest.end());
  47. plaintext.insert(plaintext.end(), cdn4_addr.begin(), cdn4_addr.end());
  48. plaintext.insert(plaintext.end(), cdn4_source.begin(), cdn4_source.end());
  49. plaintext.insert(plaintext.end(), cdn4_dest.begin(), cdn4_dest.end());
  50. zout(plaintext.size());
  51. BitEvalL1<curvepoint_fp_t> bit_chiffre_curve[plaintext.size()*CHAR_BIT], chiffre_poids_faible_offset_curve, chiffre_poids_fort_offset_curve;
  52. BitEvalL1<twistpoint_fp2_t> bit_chiffre_twist, chiffre_poids_faible_offset_twist, chiffre_poids_fort_offset_twist;
  53. F2 bit_clair=0, poids_faible_offset=0, poids_fort_offset=0;
  54. //mode curve
  55. for (unsigned int i=0; i<plaintext.size();i++)
  56. {
  57. printf("%u\t",plaintext[i]); //affichage des unsigned char avec printf, pas avec cout qui affiche les caractères
  58. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  59. {
  60. bit_clair=bitset<CHAR_BIT>(plaintext[i])[j] ;
  61. chiffrement(bit_chiffre_curve[i*CHAR_BIT+j],bit_clair,public_key); //on chiffre le plaintext bit à bit en mode curve
  62. }
  63. }
  64. jump;
  65. chiffre_poids_faible_offset_curve=bit_chiffre_curve[128];//16*8+0=128
  66. chiffre_poids_fort_offset_curve=bit_chiffre_curve[129];
  67. //mode twist
  68. bit_clair=bitset<CHAR_BIT>(plaintext[16])[0] ; //en plus, on chiffre les bit de l'offset (les 16 premiers unsigned char, c'est la clef AES) en mode twist
  69. chiffrement(chiffre_poids_faible_offset_twist,bit_clair,public_key);
  70. bit_clair=bitset<CHAR_BIT>(plaintext[16])[1] ;
  71. chiffrement(chiffre_poids_fort_offset_twist,bit_clair,public_key);
  72. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_curve,private_key);
  73. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_curve,private_key);
  74. //zout(poids_faible_offset,poids_fort_offset);
  75. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_twist,private_key);
  76. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_twist,private_key);
  77. //zout(poids_faible_offset,poids_fort_offset);
  78. //serveur 1
  79. ecris(CDN 1);
  80. BitEvalL1<curvepoint_fp_t> chiffre_IP1[12*adress_size*CHAR_BIT]; //12 IPs = 4 blocs de 3 IPs en bits 12*4*8=384 bits
  81. BitEvalL2 is_zero, is_one, is_two, is_three;
  82. BitEvalL1<curvepoint_fp_t> bit_chiffre_curve_0, bit_chiffre_curve_1;
  83. BitEvalL1<twistpoint_fp2_t> bit_chiffre_twist_0, bit_chiffre_twist_1;
  84. chiffrement(bit_chiffre_curve_0,0,public_key);
  85. chiffrement(bit_chiffre_twist_0,0,public_key);
  86. chiffrement(bit_chiffre_curve_1,1,public_key);
  87. chiffrement(bit_chiffre_twist_1,1,public_key);
  88. for (unsigned int i=0; i<adress_size;i++)
  89. {
  90. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  91. {
  92. bit_clair=bitset<CHAR_BIT>(cdn1[i])[j] ;
  93. chiffrement(chiffre_IP1[i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  94. //NB au lieu de cela, dans les faits, il faudra chiffrer 3 IPs concaténer 3*(nb CDN -1) IP à 0.0.0.0 puis permuter ce chiffré par bloc de 3 IPs
  95. //zout(i*CHAR_BIT+j);
  96. }
  97. }
  98. for (unsigned int i=0; i<adress_size;i++)
  99. {
  100. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  101. {
  102. bit_clair=bitset<CHAR_BIT>(original_server[i])[j] ;
  103. chiffrement(chiffre_IP1[32+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  104. //zout(32+i*CHAR_BIT+j);
  105. }
  106. }
  107. for (unsigned int i=0; i<adress_size;i++)
  108. {
  109. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  110. {
  111. bit_clair=bitset<CHAR_BIT>(cdn2[i])[j] ;
  112. chiffrement(chiffre_IP1[64+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  113. //zout(64+i*CHAR_BIT+j);
  114. }
  115. }
  116. for (unsigned int i=0; i<9*CHAR_BIT*adress_size;i++) //on chiffre les 9 IP restantes
  117. {
  118. chiffrement(chiffre_IP1[96+i],0,public_key); //on chiffre l'IP bit à bit en mode curve
  119. //zout(96+i);
  120. }
  121. //incrémentation du offset (2 bits) modulo 4
  122. chiffre_poids_fort_offset_curve=additionL1(chiffre_poids_fort_offset_curve,chiffre_poids_faible_offset_curve,public_key);
  123. chiffre_poids_fort_offset_twist=additionL1(chiffre_poids_fort_offset_twist,chiffre_poids_faible_offset_twist,public_key); //poids fort twist
  124. chiffre_poids_faible_offset_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1,public_key); //poids faible curve
  125. //chiffre_poids_faible_offset_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1,public_key);
  126. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_curve,private_key);
  127. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_curve,private_key);
  128. //zout(poids_faible_offset,poids_fort_offset);
  129. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_twist,private_key);
  130. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_twist,private_key);
  131. //zout(poids_faible_offset,poids_fort_offset);
  132. //4 tests d'égalité --> x1,x2,x3,x4
  133. BitEvalL1<curvepoint_fp_t> faible_plus_zero_curve, faible_plus_one_curve, fort_plus_zero_curve, fort_plus_one_curve;
  134. BitEvalL1<twistpoint_fp2_t> faible_plus_zero_twist, faible_plus_one_twist, fort_plus_zero_twist, fort_plus_one_twist;
  135. faible_plus_zero_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_0, public_key);
  136. faible_plus_one_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1, public_key);
  137. //fort_plus_zero_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_0, public_key);
  138. //fort_plus_one_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_1, public_key);
  139. //faible_plus_zero_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_0, public_key);
  140. //faible_plus_one_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1, public_key);
  141. fort_plus_zero_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_0, public_key);
  142. fort_plus_one_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_1, public_key);
  143. is_zero=multiplicationL1(faible_plus_one_curve,fort_plus_one_twist,public_key); // 00 +1 +1
  144. is_one=multiplicationL1(faible_plus_one_curve,fort_plus_zero_twist,public_key); //01 +1 +0
  145. is_two=multiplicationL1(faible_plus_zero_curve,fort_plus_one_twist,public_key); //10 +0 +1
  146. is_three=multiplicationL1(faible_plus_zero_curve,fort_plus_zero_twist,public_key); //11 +0 +0
  147. //porte conditionnelle/select sur tous les bits des IP à MAJ par le serveur 1
  148. // select(x1,bit de IP1,bit de null) or select (x2,bit de IP1,bit de null) or select(x3,bit de IP1,bit de null) or select (x4,bit de IP1,bit de null)
  149. cout << "Incrémentation OK, test d'égalité OK, MAJ KO. On ne peut pas réaliser qu'une seule MAJ avec le circuit. Le circuit est de profondeur 1 + nb de MAJs." << endl;
  150. //BitEvalL3 evalue[384];
  151. ////si compteur=0
  152. //for (int i=0; i<384; i++)
  153. //{
  154. //multiplicationL1L2(,,public_key);
  155. //multiplicationL1L2(,,public_key);
  156. //evalue[i]=additionL3(,,public_key);
  157. //}
  158. ////si compteur=1
  159. //for (int i=0; i<384; i++)
  160. //{
  161. //multiplicationL1L2(,,public_key);
  162. //multiplicationL1L2(,,public_key);
  163. //evalue[i]=additionL3(,,public_key);
  164. //}
  165. ////si compteur=2
  166. //for (int i=0; i<384; i++)
  167. //{
  168. //multiplicationL1L2(,,public_key);
  169. //multiplicationL1L2(,,public_key);
  170. //evalue[i]=additionL3(,,public_key);
  171. //}
  172. ////si compteur=3
  173. //for (int i=0; i<384; i++)
  174. //{
  175. //multiplicationL1L2(,,public_key);
  176. //multiplicationL1L2(,,public_key);
  177. //evalue[i]=additionL3(,,public_key);
  178. //}
  179. //serveur 2
  180. ecris(CDN 2);
  181. BitEvalL1<curvepoint_fp_t> chiffre_IP2[12*adress_size*CHAR_BIT];
  182. for (unsigned int i=0; i<adress_size;i++)
  183. {
  184. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  185. {
  186. bit_clair=bitset<CHAR_BIT>(cdn2[i])[j] ;
  187. chiffrement(chiffre_IP2[i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  188. //NB au lieu de cela, dans les faits, il faudra chiffrer 3 IPs concaténer 3*(nb CDN -1) IP à 0.0.0.0 puis permuter ce chiffré par bloc de 3 IPs
  189. }
  190. }
  191. for (unsigned int i=0; i<adress_size;i++)
  192. {
  193. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  194. {
  195. bit_clair=bitset<CHAR_BIT>(cdn1[i])[j] ;
  196. chiffrement(chiffre_IP2[32+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  197. }
  198. }
  199. for (unsigned int i=0; i<adress_size;i++)
  200. {
  201. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  202. {
  203. bit_clair=bitset<CHAR_BIT>(cdn3[i])[j] ;
  204. chiffrement(chiffre_IP2[64+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  205. }
  206. }
  207. for (unsigned int i=0; i<9*CHAR_BIT*adress_size;i++) //on chiffre les 9 IP restantes
  208. {
  209. chiffrement(chiffre_IP2[96+i],0,public_key); //on chiffre l'IP bit à bit en mode curve
  210. }
  211. chiffre_poids_fort_offset_curve=additionL1(chiffre_poids_fort_offset_curve,chiffre_poids_faible_offset_curve,public_key);
  212. chiffre_poids_fort_offset_twist=additionL1(chiffre_poids_fort_offset_twist,chiffre_poids_faible_offset_twist,public_key);
  213. chiffre_poids_faible_offset_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1,public_key);
  214. //chiffre_poids_faible_offset_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1,public_key);
  215. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_curve,private_key);
  216. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_curve,private_key);
  217. //zout(poids_faible_offset,poids_fort_offset);
  218. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_twist,private_key);
  219. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_twist,private_key);
  220. //zout(poids_faible_offset,poids_fort_offset);
  221. //4 tests d'égalité --> x1,x2,x3,x4
  222. faible_plus_zero_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_0, public_key);
  223. faible_plus_one_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1, public_key);
  224. //fort_plus_zero_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_0, public_key);
  225. //fort_plus_one_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_1, public_key);
  226. //faible_plus_zero_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_0, public_key);
  227. //faible_plus_one_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1, public_key);
  228. fort_plus_zero_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_0, public_key);
  229. fort_plus_one_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_1, public_key);
  230. is_zero=multiplicationL1(faible_plus_one_curve,fort_plus_one_twist,public_key); // 00 +1 +1
  231. is_one=multiplicationL1(faible_plus_one_curve,fort_plus_zero_twist,public_key); //01 +1 +0
  232. is_two=multiplicationL1(faible_plus_zero_curve,fort_plus_one_twist,public_key); //10 +0 +1
  233. is_three=multiplicationL1(faible_plus_zero_curve,fort_plus_zero_twist,public_key); //11 +0 +0
  234. //exit(0);
  235. //serveur 3
  236. ecris(CDN 3);
  237. BitEvalL1<curvepoint_fp_t> chiffre_IP3[12*adress_size*CHAR_BIT];
  238. for (unsigned int i=0; i<adress_size;i++)
  239. {
  240. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  241. {
  242. bit_clair=bitset<CHAR_BIT>(cdn3[i])[j] ;
  243. chiffrement(chiffre_IP3[i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  244. //NB au lieu de cela, dans les faits, il faudra chiffrer 3 IPs concaténer 3*(nb CDN -1) IP à 0.0.0.0 puis permuter ce chiffré par bloc de 3 IPs
  245. }
  246. }
  247. for (unsigned int i=0; i<adress_size;i++)
  248. {
  249. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  250. {
  251. bit_clair=bitset<CHAR_BIT>(cdn2[i])[j] ;
  252. chiffrement(chiffre_IP3[32+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  253. }
  254. }
  255. for (unsigned int i=0; i<adress_size;i++)
  256. {
  257. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  258. {
  259. bit_clair=bitset<CHAR_BIT>(cdn4[i])[j] ;
  260. chiffrement(chiffre_IP3[64+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  261. }
  262. }
  263. for (unsigned int i=0; i<9*CHAR_BIT*adress_size;i++) //on chiffre les 9 IP restantes
  264. {
  265. chiffrement(chiffre_IP3[96+i],0,public_key); //on chiffre l'IP bit à bit en mode curve
  266. }
  267. chiffre_poids_fort_offset_curve=additionL1(chiffre_poids_fort_offset_curve,chiffre_poids_faible_offset_curve,public_key);
  268. chiffre_poids_fort_offset_twist=additionL1(chiffre_poids_fort_offset_twist,chiffre_poids_faible_offset_twist,public_key);
  269. chiffre_poids_faible_offset_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1,public_key);
  270. //chiffre_poids_faible_offset_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1,public_key);
  271. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_curve,private_key);
  272. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_curve,private_key);
  273. //zout(poids_faible_offset,poids_fort_offset);
  274. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_twist,private_key);
  275. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_twist,private_key);
  276. //zout(poids_faible_offset,poids_fort_offset);
  277. //4 tests d'égalité --> x1,x2,x3,x4
  278. faible_plus_zero_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_0, public_key);
  279. faible_plus_one_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1, public_key);
  280. //fort_plus_zero_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_0, public_key);
  281. //fort_plus_one_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_1, public_key);
  282. //faible_plus_zero_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_0, public_key);
  283. //faible_plus_one_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1, public_key);
  284. fort_plus_zero_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_0, public_key);
  285. fort_plus_one_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_1, public_key);
  286. is_zero=multiplicationL1(faible_plus_one_curve,fort_plus_one_twist,public_key); // 00 +1 +1
  287. is_one=multiplicationL1(faible_plus_one_curve,fort_plus_zero_twist,public_key); //01 +1 +0
  288. is_two=multiplicationL1(faible_plus_zero_curve,fort_plus_one_twist,public_key); //10 +0 +1
  289. is_three=multiplicationL1(faible_plus_zero_curve,fort_plus_zero_twist,public_key); //11 +0 +0
  290. //serveur 4
  291. ecris(CDN 4);
  292. BitEvalL1<curvepoint_fp_t> chiffre_IP4[12*adress_size*CHAR_BIT];
  293. for (unsigned int i=0; i<adress_size;i++)
  294. {
  295. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  296. {
  297. bit_clair=bitset<CHAR_BIT>(cdn4[i])[j] ;
  298. chiffrement(chiffre_IP4[i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  299. //NB au lieu de cela, dans les faits, il faudra chiffrer 3 IPs concaténer 3*(nb CDN -1) IP à 0.0.0.0 puis permuter ce chiffré par bloc de 3 IPs
  300. }
  301. }
  302. for (unsigned int i=0; i<adress_size;i++)
  303. {
  304. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  305. {
  306. bit_clair=bitset<CHAR_BIT>(cdn3[i])[j] ;
  307. chiffrement(chiffre_IP4[32+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  308. }
  309. }
  310. for (unsigned int i=0; i<adress_size;i++)
  311. {
  312. for (unsigned int j=0; j<CHAR_BIT;j++) //pour chaque bit
  313. {
  314. bit_clair=bitset<CHAR_BIT>(receiver[i])[j] ;
  315. chiffrement(chiffre_IP4[64+i*CHAR_BIT+j],bit_clair,public_key); //on chiffre l'IP bit à bit en mode curve
  316. }
  317. }
  318. for (unsigned int i=0; i<9*CHAR_BIT*adress_size;i++) //on chiffre les 9 IP restantes
  319. {
  320. chiffrement(chiffre_IP4[96+i],0,public_key); //on chiffre l'IP bit à bit en mode curve
  321. }
  322. chiffre_poids_fort_offset_curve=additionL1(chiffre_poids_fort_offset_curve,chiffre_poids_faible_offset_curve,public_key);
  323. chiffre_poids_fort_offset_twist=additionL1(chiffre_poids_fort_offset_twist,chiffre_poids_faible_offset_twist,public_key);
  324. chiffre_poids_faible_offset_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1,public_key);
  325. //chiffre_poids_faible_offset_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1,public_key);
  326. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_curve,private_key);
  327. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_curve,private_key);
  328. //zout(poids_faible_offset,poids_fort_offset);
  329. //dechiffrement(poids_faible_offset,chiffre_poids_faible_offset_twist,private_key);
  330. //dechiffrement(poids_fort_offset,chiffre_poids_fort_offset_twist,private_key);
  331. //zout(poids_faible_offset,poids_fort_offset);
  332. //4 tests d'égalité --> x1,x2,x3,x4
  333. faible_plus_zero_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_0, public_key);
  334. faible_plus_one_curve=additionL1(chiffre_poids_faible_offset_curve,bit_chiffre_curve_1, public_key);
  335. //fort_plus_zero_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_0, public_key);
  336. //fort_plus_one_curve=additionL1(chiffre_poids_fort_offset_curve,bit_chiffre_curve_1, public_key);
  337. //faible_plus_zero_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_0, public_key);
  338. //faible_plus_one_twist=additionL1(chiffre_poids_faible_offset_twist,bit_chiffre_twist_1, public_key);
  339. fort_plus_zero_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_0, public_key);
  340. fort_plus_one_twist=additionL1(chiffre_poids_fort_offset_twist,bit_chiffre_twist_1, public_key);
  341. is_zero=multiplicationL1(faible_plus_one_curve,fort_plus_one_twist,public_key); // 00 +1 +1 a égale b = a nxor b = a xor non b
  342. is_one=multiplicationL1(faible_plus_one_curve,fort_plus_zero_twist,public_key); //01 +1 +0
  343. is_two=multiplicationL1(faible_plus_zero_curve,fort_plus_one_twist,public_key); //10 +0 +1
  344. is_three=multiplicationL1(faible_plus_zero_curve,fort_plus_zero_twist,public_key); //11 +0 +0
  345. //contenu final
  346. //unsigned char cdn1[4]= {0x0A,0x01,0x01,0x0A};
  347. //unsigned char cdn1_source[4]= {0x0A,0x00,0x01,0x0A};
  348. //unsigned char cdn1_dest[4]= {0x0A,0x02,0x01,0x0A};
  349. //unsigned char cdn2[4]= {0x0A,0x02,0x01,0x0A};
  350. //unsigned char cdn2_source[4]= {0x0A,0x01,0x01,0x0A};
  351. //unsigned char cdn2_dest[4]= {0x0A,0x03,0x01,0x0A};
  352. //unsigned char cdn3[4]= {0x0A,0x03,0x01,0x0A};
  353. //unsigned char cdn3_source[4]= {0x0A,0x02,0x01,0x0A};
  354. //unsigned char cdn3_dest[4]= {0x0A,0x04,0x01,0x0A};
  355. //unsigned char cdn4[4]= {0x0A,0x01,0x04,0x0A};
  356. //unsigned char cdn4_source[4]= {0x0A,0x03,0x01,0x0A};
  357. //unsigned char cdn4_dest[4]= {0x64,0x01,0x01,0x0A}; //6*16+4
  358. /** compteur (2 bits) + 1 modulo 4, 2 circuits (1 entrée: bit de poids faible et 2 entrées:bit de l'offset) de profondeur 0, 4 serveurs **/
  359. /** 4 tests d'égalité, 1 circuit de profondeur 1 (2 entrées:bits de l'offset)**/
  360. /** si vrai alors bit de 192.0.0.1 sinon bit de 0.0.0.0 (3 entrées:2 bits de l'offset et 1 bit de l'IP)**/
  361. /** chaque cdn fait les tests d'égalité une seule fois **/
  362. }