Advertisement
Guest User

Untitled

a guest
Dec 4th, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.35 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, string);
  19. string deszyfruj(string, string);
  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 pos;
  34.     int p, q, n;    // p,q - liczby pierwsze wczytane od uzytkownika; n = p*q
  35.     string str, inData, upperData, wynik, haslo, upperHaslo;
  36.  
  37.     ifstream inFile;
  38.     ifstream inPass;
  39.     ofstream outFile;
  40.  
  41.     const string path = "in.txt";
  42.     const string passPath = "pass.txt";
  43.     const string outFilePath = "out.txt";
  44.  
  45.     inFile.open(path, ios::in);
  46.     inPass.open(passPath, ios::in);
  47.     outFile.open(outFilePath, ios::out);
  48.  
  49.     cout << "Dane wczytywane sa z pliku: \"" << path << "\"" << endl;
  50.  
  51.     while (getline(inFile, str))
  52.     {
  53.         inData += str;
  54.     }
  55.     cout << "Wczytano: " << inData << endl;
  56.     cout << "---" << endl;
  57.  
  58.  
  59.     cout << "Podaj liczbe pierwsza: ";
  60.     cin >> p;
  61.     cout << endl;
  62.     if (!czyPierwsza(p))
  63.     {
  64.         cout << "Liczba " << p << " nie jest pierwsza. Program konczy prace." << endl;
  65.  
  66.         system("pause");
  67.  
  68.         inFile.close();
  69.         inPass.close();
  70.         outFile.close();
  71.         return 1;
  72.     }
  73.  
  74.     cout << "podaj kolejna liczbe pierwsza: ";
  75.     cin >> q;
  76.     cout << endl;
  77.     if (!czyPierwsza(q))
  78.     {
  79.         cout << "Liczba " << q << " nie jest pierwsza. Program konczy prace." << endl;
  80.  
  81.         system("pause");
  82.  
  83.         inFile.close();
  84.         inPass.close();
  85.         outFile.close();
  86.         return 1;
  87.     }
  88.  
  89.     cout << "Wczytano liczby: " << p << ", " << q << ". Na ich podstawie wygenerowane zostana klucze prywatny i publiczny." << endl << endl;
  90.  
  91.  
  92.     //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  93.     //DOPISAC - TUTAJ PRZERWANO
  94.     // e - liczba wzglednie pierwsza z eu, 1 < e < eu
  95.     //int e =
  96.     KluczeRSA keys = generujKlucze(p, q);
  97.  
  98.     /*cout << "---" << endl;
  99.     cout << "Dane zapisywane sa do pliku: \"" << outFilePath << "\" w formacie: \nHaslo\nZaszyfrowana wiadomosc\nOdszyfrowana wiadomosc" << endl;
  100.     cout << "---" << endl;*/
  101.  
  102.  
  103.     /*wynik = szyfruj(upperData, upperHaslo);
  104.     cout << wynik << endl;
  105.     outFile << wynik << endl;*/
  106.  
  107.     //wynik = deszyfruj(wynik, upperHaslo);
  108.     //cout << wynik << endl;
  109.     //outFile << wynik << endl;
  110.  
  111.  
  112.     system("pause");
  113.  
  114.     inFile.close();
  115.     inPass.close();
  116.     outFile.close();
  117.     return 0;
  118. }
  119.  
  120. // Te 4 zostaly z poprzedniej wersji
  121. string toUpper(string data)
  122. {
  123.     int znak;
  124.     string out = data;
  125.  
  126.     for (unsigned int i = 0; i < data.length(); ++i)
  127.     {
  128.         znak = (int)data[i];
  129.  
  130.         if ((znak >= 97) && (znak <= 122))
  131.         {
  132.             znak -= 32;
  133.             out[i] = (char)znak;
  134.         }
  135.     }
  136.  
  137.     return out;
  138. }
  139.  
  140. string szyfruj(string data, string haslo)
  141. {
  142.     int znak;
  143.     int pos;
  144.     string out = data;
  145.     cout << "Szyfrowanie" << endl;
  146.  
  147.     for (unsigned int i = 0; i < data.length(); ++i)
  148.     {
  149.         znak = (int)data[i];
  150.         pos = (int)haslo[i];
  151.  
  152.  
  153.         if ((pos <= 90) && (pos >= 65))
  154.         {
  155.             pos = pos - 65;
  156.         }
  157.         else if ((pos <= 57) && (pos >= 48))
  158.         {
  159.             pos = pos - 48 + 26;
  160.         }
  161.  
  162.         if ((znak <= 90) && (znak >= 65))
  163.         {
  164.             znak = znak - 65;
  165.         }
  166.         else if ((znak <= 57) && (znak >= 48))
  167.         {
  168.             znak = znak - 48 + 26;
  169.         }
  170.         else continue;
  171.  
  172.         znak += pos;
  173.         znak = znak % 36;   // 36 - szerokosc tablicy ze znakami
  174.         out[i] = ASCII[znak];
  175.     }
  176.     return out;
  177. }
  178.  
  179. string deszyfruj(string data, string haslo)
  180. {
  181.     int znak;
  182.     int pos;
  183.     string out = data;
  184.     cout << "Deszyfrowanie" << endl;
  185.  
  186.     for (unsigned int i = 0; i < data.length(); ++i)
  187.     {
  188.         znak = (int)data[i];
  189.         pos = (int)haslo[i];
  190.  
  191.         if ((pos <= 90) && (pos >= 65))
  192.         {
  193.             pos = pos - 65;
  194.         }
  195.         else if ((pos <= 57) && (pos >= 48))
  196.         {
  197.             pos = pos - 48 + 26;
  198.         }
  199.  
  200.         if ((znak <= 90) && (znak >= 65))
  201.         {
  202.             znak = znak - 65;
  203.         }
  204.         else if ((znak <= 57) && (znak >= 48))
  205.         {
  206.             znak = znak - 48 + 26;
  207.         }
  208.         else continue;
  209.  
  210.         znak -= pos;
  211.  
  212.         while (znak < 0)
  213.         {
  214.             znak += 36;
  215.         }
  216.         znak = znak % 36;   // 36 - szerokosc tablicy ze znakami
  217.         out[i] = ASCII[znak];
  218.  
  219.     }
  220.     return out;
  221. }
  222.  
  223. string autoHaslo(string data)
  224. {
  225.     char pierwszyZnak;
  226.     cout << "Podaj pierwsza literke: ";
  227.     cin >> pierwszyZnak;
  228.  
  229.     int znak;
  230.     string out = data;
  231.  
  232.     out[0] = pierwszyZnak;
  233.     for (unsigned int i = 0; i < data.length(); ++i)
  234.     {
  235.         out[i + 1] = data[i];
  236.     }
  237.     return out;
  238. }
  239. // /\ Koniec z poprzedniej wersji
  240.  
  241.  
  242. bool czyPierwsza(int num)
  243. {
  244.     if (num <= 1)
  245.         return false;
  246.     else if (num == 2)
  247.         return true;
  248.     else if (num % 2 == 0)
  249.         return false;
  250.     else
  251.     {
  252.         bool prime = true;
  253.         int divisor = 3;
  254.         double num_d = static_cast<double>(num);
  255.         int upperLimit = static_cast<int>(sqrt(num_d) + 1);
  256.  
  257.         while (divisor <= upperLimit)
  258.         {
  259.             if (num % divisor == 0)
  260.                 prime = false;
  261.             divisor += 2;
  262.         }
  263.         return prime;
  264.     }
  265. }
  266.  
  267. int nwd(int a, int b)
  268. {
  269.     int t;
  270.  
  271.     while (b != 0)
  272.     {
  273.         t = b;
  274.         b = a % b;
  275.         a = t;
  276.     };
  277.     return a;
  278. }
  279.  
  280. int znajdzWzgledniePierwsza(int eu)
  281. {
  282.     int e = 3;
  283.  
  284.     for (; nwd(e, eu) != 1; e += 2);
  285.  
  286.     return e;
  287. }
  288.  
  289. int odwrMod(int e, int eu)
  290. {
  291.     int a0, n0, p0, p1, q, r, t;
  292.  
  293.     p0 = 0; p1 = 1; a0 = e; n0 = eu;
  294.     q = n0 / a0;
  295.     r = n0 % a0;
  296.     while (r > 0)
  297.     {
  298.         t = p0 - q * p1;
  299.         if (t >= 0)
  300.             t = t % eu;
  301.         else
  302.             t = eu - ((-t) % eu);
  303.         p0 = p1; p1 = t;
  304.         n0 = a0; a0 = r;
  305.         q = n0 / a0;
  306.         r = n0 % a0;
  307.     };
  308.  
  309.     return p1;
  310. }
  311.  
  312. KluczeRSA generujKlucze(int& p, int& q)
  313. {
  314.     KluczeRSA keys;
  315.  
  316.     keys.n = p*q;
  317.     // eu - wartosc funkcji eulera dla n
  318.     int eu = (p - 1)*(q - 1);
  319.     // e - liczba wzglednie pierwsza do eu
  320.     keys.e = znajdzWzgledniePierwsza(eu);
  321.     // d - odwrotnosc modulu
  322.     keys.d = odwrMod(keys.e, eu);
  323.     // tutaj przerwano
  324.  
  325.     //----------------------------------------
  326.     // Klucz publiczny to para liczb (e, n), |
  327.     // prywatny - (d, n)                         |
  328.     //----------------------------------------
  329.  
  330.     cout << "KLUCZ PUBLICZNY:" << endl
  331.         << "wykladnik eu = " << eu << endl
  332.         << "    modul n = " << keys.n << endl
  333.         << endl
  334.         << "KLUCZ PRYWATNY:" << endl
  335.         << "wykladnik d = " << keys.d << endl
  336.         << "    modul n = " << keys.n << endl
  337.         << "Aby kontynuowac nacisnij dowolny klawisz." << endl << endl;
  338.     cin.get();
  339.  
  340.     return keys;
  341. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement