jukaukor

Factoring_GMP_int.cpp

Aug 19th, 2019
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <cmath>
  4. #include <gmp.h>
  5. #include <stdlib.h>
  6.  
  7. using namespace std;
  8.  
  9. // n julkinen avain, p ja q sen laskettavat tekijät
  10. // n, p ja q ovat arbitrary precision integers (GMP:n mpz_t)
  11. // mahdollistaa yli 64-bittisten kokonaislukujen käytön
  12. // Factoring_GMP_int.cpp
  13. // Juhani Kaukoranta 19.8.2019
  14.  
  15. int main()
  16. {
  17. mpz_t n,p,q,pqtulo,r,nolla;
  18. mpz_init(n);
  19. mpz_init(p);
  20. mpz_init(q);
  21. mpz_init(pqtulo);
  22. mpz_init(r);
  23. mpz_init(nolla);
  24. clock_t t0, t1; // Time alku,loppu
  25. cout << "Anna murrettava julkinen RSA-avain n,joka on kahden alkuluvun tulo," << endl;
  26. cin >> n;
  27. cout << "Annoit avaimen " << n << endl;
  28. t0 = clock(); // Timer alku
  29.  
  30. mpz_t maks;
  31. mpz_init(maks);
  32. mpz_sqrt(maks,n); // maks = floor(sqrt(n))
  33. mpz_add_ui(maks,maks,1); // maks = maks + 1
  34. mpz_t i;
  35. mpz_init(i);
  36. unsigned int found = 0;
  37. int cmp = 0;
  38. mpz_set_ui(i,3);
  39. while(1)
  40. {
  41. mpz_mod(r,n,i); // r jakojäännös,jakaja i
  42. cmp = mpz_cmp(r,nolla); // cmp = 0 jos jakaja löytynyt
  43. if (cmp == 0)
  44. {
  45. mpz_set(p,i); // eka tulontekijä p = i
  46. mpz_divexact(q,n,i); // q = n / i
  47. found = 1; // tulontekijät p,q löydetty
  48. break; // pois while-loopista
  49. }
  50.  
  51. cmp = mpz_cmp(i,maks);
  52. if (cmp <= 0)
  53. {
  54. mpz_add_ui(i,i,2); // i = i+2 seuraava pariton ehdokas
  55. }
  56. else
  57. {
  58. found = 0; // avain n ei ole jaollinen
  59. break; // n on alkuluku, poistutaan
  60. }
  61.  
  62. }
  63.  
  64. t1 = clock(); // timer loppu
  65. if (found == 1)
  66. {
  67. cout << "tekijät p = " << p << " q = " << q << endl;
  68. cout << "( Laskenta-aika oli: " << (double)(t1 - t0) / CLOCKS_PER_SEC << " sekuntia )" << endl;
  69. mpz_mul(pqtulo,p,q);
  70. cout << "tekijöiden tulo = " << pqtulo << endl;
  71. } else
  72. {
  73. cout << "Annettu avain oli alkuluku - ei voi olla RSA-avain" << endl;
  74. }
  75.  
  76. }
Advertisement
Add Comment
Please, Sign In to add comment