chiffrement.cpp 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. #include "chiffrement.hpp"
  2. //template <typename T>
  3. //void chiffrement(BitEvalL1<T>& bit_chiffre,F2 bit_clair, PublicKey public_key, Type type)
  4. //{
  5. ////signature;
  6. //Bipoint<T> bipoint_groupelt, bipoint_subgroupelt;
  7. //scalar_t lambda;
  8. //scalar_setrandom(lambda, bn_r);
  9. ////1ere composante
  10. ///** calcul des bits clairs, urandom et chiffrés **/
  11. //F2 bit_urandom=rand()%2;
  12. //bit_chiffre.set_bit_masque(bit_clair != bit_urandom);
  13. ////2eme composante
  14. ///** calcul sur la courbe BN sur Fp **/
  15. //if (type==CURVE)
  16. //{
  17. //bipoint_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda);
  18. //bipoint_subgroupelt.makeaffine();
  19. //// calcul de b.u+u_1
  20. //if (bit_urandom == 1)
  21. //{
  22. //bit_chiffre.set_bipoint(public_key.get_bipoint_curve_groupelt() + bipoint_subgroupelt); //addition et affectation
  23. //}
  24. //else
  25. //{
  26. //bit_chiffre.set_bipoint(bipoint_subgroupelt); //affectation
  27. //}
  28. //}
  29. ///** calcul sur le twist BN sur Fp^2 **/
  30. //if (type==TWIST)
  31. //{
  32. //bipoint_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda);
  33. //bipoint_subgroupelt.makeaffine();
  34. //// calcul de b.v+v_1
  35. //if (bit_urandom == 1)
  36. //{
  37. //bit_chiffre.set_bipoint(public_key.get_bipoint_twist_groupelt() + bipoint_subgroupelt); //addition et affectation
  38. //}
  39. //else
  40. //{
  41. //bit_chiffre.set_bipoint(bipoint_subgroupelt); //affectation
  42. //}
  43. //}
  44. //bit_chiffre.makeaffine();
  45. //}
  46. void chiffrement(BitEvalL1<curvepoint_fp_t>& bit_chiffre,F2 bit_clair, PublicKey public_key)
  47. {
  48. //signature;
  49. Bipoint<curvepoint_fp_t> bipoint_groupelt, bipoint_subgroupelt;
  50. scalar_t lambda;
  51. scalar_setrandom(lambda, bn_r);
  52. //1ere composante
  53. /** calcul des bits clairs, urandom et chiffrés **/
  54. F2 bit_urandom=rand()%2;
  55. bit_chiffre.set_bit_masque(bit_clair != bit_urandom);
  56. //2eme composante
  57. /** calcul sur la courbe BN sur Fp **/
  58. bipoint_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda);
  59. bipoint_subgroupelt.makeaffine();
  60. // calcul de b.u+u_1
  61. if (bit_urandom == 1)
  62. {
  63. bit_chiffre.set_bipoint(public_key.get_bipoint_curve_groupelt() + bipoint_subgroupelt); //addition et affectation
  64. }
  65. else
  66. {
  67. bit_chiffre.set_bipoint(bipoint_subgroupelt); //affectation
  68. }
  69. bit_chiffre.makeaffine();
  70. }
  71. void chiffrement(BitEvalL1<twistpoint_fp2_t>& bit_chiffre,F2 bit_clair, PublicKey public_key)
  72. {
  73. //signature;
  74. Bipoint<twistpoint_fp2_t> bipoint_groupelt, bipoint_subgroupelt;
  75. scalar_t lambda;
  76. scalar_setrandom(lambda, bn_r);
  77. //1ere composante
  78. /** calcul des bits clairs, urandom et chiffrés **/
  79. F2 bit_urandom=rand()%2;
  80. bit_chiffre.set_bit_masque(bit_clair != bit_urandom);
  81. //2eme composante
  82. /** calcul sur le twist BN sur Fp^2 **/
  83. bipoint_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda);
  84. bipoint_subgroupelt.makeaffine();
  85. // calcul de b.u+u_1
  86. if (bit_urandom == 1)
  87. {
  88. bit_chiffre.set_bipoint(public_key.get_bipoint_twist_groupelt() + bipoint_subgroupelt); //addition et affectation
  89. }
  90. else
  91. {
  92. bit_chiffre.set_bipoint(bipoint_subgroupelt); //affectation
  93. }
  94. bit_chiffre.makeaffine();
  95. }
  96. void chiffrement(BitChiffre& bit_chiffre,F2 bit_clair, PublicKey public_key, Type type)
  97. {
  98. //signature;
  99. Bipoint<curvepoint_fp_t> bipoint_curve_groupelt, bipoint_curve_subgroupelt; // A, B, C, D, temp;
  100. Bipoint<twistpoint_fp2_t> bipoint_twist_groupelt, bipoint_twist_subgroupelt;
  101. scalar_t lambda,lambda2;
  102. scalar_setrandom(lambda, bn_r);
  103. scalar_setrandom(lambda2, bn_r);
  104. //1ere composante
  105. /** calcul des bits clairs, urandom et chiffrés **/
  106. F2 bit_urandom=rand()%2;
  107. bit_chiffre.set_bit_masque(bit_clair != bit_urandom); // dans F2 -=+=^=XOR bitwise (!= logical XOR résultat pareil pour 0 et 1, mais l'opérateur bitwitse sur des bool convertit le bool en int, fait l'opération bitwise et reconvertit en bool) m-b //(bit_clair != bit_urandom)
  108. //zout (bit_clair,bit_urandom);
  109. //bit_chiffre.print_bit_masque();
  110. //if (bit_clair==0 && bit_urandom==0) {cout << BOLDRED << "Cas 1" << RESET << endl;}
  111. //if (bit_clair==0 && bit_urandom==1) {cout << BOLDRED << "Cas 2" << RESET << endl;}
  112. //if (bit_clair==1 && bit_urandom==0) {cout << BOLDRED << "Cas 3" << RESET << endl;}
  113. //if (bit_clair==1 && bit_urandom==1) {cout << BOLDRED << "Cas 4" << RESET << endl;}
  114. //2eme composante
  115. /** calcul sur la courbe BN sur Fp**/
  116. if (type==CURVE)
  117. {
  118. ////lambda_1[0]=0;lambda_1[1]=0;lambda_1[2]=0;lambda_1[3]=0; // 0
  119. //lambda_1[0]=1;lambda_1[1]=0;lambda_1[2]=0;lambda_1[3]=0; // 1
  120. //cout << RED << "affichage du scalar_t lambda_1" << RESET <<endl;
  121. //scalar_print(stdout, lambda_1);
  122. //JUMP;
  123. //public_key.print();
  124. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda);
  125. //D.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda2);
  126. //D.makeaffine();
  127. bipoint_curve_subgroupelt.makeaffine();
  128. // calcul de b.u+u_1
  129. if (bit_urandom == 1)
  130. {
  131. //cout << RED << "affichage du bipoint u" << RESET << endl;
  132. //bipoint_curve_groupelt.print();
  133. //cout << RED << "affichage du bipoint u1" << RESET << endl;
  134. //bipoint_curve_subgroupelt.print();
  135. //A=public_key.get_bipoint_curve_groupelt();
  136. //A.makeaffine();
  137. //representation(A);
  138. //B=bipoint_curve_subgroupelt;
  139. //B.makeaffine();
  140. //representation(B);
  141. //C=A;
  142. //ecris(A); //u fixe
  143. //A.print();
  144. //ecris(pi1(A));
  145. //private_key.pi_1(A).makeaffine();
  146. //private_key.pi_1(A).print();
  147. //ecris(B); //u1
  148. //B.print();
  149. //ecris(pi1(B));
  150. //private_key.pi_1(B).makeaffine();
  151. //private_key.pi_1(B).print();
  152. //ecris(C); //u fixe
  153. //C.print();
  154. //ecris(pi1(C));
  155. //private_key.pi_1(C).makeaffine();
  156. //private_key.pi_1(C).print();
  157. //ecris(D); //u'1
  158. //D.print();
  159. //ecris(pi1(D));
  160. //private_key.pi_1(D).makeaffine();
  161. //private_key.pi_1(D).print();
  162. //ecris(((A+B)+C)+D);
  163. //temp=((A+B)+C)+D;
  164. //temp.makeaffine();
  165. //temp.print();
  166. //ecris((A+(B+C))+D);
  167. //temp=((A+(B+C))+D);
  168. //temp.makeaffine();
  169. //temp.print();
  170. //ecris(((B+C)+D)+A);
  171. //temp=((B+C)+D)+A;
  172. //temp.makeaffine();
  173. //temp.print();
  174. //ecris((B+(C+D))+A);
  175. //temp=((B+(C+D))+A);
  176. //temp.makeaffine();
  177. //temp.print();
  178. //ecris((A+B)+(C+D));
  179. //temp=(A+B)+(C+D);
  180. //temp.makeaffine();
  181. //temp.print();
  182. //representation(temp);
  183. //ecris((C+D)+(A+B));
  184. //temp=(C+D)+(A+B);
  185. //temp.makeaffine();
  186. //temp.print();
  187. //ecris(pi1((A+B)+(C+D)));
  188. //private_key.pi_1(temp).makeaffine();
  189. //private_key.pi_1(temp).print();
  190. //ecris(2A);
  191. //curvepoint_fp_double(temp[0],A[0]);
  192. //curvepoint_fp_double(temp[1],A[1]);
  193. //temp.makeaffine();
  194. //temp.print();
  195. //ecris(2A+B+D);
  196. //curvepoint_fp_double(temp[0],A[0]);
  197. //curvepoint_fp_double(temp[1],A[1]);
  198. //temp=temp+B+D;
  199. //temp.makeaffine();
  200. //temp.print();
  201. //ecris(B);
  202. //B.makeaffine();
  203. //B.print();
  204. //ecris(B+B);
  205. //temp=B+B;
  206. //temp.makeaffine();
  207. //temp.print();
  208. //ecris(A+C);
  209. //temp=(A+C);
  210. //temp.makeaffine();
  211. //temp.print();
  212. //ecris(pi1(A+C));
  213. //private_key.pi_1(temp).makeaffine();
  214. //private_key.pi_1(temp).print();
  215. //ecris(B+D);
  216. //temp=(B+D);
  217. //temp.makeaffine();
  218. //temp.print();
  219. //ecris((A+C)+ (B+D));
  220. //temp=((A+C)+ (B+D));
  221. //temp.makeaffine();
  222. //temp.print();
  223. //representation(temp);
  224. //ecris(pi1(A+C)+ (B+D));
  225. //private_key.pi_1(temp).makeaffine();
  226. //private_key.pi_1(temp).print();
  227. //bit_chiffre.set_bipoint_curve(bipoint_curve_groupelt + bipoint_curve_subgroupelt); //addition et affectation
  228. bit_chiffre.set_bipoint_curve(public_key.get_bipoint_curve_groupelt() + bipoint_curve_subgroupelt); //addition et affectation
  229. }
  230. else
  231. {
  232. //cout << RED << "affichage du bipoint u1" << RESET << endl;
  233. //bipoint_curve_subgroupelt.print();
  234. //cout << BOLDRED << "OBJECTIF POINT A L'INFINI" << RESET << endl;
  235. bit_chiffre.set_bipoint_curve(bipoint_curve_subgroupelt); //affectation
  236. }
  237. }
  238. //3eme composante
  239. /** calcul sur le twist BN sur Fp^2 **/
  240. if (type==TWIST)
  241. {
  242. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda);
  243. bipoint_twist_subgroupelt.makeaffine();
  244. // calcul de b.v+v_1
  245. if (bit_urandom == 1)
  246. {
  247. //bit_chiffre.set_bipoint_twist(bipoint_twist_groupelt + bipoint_twist_subgroupelt); //addition et affectation
  248. bit_chiffre.set_bipoint_twist(public_key.get_bipoint_twist_groupelt() + bipoint_twist_subgroupelt); //addition et affectation
  249. }
  250. else
  251. {
  252. bit_chiffre.set_bipoint_twist(bipoint_twist_subgroupelt); //affectation
  253. }
  254. }
  255. bit_chiffre.makeaffine();
  256. }
  257. // chiffrement BGN-F utile pour calculer Enc(1) et Enc(s) dans les chiffrés de niveau 2
  258. void chiffrement(Bipoint<curvepoint_fp_t>& ciphertext,F2 bit_clair, PublicKey public_key)
  259. {
  260. scalar_t lambda;
  261. scalar_setrandom(lambda, bn_r);
  262. Bipoint<curvepoint_fp_t> bipoint_curve_groupelt, bipoint_curve_subgroupelt;
  263. bipoint_curve_subgroupelt.scalarmult_vartime(public_key.get_bipoint_curvegen(),lambda);
  264. bipoint_curve_subgroupelt.makeaffine();
  265. // calcul de m.u+u_1
  266. if (bit_clair == 1)
  267. {
  268. ciphertext = public_key.get_bipoint_curve_groupelt() + bipoint_curve_subgroupelt; //addition et affectation
  269. }
  270. else
  271. {
  272. ciphertext = bipoint_curve_subgroupelt; //affectation
  273. }
  274. ciphertext.makeaffine();
  275. }
  276. void chiffrement(Bipoint<twistpoint_fp2_t>& ciphertext,F2 bit_clair, PublicKey public_key)
  277. {
  278. scalar_t lambda;
  279. scalar_setrandom(lambda, bn_r);
  280. Bipoint<twistpoint_fp2_t> bipoint_twist_groupelt, bipoint_twist_subgroupelt;
  281. bipoint_twist_subgroupelt.scalarmult_vartime(public_key.get_bipoint_twistgen(),lambda);
  282. bipoint_twist_subgroupelt.makeaffine();
  283. // calcul de m.v+v_1
  284. if (bit_clair == 1)
  285. {
  286. ciphertext = public_key.get_bipoint_twist_groupelt() + bipoint_twist_subgroupelt; //addition et affectation
  287. }
  288. else
  289. {
  290. ciphertext = bipoint_twist_subgroupelt; //affectation
  291. }
  292. ciphertext.makeaffine();
  293. }