Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.37 KB | None | 0 0
  1. #include <cstdio>
  2. #include <fstream>
  3. #include <string>
  4. #include <iostream>
  5. #include <cmath>
  6.  
  7. using namespace std;
  8.  
  9. struct KluczeRSA
  10. {
  11.     // (e,n) - klucz publiczny
  12.     // (d,n) - klucz prywatny
  13.     int e;
  14.     int n;
  15.     int d;
  16. };
  17.  
  18. string szyfruj(string, KluczeRSA);
  19. string deszyfruj(string, KluczeRSA);
  20. string toUpper(string);
  21. string autoHaslo(string);
  22.  
  23. bool czyPierwsza(int);
  24. int euler(int, int);
  25. int znajdzWzgledniePierwsza(int &);
  26. KluczeRSA generujKlucze(int&, int&);
  27.  
  28. const char ASCII[36] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
  29. 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
  30.  
  31. int main()
  32. {
  33.     int p, q;   // p,q - liczby pierwsze wczytane od uzytkownika; n = p*q
  34.     string str, inData, wynikSzyfr, wynikOdszyfr;
  35.  
  36.     ifstream inFile;
  37.     ifstream inPass;
  38.     ofstream outFile;
  39.  
  40.     const string path = "in.txt";
  41.     const string passPath = "pass.txt";
  42.     const string outFilePath = "out.txt";
  43.  
  44.     inFile.open(path, ios::in);
  45.     inPass.open(passPath, ios::in);
  46.     outFile.open(outFilePath, ios::out);
  47.  
  48.     cout << "Dane wczytywane sa z pliku: \"" << path << "\"" << endl;
  49.  
  50.     while (getline(inFile, str))
  51.     {
  52.         inData += str;
  53.     }
  54.     cout << "Wczytano: " << inData << endl;
  55.     cout << "---" << endl;
  56.  
  57.  
  58.     cout << "Podaj liczbe pierwsza: ";
  59.     cin >> p;
  60.     cout << endl;
  61.     if (!czyPierwsza(p))
  62.     {
  63.         cout << "Liczba " << p << " nie jest pierwsza. Program konczy prace." << endl;
  64.  
  65.         system("pause");
  66.  
  67.         inFile.close();
  68.         inPass.close();
  69.         outFile.close();
  70.         return 1;
  71.     }
  72.  
  73.     cout << "podaj kolejna liczbe pierwsza: ";
  74.     cin >> q;
  75.     cout << endl;
  76.     if (!czyPierwsza(q))
  77.     {
  78.         cout << "Liczba " << q << " nie jest pierwsza. Program konczy prace." << endl;
  79.  
  80.         system("pause");
  81.  
  82.         inFile.close();
  83.         inPass.close();
  84.         outFile.close();
  85.         return 1;
  86.     }
  87.  
  88.     cout << "Wczytano liczby: " << p << ", " << q << ". Na ich podstawie wygenerowane zostana klucze prywatny i publiczny." << endl << endl;
  89.  
  90.  
  91.     KluczeRSA keys = generujKlucze(p, q);
  92.  
  93.     cout << "---" << endl;
  94.     cout << "Dane zapisywane sa do pliku: \"" << outFilePath << "\" w formacie: \nZaszyfrowana wiadomosc\nOdszyfrowana wiadomosc" << endl;
  95.     cout << "---" << endl;
  96.  
  97.     outFile << "Zaszyfrowane dane:" << endl;
  98.     wynikSzyfr = szyfruj(inData, keys);
  99.     cout << wynikSzyfr << endl;
  100.     outFile << wynikSzyfr << endl;
  101.  
  102.     outFile << "Odszyfrowane dane:" << endl;
  103.     wynikOdszyfr = deszyfruj(wynikSzyfr, keys);
  104.     cout << wynikOdszyfr << endl;
  105.     outFile << wynikOdszyfr << endl;
  106.  
  107.  
  108.     system("pause");
  109.  
  110.     inFile.close();
  111.     inPass.close();
  112.     outFile.close();
  113.     return 0;
  114. }
  115.  
  116.  
  117. string szyfruj(string data, KluczeRSA keys)
  118. {
  119.     int znak, k;
  120.     string out = data;
  121.  
  122.     cout << "Szyfrowanie" << endl;
  123.  
  124.     //cout << "Znak\t(int)Znak\tout" << endl;
  125.     for (unsigned int i = 0; i < data.length(); ++i)
  126.     {
  127.         //cout << data[i] << "\t";
  128.         znak = (int)data[i];
  129.         //cout << znak << "\t";
  130.         /*k = 1;
  131.         for (unsigned int j = 0; j < keys.e; j++)
  132.         {
  133.             k = k*znak%keys.n;
  134.             k = k%keys.n;
  135.         }*/
  136.         znak = (int)(pow(znak, keys.e)) % keys.n;
  137.         //temp[i] = k;
  138.         out[i] = (char)znak;
  139.         //cout << out[i] << "\t" << endl;
  140.     }
  141.     return out;
  142. }
  143.  
  144. string deszyfruj(string data, KluczeRSA keys)
  145. {
  146.     int znak, k;
  147.     string out = data;
  148.  
  149.     cout << "Deszyfrowanie" << endl;
  150.  
  151.     for (unsigned int i = 0; i < data.length(); ++i)
  152.     {
  153.         //cout << data[i] << "\t";
  154.         znak = (int)data[i];
  155.         //cout << znak << "\t";
  156.         /*k = 1;
  157.         for (unsigned int j = 0; j < keys.d; j++)
  158.         {
  159.             k = k*znak%keys.n;
  160.             k = k%keys.d;
  161.         }*/
  162.         znak = (int)(pow(znak, keys.d)) % keys.n;
  163.         out[i] = (char)znak;
  164.         //cout << out[i] << "\t" << endl;
  165.     }
  166.     return out;
  167. }
  168.  
  169. bool czyPierwsza(int num)
  170. {
  171.     if (num <= 1)
  172.         return false;
  173.     else if (num == 2)
  174.         return true;
  175.     else if (num % 2 == 0)
  176.         return false;
  177.     else
  178.     {
  179.         bool prime = true;
  180.         int divisor = 3;
  181.         double num_d = static_cast<double>(num);
  182.         int upperLimit = static_cast<int>(sqrt(num_d) + 1);
  183.  
  184.         while (divisor <= upperLimit)
  185.         {
  186.             if (num % divisor == 0)
  187.                 prime = false;
  188.             divisor += 2;
  189.         }
  190.         return prime;
  191.     }
  192. }
  193.  
  194. int nwd(int a, int b)
  195. {
  196.     int t;
  197.  
  198.     while (b != 0)
  199.     {
  200.         t = b;
  201.         b = a % b;
  202.         a = t;
  203.     };
  204.     return a;
  205. }
  206.  
  207. int znajdzWzgledniePierwsza(int &eu)
  208. {
  209.     int e = 3;
  210.  
  211.     for (; nwd(e, eu) != 1; e += 2);
  212.  
  213.     return e;
  214. }
  215.  
  216. int odwrMod(int e, int eu)
  217. {
  218.     int a0, n0, p0, p1, q, r, t;
  219.  
  220.     p0 = 0; p1 = 1; a0 = e; n0 = eu;
  221.     q = n0 / a0;
  222.     r = n0 % a0;
  223.     while (r > 0)
  224.     {
  225.         t = p0 - q * p1;
  226.         if (t >= 0)
  227.             t = t % eu;
  228.         else
  229.             t = eu - ((-t) % eu);
  230.         p0 = p1; p1 = t;
  231.         n0 = a0; a0 = r;
  232.         q = n0 / a0;
  233.         r = n0 % a0;
  234.     };
  235.  
  236.     return p1;
  237. }
  238.  
  239. KluczeRSA generujKlucze(int& p, int& q)
  240. {
  241.     KluczeRSA keys;
  242.  
  243.     keys.n = p*q;
  244.     // eu - wartosc funkcji eulera dla n
  245.     int eu = (p - 1)*(q - 1);
  246.     // e - liczba wzglednie pierwsza do eu
  247.     keys.e = znajdzWzgledniePierwsza(eu);
  248.     // d - odwrotnosc modulu
  249.     keys.d = odwrMod(keys.e, eu);
  250.     // tutaj przerwano
  251.  
  252.     //----------------------------------------
  253.     // Klucz publiczny to para liczb (e, n), |
  254.     // prywatny - (d, n)                         |
  255.     //----------------------------------------
  256.  
  257.     cout << "KLUCZ PUBLICZNY:" << endl
  258.         << "wykladnik e = " << keys.e << endl
  259.         << "    modul n = " << keys.n << endl
  260.         << endl
  261.         << "KLUCZ PRYWATNY:" << endl
  262.         << "wykladnik d = " << keys.d << endl
  263.         << "    modul n = " << keys.n << endl
  264.         << "Aby kontynuowac nacisnij dowolny klawisz." << endl << endl;
  265.     cin.get();
  266.  
  267.     return keys;
  268. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement