Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- #include <algorithm>
- #include <time.h>
- using namespace std;
- void output_vector(vector <int> phrase)
- {
- for (int i = 0; i < phrase.size(); ++i)
- {
- cout << phrase[i] << ' ';
- }
- }
- void input_vector(vector <int>& phrase)
- {
- int number;
- while (cin >> number)
- {
- phrase.push_back(number);
- }
- }
- void str_to_vector (string phr, vector <int>& phrase)
- {
- for(int i = 0; i < phr.size(); ++i)
- {
- phrase.push_back(phr[i]);
- }
- }
- void vector_to_str(string& phr, vector <int> phrase)
- {
- for(int i = 0; i < phrase.size(); ++i)
- {
- phr += (char)(phrase.size());
- }
- }
- int gcd2 (int a, int b)
- {
- while (b)
- {
- a%=b;
- swap (a,b);
- }
- return a;
- }
- int calculating__d ( int e, int fi)
- {
- int d, k;
- k = 1;
- while ((((k*fi)+1) % e) != 0)
- {
- ++k;
- }
- //bool state = find_any_solution(e,fi,1,)
- d = (((k*fi)+1) / e);
- return d;
- }
- void prime_number (vector<int>& prime_numbers)
- {
- int a = 0;
- vector <bool> numbers(90000,1); // all numbers, true means false, false prime
- for (int i = 2; i < 1000; ++i)
- {
- int p = 0;
- for (int j = 2; j < i; ++j)
- {
- if ((i % j) == 0)
- {
- ++p;
- break;
- }
- }
- if (p == 0)
- {
- prime_numbers.push_back(i);
- //prime_numbers[a] = i;
- ++a;
- }
- }
- /*for (int i = 0; i <= a; ++ i)
- {
- int k = 2;
- while ((prime_numbers[i] * k) < 90000) //resheto erotosphena
- {
- numbers[prime_numbers[i]*k] = 0;
- ++k;
- }
- }
- for (int i = 0; i < 90000; ++i) //addding prime numbers to vector prime_numbers
- {
- if (numbers[i] == 0)
- {
- prime_numbers.push_back(i);
- }
- }*/
- }
- int f(int p, int q)
- {
- return (p - 1)*(q - 1);
- }
- int pow1 (int r, int p, int n)
- {
- int r1;
- r1 = r;
- for (int i = 1; i < p; ++i)
- {
- r = r * r1;
- r = r % n;
- }
- return (r%n);
- }
- int e_find(int fi)
- {
- int l;
- int a;
- l = (rand() % fi);
- a = l;
- while (gcd2(l,fi) != 1)
- {
- l = (rand() % fi);
- a = l;
- }
- return a;
- }
- void code(vector <int> &m, int n, int e) {
- for (int i = 0; i < m.size(); ++i)
- {
- m[i] = pow1(m[i], e, n);
- }
- }
- void decode(vector <int> &m, int d, int n)
- {
- for (int i = 0; i < m.size(); ++i)
- {
- m[i] = pow1(m[i], d, n);
- }
- }
- int main() {
- srand(time (0));
- /*vector <int> prime_numbers(0);
- prime_number(prime_numbers);
- for (int i = 0; i < prime_numbers.size (); ++i)
- {
- cout << prime_numbers[i] << endl;
- }*/
- int d, e, p, q, fi;
- unsigned long n;
- char choise;
- string phr;
- vector <int> phrase (0,0);
- /*vector <int> prime_numbers(0);
- prime_number(prime_numbers);
- p = prime_numbers[rand ()%prime_numbers.size ()];
- q = prime_numbers[rand ()%prime_numbers.size ()];
- while ((p!= 2) && (q!= 2))
- {
- p = prime_numbers[rand ()%prime_numbers.size ()];
- q = prime_numbers[rand ()%prime_numbers.size ()];
- }
- n = p * q;
- fi = f(p, q);
- e = e_find (fi);
- calculating__d(e, fi);*/
- cout << "Do you want to send a letter? (Y/N)" << endl;
- cin >> choise;
- if (choise == 'Y')
- {
- cout << "Input your phrase:" << endl;
- cin >> phr;
- str_to_vector (phr, phrase);
- cout << "Input your multiply and open key" << endl;
- cin >> n;
- cin >> e;
- code (phrase, n, e);
- output_vector(phrase);
- }
- if (choise == 'N')
- {
- vector <int> prime_numbers(0);
- prime_number(prime_numbers);
- p = prime_numbers[rand ()%prime_numbers.size ()];
- q = prime_numbers[rand ()%prime_numbers.size ()];
- while ((p== 2) && (q== 2))
- {
- p = prime_numbers[rand ()%prime_numbers.size ()];
- q = prime_numbers[rand ()%prime_numbers.size ()];
- }
- n = p * q;
- fi = f(p, q);
- e = e_find (fi);
- while (e > n)
- {
- e = e_find (fi);
- }
- calculating__d(e, fi);
- cout << "Multiply is " << n << endl;
- cout << "Open key is " << e << endl;
- cout << "Input coded phrase: " << endl;
- input_vector(phrase);
- decode(phrase, d, n);
- cout << "Decoded phrase is: ";
- output_vector(phrase);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement