dechiffrement.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. #include "dechiffrement.hpp"
  2. void dechiffrement(F2& bit_dechiffre, BitEvalL1<curvepoint_fp_t> bit_chiffre, PrivateKey private_key)
  3. {
  4. Bipoint<curvepoint_fp_t> bipoint_pi_1_chiffre, bipoint_pi_1_u, bipoint_pi_1_2u;
  5. bipoint_pi_1_chiffre = private_key.pi_1(bit_chiffre.get_bipoint());
  6. if (fpe_iszero(bipoint_pi_1_chiffre[0]->m_z) && fpe_iszero(bipoint_pi_1_chiffre[1]->m_z))
  7. {
  8. //cout << "cas log=0" << endl;
  9. bit_dechiffre = bit_chiffre.get_bit_masque();
  10. return;
  11. }
  12. bipoint_pi_1_u = private_key.pi_1(public_key.get_bipoint_curve_groupelt());
  13. if (bipoint_pi_1_chiffre == bipoint_pi_1_u)
  14. {
  15. //cout << "cas log=1" << endl;
  16. bit_dechiffre = (bit_chiffre.get_bit_masque()+1)%2;
  17. return;
  18. }
  19. bipoint_pi_1_2u=bipoint_pi_1_u+bipoint_pi_1_u;
  20. bipoint_pi_1_2u.makeaffine();
  21. if (bipoint_pi_1_chiffre == bipoint_pi_1_2u)
  22. {
  23. //cout << "cas log=2" << endl; //a améliorer
  24. bit_dechiffre = bit_chiffre.get_bit_masque();
  25. return;
  26. }
  27. //cout << "cas log >=3" << endl; //a améliorer et a répercuter dans la seconde fonction dechiffrement
  28. //cout << "cas log>2" << endl;
  29. Bipoint<curvepoint_fp_t> mul_log=bipoint_pi_1_2u+bipoint_pi_1_u;
  30. mul_log.makeaffine();
  31. int log=3;
  32. while(!(bipoint_pi_1_chiffre == mul_log))
  33. {
  34. mul_log=mul_log+bipoint_pi_1_u;
  35. mul_log.makeaffine();
  36. log++;
  37. //zout(log);
  38. }
  39. //zout(log);
  40. bit_dechiffre = (bit_chiffre.get_bit_masque()+ log)%2;
  41. }
  42. void dechiffrement(F2& bit_dechiffre, BitEvalL1<twistpoint_fp2_t> bit_chiffre, PrivateKey private_key) // pour les chiffrés de niveau 1
  43. {
  44. Bipoint<twistpoint_fp2_t> bipoint_pi_2_chiffre, bipoint_pi_2_v, bipoint_pi_2_2v;
  45. bipoint_pi_2_chiffre = private_key.pi_2(bit_chiffre.get_bipoint()); //pi_2(bv+v1)
  46. if (fp2e_iszero(bipoint_pi_2_chiffre[0]->m_z) && fp2e_iszero(bipoint_pi_2_chiffre[1]->m_z))
  47. {
  48. //cout << "cas log=0" << endl;
  49. bit_dechiffre = bit_chiffre.get_bit_masque();
  50. return;
  51. }
  52. bipoint_pi_2_v = private_key.pi_2(public_key.get_bipoint_twist_groupelt());
  53. if (bipoint_pi_2_chiffre == bipoint_pi_2_v)
  54. {
  55. //cout << "cas log=1" << endl;
  56. bit_dechiffre = (bit_chiffre.get_bit_masque()+1)%2;
  57. return;
  58. }
  59. bipoint_pi_2_2v=bipoint_pi_2_v+bipoint_pi_2_v;
  60. bipoint_pi_2_2v.makeaffine();
  61. if (bipoint_pi_2_chiffre == bipoint_pi_2_2v)
  62. {
  63. //cout << "cas log=2" << endl; //a améliorer
  64. bit_dechiffre = bit_chiffre.get_bit_masque();
  65. return;
  66. }
  67. Bipoint<twistpoint_fp2_t> mul_log=bipoint_pi_2_2v+bipoint_pi_2_v;
  68. mul_log.makeaffine();
  69. int log=3;
  70. while(!(bipoint_pi_2_chiffre == mul_log))
  71. {
  72. mul_log=mul_log+bipoint_pi_2_v;
  73. mul_log.makeaffine();
  74. log++;
  75. //zout(log);
  76. }
  77. //zout(log);
  78. bit_dechiffre = (bit_chiffre.get_bit_masque()+ log)%2;
  79. }
  80. void dechiffrement(F2& bit_dechiffre, BitChiffre bit_chiffre, PrivateKey private_key, Type type)
  81. {
  82. //signature;
  83. if (type == CURVE)
  84. {
  85. Bipoint<curvepoint_fp_t> bipoint_pi_1_chiffre, bipoint_pi_1_u, bipoint_pi_1_2u;
  86. //cout << RED << "affichage du bit chiffré (le bit a et le bipoint bu+u1)" << RESET << endl;
  87. //bit_chiffre.print_bit_chiffre(CURVE);
  88. bipoint_pi_1_chiffre = private_key.pi_1(bit_chiffre.get_bipoint_curve()); //pi_1(bu+u1)
  89. //cout << RED << "affichage du bipoint pi_1(bu+u1)" << RESET << endl;
  90. //bipoint_pi_1_chiffre.print();
  91. //public_key.print();
  92. //cout << RED << "affichage du bipoint pi_1(u)" << RESET << endl;
  93. //bipoint_pi_1_u.print();
  94. //cout << RED << "affichage du bipoint pi_1(2u)=2pi_1(u)=pi_1(u)+pi_1(u)" << RESET << endl;
  95. //(bipoint_pi_1_2u).print();
  96. //si le bipoint est (0,0) alors log=0 sinon log=1, bitdecode=bitmasque+log
  97. ////bit_chiffre.print_bit_masque();
  98. //bit_chiffre.get_bipoint_curve().print();
  99. //bipoint_pi_1_chiffre.print();
  100. if (fpe_iszero(bipoint_pi_1_chiffre[0]->m_z) && fpe_iszero(bipoint_pi_1_chiffre[1]->m_z))
  101. {
  102. //cout << "cas log=0" << endl;
  103. bit_dechiffre = bit_chiffre.get_bit_masque();
  104. return;
  105. }
  106. bipoint_pi_1_u = private_key.pi_1(public_key.get_bipoint_curve_groupelt());
  107. if (bipoint_pi_1_chiffre == bipoint_pi_1_u)
  108. {
  109. //cout << "cas log=1" << endl;
  110. bit_dechiffre = (bit_chiffre.get_bit_masque()+1)%2;
  111. return;
  112. }
  113. bipoint_pi_1_2u=bipoint_pi_1_u+bipoint_pi_1_u;
  114. bipoint_pi_1_2u.makeaffine();
  115. if (bipoint_pi_1_chiffre == bipoint_pi_1_2u)
  116. {
  117. //cout << "cas log=2" << endl; //a améliorer
  118. bit_dechiffre = bit_chiffre.get_bit_masque();
  119. return;
  120. }
  121. //cout << "cas log >=3" << endl; //a améliorer et a répercuter dans la seconde fonction dechiffrement
  122. Bipoint<curvepoint_fp_t> mul_log=bipoint_pi_1_2u+bipoint_pi_1_u;
  123. mul_log.makeaffine();
  124. int log=3;
  125. while(!(bipoint_pi_1_chiffre == mul_log))
  126. {
  127. mul_log=mul_log+bipoint_pi_1_u;
  128. mul_log.makeaffine();
  129. log++;
  130. //zout(log);
  131. }
  132. //zout(log);
  133. bit_dechiffre = (bit_chiffre.get_bit_masque()+ log)%2;
  134. }
  135. if (type == TWIST)
  136. {
  137. Bipoint<twistpoint_fp2_t> bipoint_pi_2_chiffre, bipoint_pi_2_v, bipoint_pi_2_2v;
  138. bipoint_pi_2_chiffre = private_key.pi_2(bit_chiffre.get_bipoint_twist()); //pi_2(bv+v1)
  139. //bipoint_pi_2_v = private_key.pi_2(public_key.get_bipoint_twist_groupelt());
  140. //bipoint_pi_2_chiffre.print_point(0);
  141. //jump;
  142. //bipoint_pi_2_chiffre.print_point(1);
  143. //JUMP;
  144. //bipoint_pi_2_v.print_point(0);
  145. //jump;
  146. //bipoint_pi_2_v.print_point(1);
  147. //JUMP;
  148. //zout(bit_chiffre.get_bit_masque());
  149. //bit_chiffre.print_bit_masque();
  150. if (fp2e_iszero(bipoint_pi_2_chiffre[0]->m_z) && fp2e_iszero(bipoint_pi_2_chiffre[1]->m_z))
  151. {
  152. //cout << "cas log=0" << endl;
  153. bit_dechiffre = bit_chiffre.get_bit_masque();
  154. return;
  155. }
  156. bipoint_pi_2_v = private_key.pi_2(public_key.get_bipoint_twist_groupelt());
  157. if (bipoint_pi_2_chiffre == bipoint_pi_2_v)
  158. {
  159. //cout << "cas log=1" << endl;
  160. bit_dechiffre = (bit_chiffre.get_bit_masque()+1)%2;
  161. return;
  162. }
  163. bipoint_pi_2_2v=bipoint_pi_2_v+bipoint_pi_2_v;
  164. bipoint_pi_2_2v.makeaffine();
  165. if (bipoint_pi_2_chiffre == bipoint_pi_2_2v)
  166. {
  167. //cout << "cas log=2" << endl; //a améliorer
  168. bit_dechiffre = bit_chiffre.get_bit_masque();
  169. return;
  170. }
  171. Bipoint<twistpoint_fp2_t> mul_log=bipoint_pi_2_2v+bipoint_pi_2_v;
  172. mul_log.makeaffine();
  173. int log=3;
  174. while(!(bipoint_pi_2_chiffre == mul_log))
  175. {
  176. mul_log=mul_log+bipoint_pi_2_v;
  177. mul_log.makeaffine();
  178. log++;
  179. //zout(log);
  180. }
  181. //zout(log);
  182. bit_dechiffre = (bit_chiffre.get_bit_masque()+ log)%2;
  183. }
  184. }
  185. void dechiffrement(F2& bit_dechiffre, Bipoint<curvepoint_fp_t> bipoint, PrivateKey private_key)
  186. //routine pour les évalués de niveau 3 et 4, déchiffrement sans Catalano Fiore, calcul d'un log seulement, prend en entrée un bipoint de type curve (inutile de traiter le cas twist car on peut évaluer les circuits de niveau 3 et 4 en traitant seuelement un des deux types, le type Curve opère dans Fp, les opérations sont moins couteuses) et non pas un chiffré de niveau 1
  187. {
  188. Bipoint<curvepoint_fp_t> bipoint_pi_1_chiffre, bipoint_pi_1_u, bipoint_pi_1_2u;
  189. bipoint_pi_1_chiffre = private_key.pi_1(bipoint); //pi_1(bu+u1)
  190. if (fpe_iszero(bipoint_pi_1_chiffre[0]->m_z) && fpe_iszero(bipoint_pi_1_chiffre[1]->m_z))
  191. {
  192. //cout << "cas log=0" << endl;
  193. bit_dechiffre = 0;
  194. }
  195. else
  196. {
  197. bipoint_pi_1_u = private_key.pi_1(public_key.get_bipoint_curve_groupelt());
  198. if (bipoint_pi_1_chiffre == bipoint_pi_1_u)
  199. {
  200. //cout << "cas log=1" << endl;
  201. bit_dechiffre = 1;
  202. }
  203. else
  204. {
  205. bipoint_pi_1_2u=bipoint_pi_1_u+bipoint_pi_1_u;
  206. bipoint_pi_1_2u.makeaffine();
  207. if (bipoint_pi_1_chiffre == bipoint_pi_1_2u)
  208. {
  209. //cout << "cas log=2" << endl; //a améliorer
  210. bit_dechiffre = 0;
  211. }
  212. else
  213. {
  214. //cout << "cas log >=3" << endl; //a améliorer et a répercuter dans la seconde fonction dechiffrement
  215. Bipoint<curvepoint_fp_t> mul_log=bipoint_pi_1_2u+bipoint_pi_1_u;
  216. mul_log.makeaffine();
  217. int log=3;
  218. while(!(bipoint_pi_1_chiffre == mul_log))
  219. {
  220. mul_log=mul_log+bipoint_pi_1_u;
  221. mul_log.makeaffine();
  222. log++;
  223. //zout(log);
  224. }
  225. //zout(log);
  226. bit_dechiffre = log%2;
  227. }
  228. }
  229. }
  230. }
  231. void dechiffrement(F2& bit_dechiffre, Bipoint<twistpoint_fp2_t> bipoint, PrivateKey private_key)
  232. //finalement, on fait le cas twist pour aider au debug
  233. {
  234. Bipoint<twistpoint_fp2_t> bipoint_pi_2_chiffre, bipoint_pi_2_v, bipoint_pi_2_2v;
  235. bipoint_pi_2_chiffre = private_key.pi_2(bipoint); //pi_2(bu+u1)
  236. if (fp2e_iszero(bipoint_pi_2_chiffre[0]->m_z) && fp2e_iszero(bipoint_pi_2_chiffre[1]->m_z))
  237. {
  238. //cout << "cas log=0" << endl;
  239. bit_dechiffre = 0;
  240. }
  241. else
  242. {
  243. bipoint_pi_2_v = private_key.pi_2(public_key.get_bipoint_twist_groupelt());
  244. if (bipoint_pi_2_chiffre == bipoint_pi_2_v)
  245. {
  246. //cout << "cas log=1" << endl;
  247. bit_dechiffre = 1;
  248. }
  249. else
  250. {
  251. bipoint_pi_2_2v=bipoint_pi_2_v+bipoint_pi_2_v;
  252. bipoint_pi_2_2v.makeaffine();
  253. if (bipoint_pi_2_chiffre == bipoint_pi_2_2v)
  254. {
  255. //cout << "cas log=2" << endl; //a améliorer
  256. bit_dechiffre = 0;
  257. }
  258. else
  259. {
  260. //cout << "cas log >=3" << endl; //a améliorer et a répercuter dans la seconde fonction dechiffrement
  261. Bipoint<twistpoint_fp2_t> mul_log=bipoint_pi_2_2v+bipoint_pi_2_v;
  262. mul_log.makeaffine();
  263. int log=3;
  264. while(!(bipoint_pi_2_chiffre == mul_log))
  265. {
  266. mul_log=mul_log+bipoint_pi_2_v;
  267. mul_log.makeaffine();
  268. log++;
  269. //zout(log);
  270. }
  271. //zout(log);
  272. //bit_dechiffre = log%2;
  273. }
  274. }
  275. }
  276. }