Advertisement
jukaukor

Factoring_PollardRho_GMP_int.cpp

Aug 19th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.10 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. // Pollard Rho-algoritmi laskee avaimen n ekatekijän p
  13. // jonka jälkeen jakolasku antaa tokatekijän q
  14. // PollardRho algorithm - Wikipedia style
  15. // Juhani Kaukoranta 21.8.2019
  16.  
  17. mpz_t p,q,n,pqtulo;
  18.  
  19.  
  20. clock_t t0, t1; // timer alku, loppu
  21.  
  22. void f(mpz_t x)
  23. {
  24. mpz_mul(x,x,x); // x = x**2
  25. mpz_add_ui(x,x,1); // x**2 + 1
  26. mpz_mod(x,x,n); // x = (x**2 + 1) mod n
  27. }
  28.  
  29. void PollardRho(mpz_t n)
  30. {
  31. mpz_t x, y, res ;
  32. mpz_init(x);
  33. mpz_init(y);
  34. mpz_init(res);
  35. mpz_set_ui(x,2); // x = 2
  36. mpz_set_ui(y,2); // y = 2
  37. mpz_set_ui(p,1); // p = 1
  38.  
  39.  
  40.  
  41. int cmp = 0;
  42. cmp = mpz_cmp_ui(p,1); // cmp = 0 jos p = 1
  43. while(cmp == 0)
  44. {
  45. f(x); // x = f(x)
  46. f(y); // y = f(y)
  47. f(y); // y = f(f(y))
  48. mpz_sub(res,x,y); // res = x - y
  49. mpz_gcd(p,res,n); // p = gcd(x-y,n)
  50. cmp = mpz_cmp_ui(p,1); // cmp = 0 jos p = 1
  51. }
  52. if (p == n) {
  53. cout << "Ei tekijöitä, avain ilmeisesti alkuluku" << endl;
  54. } else {
  55. mpz_divexact(q,n,p); // q = n // p
  56. }
  57. }
  58.  
  59. int main()
  60. {
  61. mpz_init (p);
  62. mpz_init (q);
  63. mpz_init (pqtulo);
  64. mpz_init (n);
  65.  
  66. cout << "Anna julkinen RSA-avain n, joka on kahden alkuluvun tulo: " << endl;
  67. cin >> n;
  68. switch (mpz_probab_prime_p(n,25)) {
  69. case 2:
  70. cout << "n varmasti alkuluku - Bad and Ugly!" << endl;
  71. break;
  72. case 1:
  73. cout << "n luultavasti alkuluku - Bad and Ugly!" << endl;
  74. break;
  75. case 0:
  76. cout << "n varmasti ei alkuluku - Good!" << endl;
  77. }
  78. t0 = clock(); // timer alku
  79. PollardRho(n);
  80. t1 = clock(); // timer loppu
  81. cout << "( Laskenta-aika oli: " << (double)(t1 - t0) / CLOCKS_PER_SEC << " sekuntia )" << endl;
  82. cout << "Alkulukutekijä p = " << p << endl;
  83. cout << "Alkulukutekijä q = " << q << endl;
  84. mpz_mul(pqtulo,p,q);
  85. cout << "Tekijöiden tulo = " << pqtulo << endl;
  86. return(0);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement