Advertisement
Guest User

Untitled

a guest
Jun 6th, 2011
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.61 KB | None | 0 0
  1. //rsa.cpp
  2.  
  3. #include "rsa.h"
  4. #include <gmp.h>
  5. #include <stdlib.h>
  6. void euclideEtendu (mpz_t c, mpz_t m, mpz_t* u, mpz_t* v)
  7. {
  8. mpz_t a, b, q, r, s, t, tmp, tmp2;
  9.  
  10. mpz_init(a);
  11. mpz_init(b);
  12. mpz_init(q);
  13. mpz_init(r);
  14. mpz_init(s);
  15. mpz_init(t);
  16. mpz_init(tmp);
  17. mpz_init(tmp2);
  18.  
  19.  
  20. mpz_set(a, c);
  21. mpz_set(b, m);
  22.  
  23. mpz_set_str(*u, "1", 10);
  24. mpz_set_str(*v, "0", 10);
  25. mpz_set_str(s, "0", 10);
  26. mpz_set_str(t, "1", 10);
  27.  
  28. while(mpz_cmp_ui(b, 0) > 0)
  29. {
  30. mpz_fdiv_q(q, a, b);
  31. mpz_mod (r, a, b);
  32. mpz_set(a, b);
  33. mpz_set(b, r);
  34. mpz_set(tmp, s);
  35. mpz_mul(tmp2, q, s);
  36. mpz_sub(s, *u, tmp2);
  37. mpz_set(*u, tmp);
  38. mpz_set(tmp, t);
  39. mpz_mul(tmp2, q, t);
  40. mpz_sub(t, *v, tmp2);
  41. mpz_set(*v, tmp);
  42. }
  43.  
  44. //return a;
  45. }
  46.  
  47. Rsa::Rsa()
  48. {
  49. this->state = new gmp_randstate_t;
  50.  
  51. static bool aleatoireInitialise = false;
  52.  
  53. if (false == aleatoireInitialise)
  54. {
  55. // Initialisation de rand
  56. gmp_randinit_default(*(gmp_randstate_t*)this->state);
  57. gmp_randseed_ui(*(gmp_randstate_t*)this->state, time(0));
  58.  
  59. aleatoireInitialise = true;
  60. }
  61.  
  62. c = new mpz_t;
  63. n = new mpz_t;
  64. u = new mpz_t;
  65.  
  66. mpz_init(*(mpz_t*)c);
  67. mpz_init(*(mpz_t*)n);
  68. mpz_init(*(mpz_t*)u);
  69. }
  70.  
  71. void Rsa::genererCles(unsigned int tailleCle)
  72. {
  73. // Creation d'un nombre P fort probablement premier
  74. mpz_t p;
  75. mpz_init(p);
  76. do
  77. {
  78. mpz_urandomb (p, *(gmp_randstate_t*)this->state, tailleCle / 2);
  79. }
  80. while(mpz_probab_prime_p(p, 10) < 1);
  81.  
  82. // Creation d'un nombre Q fort probablement premier
  83. mpz_t q;
  84. mpz_init(q);
  85. do
  86. {
  87. mpz_urandomb (q, *(gmp_randstate_t*)this->state, tailleCle / 2);
  88. }
  89. while(mpz_probab_prime_p(q, 10) < 1);
  90.  
  91. // Creation du nombre n = p x q
  92. mpz_mul(*(mpz_t*)n, p, q);
  93.  
  94. // Creation du nombre M = (P-1)x(Q-1)
  95. mpz_t pMoinsUn;
  96. mpz_init(pMoinsUn);
  97. mpz_sub_ui(pMoinsUn, p, 1); // P-1
  98. mpz_t qMoinsUn;
  99. mpz_init(qMoinsUn);
  100. mpz_sub_ui(qMoinsUn, q, 1); // Q-1
  101. mpz_t m;
  102. mpz_init(m);
  103. mpz_mul(m, pMoinsUn, qMoinsUn); // M = (P-1)x(Q-1)
  104. mpz_clear(pMoinsUn); // Liberation des variables provisoirs
  105. mpz_clear(qMoinsUn);
  106.  
  107. // Creation du nombre C premier avec M
  108. mpz_t pgcd;
  109. mpz_init(pgcd);
  110. do
  111. {
  112. mpz_urandomb (*(mpz_t*)c, *(gmp_randstate_t*)state, tailleCle / 2); //! Essayer sans la division par deux
  113. mpz_gcd(pgcd, m, *(mpz_t*)c);
  114. }
  115. while (mpz_cmp_ui(pgcd, 1) != 0);
  116. mpz_clear(pgcd);
  117.  
  118. // Determination de U
  119. mpz_t v;
  120. mpz_init(v);
  121. euclideEtendu (*(mpz_t*)c, m, (mpz_t*)u, &v);
  122.  
  123. // Recherche d'une valeur de U acceptable
  124. mpz_t uZero;
  125. mpz_init(uZero);
  126. mpz_set(uZero, *(mpz_t*)u);
  127. mpz_t k;
  128. mpz_init(k);
  129. mpz_set_str(k, "0", 10);
  130. mpz_t uFinal;
  131. mpz_init(uFinal);
  132. while(mpz_cmp_ui(uFinal, 2) < 0)
  133. {
  134. mpz_sub_ui(k, k, 1);
  135. mpz_t kFoisM;
  136. mpz_init(kFoisM);
  137. mpz_mul(kFoisM, k, m);
  138. mpz_sub(uFinal, uZero, kFoisM);
  139. mpz_clear(kFoisM);
  140. }
  141. mpz_set(*(mpz_t*)u, uFinal);
  142. mpz_clear(uFinal); // Liberation des variables temporaires
  143. mpz_clear(uZero);
  144. mpz_clear(k);
  145.  
  146. // Liberation des nombres GMP
  147. mpz_clear(p);
  148. mpz_clear(q);
  149. mpz_clear(m);
  150. }
  151.  
  152. Rsa::~Rsa()
  153. {
  154. mpz_clear(*(mpz_t*)c);
  155. mpz_clear(*(mpz_t*)n);
  156. mpz_clear(*(mpz_t*)u);
  157.  
  158. delete (mpz_t*)c;
  159. delete (mpz_t*)n;
  160. delete (mpz_t*)u;
  161. }
  162.  
  163. /*void Rsa::euclideEtendu (mpz_t c, mpz_t m, mpz_t* u, mpz_t* v)
  164. {
  165. mpz_t a, b, q, r, s, t, tmp, tmp2;
  166.  
  167. mpz_init(a);
  168. mpz_init(b);
  169. mpz_init(q);
  170. mpz_init(r);
  171. mpz_init(s);
  172. mpz_init(t);
  173. mpz_init(tmp);
  174. mpz_init(tmp2);
  175.  
  176.  
  177. mpz_set(a, c);
  178. mpz_set(b, m);
  179.  
  180. mpz_set_str(*u, "1", 10);
  181. mpz_set_str(*v, "0", 10);
  182. mpz_set_str(s, "0", 10);
  183. mpz_set_str(t, "1", 10);
  184.  
  185. while(mpz_cmp_ui(b, 0) > 0)
  186. {
  187. mpz_fdiv_q(q, a, b);
  188. mpz_mod (r, a, b);
  189. mpz_set(a, b);
  190. mpz_set(b, r);
  191. mpz_set(tmp, s);
  192. mpz_mul(tmp2, q, s);
  193. mpz_sub(s, *u, tmp2);
  194. mpz_set(*u, tmp);
  195. mpz_set(tmp, t);
  196. mpz_mul(tmp2, q, t);
  197. mpz_sub(t, *v, tmp2);
  198. mpz_set(*v, tmp);
  199. }
  200.  
  201. //return a;
  202. }*/
  203.  
  204. std::string Rsa::clePrivee()
  205. {
  206. // Lecture de N dans bufferChaine (base 16)
  207. unsigned int taille = mpz_sizeinbase(*(mpz_t*)n, 16);
  208. char* bufferChaine = (char*)malloc (taille + 1);
  209. mpz_get_str(bufferChaine, 16, *(mpz_t*)n);
  210.  
  211. std::string chaineFinale(bufferChaine);
  212. free(bufferChaine);
  213.  
  214. chaineFinale += "-";
  215.  
  216. // Lecture de C dans bufferChaine (base 16)
  217. taille = mpz_sizeinbase(*(mpz_t*)u, 16);
  218. bufferChaine = (char*)malloc (taille + 1);
  219. mpz_get_str(bufferChaine, 16, *(mpz_t*)u);
  220.  
  221. chaineFinale += bufferChaine;
  222. free(bufferChaine);
  223.  
  224. return chaineFinale;
  225. }
  226.  
  227. std::string Rsa::clePublique()
  228. {
  229. // Lecture de N dans bufferChaine (base 16)
  230. unsigned int taille = mpz_sizeinbase(*(mpz_t*)n, 16);
  231. char* bufferChaine = (char*)malloc (taille + 1);
  232. mpz_get_str(bufferChaine, 16, *(mpz_t*)n);
  233.  
  234. std::string chaineFinale(bufferChaine);
  235. free(bufferChaine);
  236. chaineFinale += "-";
  237.  
  238. // Lecture de C dans bufferChaine (base 16)
  239. taille = mpz_sizeinbase(*(mpz_t*)c, 16);
  240. bufferChaine = (char*)malloc (taille + 1);
  241. mpz_get_str(bufferChaine, 16, *(mpz_t*)c);
  242.  
  243. chaineFinale += bufferChaine;
  244. free(bufferChaine);
  245.  
  246. return chaineFinale;
  247. }
  248.  
  249. void Rsa::clePrivee(std::string cle)
  250. {
  251. // Reconstruction de N
  252. mpz_clear(*(mpz_t*)n);
  253. mpz_init(*(mpz_t*)n);
  254. mpz_set_str(*(mpz_t*)n, cle.substr(0, cle.find_first_of("-")).c_str(), 16);
  255.  
  256. // Reconstruction de U
  257. mpz_clear(*(mpz_t*)u);
  258. mpz_init(*(mpz_t*)u);
  259. mpz_set_str(*(mpz_t*)u, cle.substr(cle.find_first_of("-") + 1, cle.size()).c_str(), 16);
  260. }
  261.  
  262. void Rsa::clePublique(std::string cle)
  263. {
  264. // Reconstruction de N
  265. mpz_clear(*(mpz_t*)n);
  266. mpz_init(*(mpz_t*)n);
  267. mpz_set_str(*(mpz_t*)n, cle.substr(0, cle.find_first_of("-")).c_str(), 16);
  268.  
  269. // Reconstruction de C
  270. mpz_clear(*(mpz_t*)c);
  271. mpz_init(*(mpz_t*)c);
  272. mpz_set_str(*(mpz_t*)c, cle.substr(cle.find_first_of("-") + 1, cle.size()).c_str(), 16);
  273. }
  274.  
  275. std::string Rsa::coderMessage(std::string message)
  276. {
  277. std::string messageCode;
  278. for(unsigned int i = 0; i < message.size()*2; i++)
  279. {
  280. if (1 == i % 2)
  281. {
  282. unsigned char nb = (unsigned char)message[i/2] & 0x0F;
  283. nb += (nb <= 9) ? '0' : 'a' - 10;
  284. messageCode += nb;
  285. }
  286. else
  287. {
  288. unsigned char nb = (unsigned char)message[i/2] >> 4;
  289. nb += (nb <= 9) ? '0' : 'a' - 10;
  290. messageCode += nb;
  291. }
  292. }
  293.  
  294. return messageCode;
  295. }
  296.  
  297. std::string Rsa::decoderMessage(std::string messageCode)
  298. {
  299. std::string messageDecode;
  300. for(unsigned int i = 0; i < messageCode.size() / 2; i++)
  301. {
  302. unsigned char n1 = messageCode[i*2];
  303. unsigned char n2 = messageCode[(i*2)+1];
  304.  
  305. if (n1 <= '9')
  306. {
  307. n1 -= '0';
  308. }
  309. else
  310. {
  311. n1 -= 'a';
  312. n1 += 10;
  313. }
  314.  
  315. if (n2 <= '9')
  316. {
  317. n2 -= '0';
  318. }
  319. else
  320. {
  321. n2 -= 'a';
  322. n2 += 10;
  323. }
  324.  
  325. messageDecode += (n1 << 4) + n2;
  326. }
  327.  
  328. return messageDecode;
  329. }
  330.  
  331. std::string Rsa::chiffrerAvecClePrivee(std::string message)
  332. {
  333. message = message.substr(0, this->tailleMaxChiffrable());
  334.  
  335. // Adaptation du message
  336. std::string messageCode = this->coderMessage(message);
  337.  
  338. mpz_t messageAChiffrer;
  339. mpz_init(messageAChiffrer);
  340. mpz_set_str(messageAChiffrer, messageCode.c_str(), 16);
  341.  
  342. // Chiffrage avec la cle privee
  343. mpz_t messageChiffre;
  344. mpz_init(messageChiffre);
  345. mpz_powm(messageChiffre, messageAChiffrer, *(mpz_t*)u,*(mpz_t*)n);
  346.  
  347. // Construction du message chiffre (base 16)
  348. unsigned int taille = mpz_sizeinbase(messageChiffre, 16);
  349. char* bufferChaine = (char*)malloc (taille + 1);
  350. mpz_get_str(bufferChaine, 16, messageChiffre);
  351. std::string chaineFinale = bufferChaine;
  352. free(bufferChaine);
  353.  
  354. return chaineFinale;
  355. }
  356.  
  357. std::string Rsa::dechiffrerAvecClePrivee(std::string messageChiffre)
  358. {
  359. mpz_t messageChiffreNombre;
  360. mpz_init(messageChiffreNombre);
  361. mpz_set_str(messageChiffreNombre, messageChiffre.c_str(), 16);
  362.  
  363. mpz_t messageDechiffre;
  364. mpz_init(messageDechiffre);
  365. mpz_powm(messageDechiffre, messageChiffreNombre, *(mpz_t*)u,*(mpz_t*)n);
  366.  
  367. // Construction du message dechiffre (base 16)
  368. unsigned int taille = mpz_sizeinbase(messageDechiffre, 16);
  369. char* bufferChaine = (char*)malloc (taille + 1);
  370. mpz_get_str(bufferChaine, 16, messageDechiffre);
  371. std::string chaineFinale = bufferChaine;
  372. free(bufferChaine);
  373.  
  374. return this->decoderMessage(chaineFinale);
  375. }
  376.  
  377. std::string Rsa::chiffrerAvecClePublique(std::string message)
  378. {
  379. message = message.substr(0, this->tailleMaxChiffrable());
  380.  
  381. // Adaptation du message
  382. std::string messageCode = this->coderMessage(message);
  383.  
  384. mpz_t messageAChiffrer;
  385. mpz_init(messageAChiffrer);
  386. mpz_set_str(messageAChiffrer, messageCode.c_str(), 16);
  387.  
  388. // Chiffrage avec la cle privee
  389. mpz_t messageChiffre;
  390. mpz_init(messageChiffre);
  391. mpz_powm(messageChiffre, messageAChiffrer, *(mpz_t*)c,*(mpz_t*)n);
  392.  
  393. // Construction du message chiffre (base 16)
  394. unsigned int taille = mpz_sizeinbase(messageChiffre, 16);
  395. char* bufferChaine = (char*)malloc (taille + 1);
  396. mpz_get_str(bufferChaine, 16, messageChiffre);
  397. std::string chaineFinale = bufferChaine;
  398. free(bufferChaine);
  399.  
  400. return chaineFinale;
  401. }
  402.  
  403. std::string Rsa::dechiffrerAvecClePublique(std::string messageChiffre)
  404. {
  405. mpz_t messageChiffreNombre;
  406. mpz_init(messageChiffreNombre);
  407. mpz_set_str(messageChiffreNombre, messageChiffre.c_str(), 16);
  408.  
  409. mpz_t messageDechiffre;
  410. mpz_init(messageDechiffre);
  411. mpz_powm(messageDechiffre, messageChiffreNombre, *(mpz_t*)c,*(mpz_t*)n);
  412.  
  413. // Construction du message dechiffre (base 16)
  414. unsigned int taille = mpz_sizeinbase(messageDechiffre, 16);
  415. char* bufferChaine = (char*)malloc (taille + 1);
  416. mpz_get_str(bufferChaine, 16, messageDechiffre);
  417. std::string chaineFinale = bufferChaine;
  418. free(bufferChaine);
  419.  
  420. return this->decoderMessage(chaineFinale);
  421. }
  422.  
  423. unsigned int Rsa::tailleMaxChiffrable()
  424. {
  425. return mpz_sizeinbase(*(mpz_t*)n, 2) / 8;
  426. }
  427.  
  428.  
  429. // rsa.h
  430. #ifndef RSA_H_INCLUDED
  431. #define RSA_H_INCLUDED
  432.  
  433. #include <string>
  434.  
  435. class Rsa
  436. {
  437. public:
  438. Rsa();
  439. ~Rsa();
  440. void genererCles(unsigned int tailleCle);
  441. std::string clePrivee();
  442. void clePrivee(std::string cle);
  443. std::string clePublique();
  444. void clePublique(std::string cle);
  445. std::string chiffrerAvecClePrivee(std::string message);
  446. std::string dechiffrerAvecClePrivee(std::string message);
  447. std::string chiffrerAvecClePublique(std::string message);
  448. std::string dechiffrerAvecClePublique(std::string message);
  449. unsigned int tailleMaxChiffrable();
  450.  
  451. private:
  452. /*mpz_t c, n, u;
  453. gmp_randstate_t state;*/
  454. void* c;
  455. void* n;
  456. void* u;
  457. void* state;
  458.  
  459. //void euclideEtendu (mpz_t c, mpz_t m, mpz_t* u, mpz_t* v);
  460. std::string coderMessage(std::string message);
  461. std::string decoderMessage(std::string message);
  462. };
  463.  
  464. #endif // RSA_H_INCLUDED
  465.  
  466.  
  467. // mine.cpp my app
  468.  
  469. #include <iostream>
  470. #include <rsa.h>
  471.  
  472. using namespace std;
  473.  
  474. int main()
  475. {
  476. Rsa rsa;
  477.  
  478. // Generation d'une paire de cles
  479. rsa.genererCles(1024);
  480.  
  481. // Recuperation de chacune des cles
  482. string clePrivee = rsa.clePrivee();
  483. string clePublique = rsa.clePublique();
  484.  
  485. // Creation du message secret
  486. string messageSecret = "Je t'aime Alice";
  487.  
  488. // Cryptage du message
  489. string messageCrypte;
  490. messageCrypte = rsa.chiffrerAvecClePublique(messageSecret);
  491.  
  492. // Affichage du message crypte
  493. cout << "Message crypte : " << endl;
  494. cout << messageCrypte << ;
  495. // Decryptage du message
  496. string messageDecrypte;
  497. messageDecrypte = rsa.dechiffrerAvecClePrivee(messageCrypte);
  498.  
  499. // Affichage du message decrypte
  500. cout << "Message decrypte : " << endl;
  501. cout << messageDecrypte << endl;
  502. return 0;
  503. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement