Advertisement
zhora_15

RSA

Jun 1st, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.63 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <time.h>
  6. using namespace std;
  7.  
  8. void output_vector(vector <int> phrase)
  9. {
  10.     for (int i = 0; i < phrase.size(); ++i)
  11.     {
  12.         cout << phrase[i] << ' ';
  13.     }
  14. }
  15. void input_vector(vector <int>& phrase)
  16. {
  17.     int number;
  18.     while (cin >> number)
  19.     {
  20.         phrase.push_back(number);
  21.     }
  22.  
  23. }
  24. void str_to_vector (string phr, vector <int>& phrase)
  25. {
  26.     for(int i = 0; i < phr.size(); ++i)
  27.     {
  28.         phrase.push_back(phr[i]);
  29.     }
  30. }
  31. void vector_to_str(string& phr, vector <int> phrase)
  32. {
  33.     for(int i = 0; i < phrase.size(); ++i)
  34.     {
  35.         phr += (char)(phrase.size());
  36.     }
  37. }
  38. int gcd2 (int a, int b)
  39. {
  40.     while (b)
  41.     {
  42.         a%=b;
  43.         swap (a,b);
  44.     }
  45.     return a;
  46. }
  47.  
  48. int calculating__d ( int e, int fi)
  49. {
  50.     int d, k;
  51.     k = 1;
  52.     while ((((k*fi)+1) % e) != 0)
  53.     {
  54.         ++k;
  55.     }
  56.     //bool state = find_any_solution(e,fi,1,)
  57.     d = (((k*fi)+1) / e);
  58.     return d;
  59.  
  60. }
  61.  
  62. void prime_number (vector<int>& prime_numbers)
  63. {
  64.     int a = 0;
  65.     vector <bool> numbers(90000,1); // all numbers, true means false, false prime
  66.     for (int i = 2; i < 1000; ++i)
  67.     {
  68.         int p = 0;
  69.         for (int j = 2; j < i; ++j)
  70.         {
  71.             if ((i % j) == 0)
  72.             {
  73.                 ++p;
  74.                 break;
  75.             }
  76.         }
  77.         if (p == 0)
  78.         {
  79.             prime_numbers.push_back(i);
  80.             //prime_numbers[a] = i;
  81.             ++a;
  82.         }
  83.     }
  84.     /*for (int i = 0; i <= a; ++ i)
  85.     {
  86.         int k = 2;
  87.         while ((prime_numbers[i] * k) < 90000) //resheto erotosphena
  88.         {
  89.             numbers[prime_numbers[i]*k] = 0;
  90.             ++k;
  91.         }
  92.     }
  93.     for (int i = 0; i < 90000; ++i) //addding prime numbers to vector prime_numbers
  94.     {
  95.         if (numbers[i] == 0)
  96.         {
  97.             prime_numbers.push_back(i);
  98.         }
  99.  
  100.     }*/
  101.  
  102.  
  103. }
  104. int f(int p, int q)
  105. {
  106.     return (p - 1)*(q - 1);
  107. }
  108.  
  109. int pow1 (int r, int p, int n)
  110. {
  111.     int r1;
  112.     r1 = r;
  113.     for (int i = 1; i < p; ++i)
  114.     {
  115.         r = r * r1;
  116.         r = r % n;
  117.  
  118.     }
  119.     return (r%n);
  120. }
  121.  
  122. int e_find(int fi)
  123. {
  124.     int l;
  125.     int a;
  126.     l = (rand() % fi);
  127.     a = l;
  128.     while (gcd2(l,fi) != 1)
  129.     {
  130.         l = (rand() % fi);
  131.         a = l;
  132.     }
  133.     return a;
  134.  
  135. }
  136. void code(vector <int> &m, int n, int e) {
  137.     for (int i = 0; i < m.size(); ++i)
  138.     {
  139.         m[i] = pow1(m[i], e, n);
  140.     }
  141. }
  142. void decode(vector <int> &m, int d, int n)
  143. {
  144.     for (int i = 0; i < m.size(); ++i)
  145.     {
  146.         m[i] = pow1(m[i], d, n);
  147.     }
  148. }
  149. int main() {
  150.     srand(time (0));
  151.     /*vector <int> prime_numbers(0);
  152.     prime_number(prime_numbers);
  153.     for (int i = 0; i < prime_numbers.size (); ++i)
  154.     {
  155.         cout << prime_numbers[i] << endl;
  156.     }*/
  157.     int d, e, p, q, fi;
  158.     unsigned long n;
  159.     char choise;
  160.     string phr;
  161.     vector <int> phrase (0,0);
  162.     /*vector <int> prime_numbers(0);
  163.     prime_number(prime_numbers);
  164.     p = prime_numbers[rand ()%prime_numbers.size ()];
  165.     q = prime_numbers[rand ()%prime_numbers.size ()];
  166.     while ((p!= 2) && (q!= 2))
  167.     {
  168.         p = prime_numbers[rand ()%prime_numbers.size ()];
  169.         q = prime_numbers[rand ()%prime_numbers.size ()];
  170.     }
  171.     n = p * q;
  172.     fi = f(p, q);
  173.     e = e_find (fi);
  174.     calculating__d(e, fi);*/
  175.     cout << "Do you want to send a letter? (Y/N)" << endl;
  176.     cin >> choise;
  177.     if (choise == 'Y')
  178.     {
  179.         cout << "Input your phrase:" << endl;
  180.         cin >> phr;
  181.         str_to_vector (phr, phrase);
  182.         cout << "Input your multiply and open key" << endl;
  183.         cin >> n;
  184.         cin >> e;
  185.         code (phrase, n, e);
  186.         output_vector(phrase);
  187.     }
  188.     if (choise == 'N')
  189.     {
  190.         vector <int> prime_numbers(0);
  191.         prime_number(prime_numbers);
  192.         p = prime_numbers[rand ()%prime_numbers.size ()];
  193.         q = prime_numbers[rand ()%prime_numbers.size ()];
  194.         while ((p== 2) && (q== 2))
  195.         {
  196.             p = prime_numbers[rand ()%prime_numbers.size ()];
  197.             q = prime_numbers[rand ()%prime_numbers.size ()];
  198.         }
  199.         n = p * q;
  200.         fi = f(p, q);
  201.         e = e_find (fi);
  202.         while (e > n)
  203.         {
  204.             e = e_find (fi);
  205.         }
  206.         calculating__d(e, fi);
  207.         cout << "Multiply is " << n << endl;
  208.         cout << "Open key is " << e << endl;
  209.         cout << "Input coded phrase: " << endl;
  210.         input_vector(phrase);
  211.         decode(phrase, d, n);
  212.         cout << "Decoded phrase is: ";
  213.         output_vector(phrase);
  214.     }
  215.     return 0;
  216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement