Advertisement
Kajoj

JE

Dec 9th, 2016
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <time.h>
  4. #include <stdlib.h>
  5. #include <string>
  6.  
  7. using namespace std;
  8.  
  9. int wczytaj_i(string tekst)
  10. {
  11.     int a;
  12.     cout<<tekst;
  13.     cin>>a;
  14.     return a;
  15. }
  16.  
  17. string wczytaj_s(string tekst)
  18. {
  19.     string a;
  20.     cout<<tekst;
  21.     cin>>a;
  22.     return a;
  23. }
  24.  
  25. bool utworz_rotor(string sciezka_dostepu)
  26. {
  27.     srand(time(NULL));
  28.     int pozostale=0;
  29.     //Tworzy tablicę sprawdzającą czy dana liczba się powtórzyła (0 - brak wystąpienia, 1 - liczba jest już zapisana do pliku)
  30.     bool tablicawartosci[256];
  31.     for (int i=0; i<256; i++)
  32.       tablicawartosci[i]=false;
  33.     //Otwarcie pliku, jeśli się nie uda funkcja zwraca błąd
  34.     fstream plik;
  35.     plik.open (sciezka_dostepu.c_str(), ios::out);
  36.     if (!plik.good())
  37.       return false;
  38.     unsigned char litera;
  39.     //Losowanie liter bez powtórzeń, za każdym razem gdy litera się powtórzy to jest zwiększana o jeden dopóki nie trafi na literę która nie wystąpiła.
  40.     for (int i=0; i<256; i++)
  41.     {
  42.         litera = rand()%256;
  43.         while(tablicawartosci[litera])
  44.         {
  45.             if (litera<255)
  46.                 litera++;
  47.             else
  48.                 litera=0;
  49.         }
  50.         tablicawartosci[litera]=true;
  51.         plik<<(int)litera<<"\n";
  52.     }
  53.     plik.close();
  54.     return true;
  55. }
  56.  
  57. unsigned char rotor(unsigned char znak, int pozycja_rotora, unsigned char danerotora[])
  58. {
  59.     pozycja_rotora=znak+pozycja_rotora;
  60.     if (!(pozycja_rotora<256))
  61.         znak=pozycja_rotora-256;
  62.     else
  63.         znak=pozycja_rotora;
  64.     unsigned char tmp=danerotora[znak];
  65.     return tmp;
  66. }
  67.  
  68. unsigned char rotor_deszyfr(unsigned char znak, int pozycja_rotora, unsigned char danerotora[])
  69. {
  70.     int i;
  71.     for (i=0; i<256; i++)
  72.     {
  73.         if (danerotora[i]==znak)
  74.             break;
  75.     }
  76.     pozycja_rotora=i-pozycja_rotora;
  77.     if (!(pozycja_rotora>0))
  78.         i=pozycja_rotora-256;
  79.     else
  80.         i=pozycja_rotora;
  81.     unsigned char tmp=i;
  82.     return tmp;
  83. }
  84.  
  85. unsigned char lustro(unsigned char znak)
  86. {
  87.     return 255-(int)znak;
  88. }
  89.  
  90. int szyfrowanie_enigma(unsigned char rotor1[], unsigned char rotor2[], string nazwaplikuszyfr, string nazwaplikuwynik, bool szyfr)
  91. {
  92.     fstream plikszyfr;
  93.     plikszyfr.open(nazwaplikuszyfr.c_str(), ios::in);
  94.     if (!plikszyfr.good())
  95.         return 1;
  96.     fstream plikwynik;
  97.     plikwynik.open(nazwaplikuwynik.c_str(), ios::out);
  98.     if (!plikwynik.good())
  99.         return 2;
  100.  
  101.     unsigned char znak=0;
  102.     int i=0;
  103.     int j=0;
  104.     while (!plikszyfr.eof())
  105.     {
  106.         char test;
  107.         plikszyfr.get(test);
  108.         znak=test;
  109.         if (szyfr)
  110.         {
  111.             znak=rotor(znak, i, rotor1);
  112.             znak=rotor(znak, j, rotor2);
  113.         }
  114.         else
  115.         {
  116.             znak=rotor_deszyfr(znak, j, rotor2);
  117.             znak=rotor_deszyfr(znak, i, rotor1);
  118.         }
  119.         plikwynik<<znak;
  120.         if (i<256)
  121.             i++;
  122.         else
  123.         {
  124.             i=0;
  125.             j++;
  126.         }
  127.         if (!(j<256))
  128.             j=0;
  129.     }
  130.     plikszyfr.close();
  131.     plikwynik.close();
  132.     return 0;
  133. }
  134.  
  135.  //Sprawdzenie czy rotor istnieje, jeśli nie zostaje automatycznie wygenerowany z podaną nazwą. Jeśli funkcja zwróci fałsz oznacz że wystąpił błąd podczas tworzenia rotora.
  136. bool rotor_exists(string sciezka_dostepu)
  137. {
  138.     fstream plik;
  139.     plik.open(sciezka_dostepu.c_str(), ios::in);
  140.     if (!plik.good())
  141.     {
  142.         plik.close();
  143.         cout<<"Brak rotora o nazwie "<<sciezka_dostepu<<". Rotor ten zostanie utworzony!"<<endl;
  144.         if (utworz_rotor(sciezka_dostepu))
  145.         {
  146.             cout<<"Rotor "<<sciezka_dostepu<<" zostal pomyslnie utworzony!"<<endl;
  147.             return true;
  148.         }
  149.         else
  150.         {
  151.             cout<<"Wystapil blad w tworzeniu "<<sciezka_dostepu<<". Program zostanie zamkniety!"<<endl;
  152.             return false;
  153.         }
  154.     }
  155.     else
  156.     {
  157.         plik.close();
  158.         return true;
  159.     }
  160. }
  161.  
  162. void rotor_wczytaj(unsigned char tablica[], string sciezka_dostepu)
  163. {
  164.     fstream plik;
  165.     plik.open(sciezka_dostepu.c_str(), ios::in);
  166.     for (int i=0; i<256; i++)
  167.     {
  168.         string dane;
  169.         getline(plik, dane);
  170.         tablica[i]=stoi(dane);
  171.     }
  172.     plik.close();
  173. }
  174.  
  175. int main()
  176. {
  177.     //Wczytanie ustawień rotora.
  178.     string nazwarotora1=wczytaj_s("Podaj sciezke dla pierwszego rotora: ");
  179.     string nazwarotora2=wczytaj_s("Podaj sciezke dla drugiego rotora: ");
  180.     //Sprawdzenie czy rotor istnieje, jeśli nie zostaje automatycznie wygenerowany z podaną nazwą. Jeśli program zwróci 1 lub 2 odpowiada to błędowi przy tworzeniu rotora kolejno pierwszego lub drugiego.
  181.     if (!rotor_exists(nazwarotora1))
  182.         return 1;
  183.     if (!rotor_exists(nazwarotora2))
  184.         return 2;
  185.  
  186.     unsigned char rotor1[256];
  187.     unsigned char rotor2[256];
  188.  
  189.     rotor_wczytaj(rotor1, nazwarotora1);
  190.     rotor_wczytaj(rotor2, nazwarotora2);
  191.    
  192.     int decyzja=wczytaj_i("Wybierz opcje:\n1.Szyfruj plik\n2.Rozszyfruj plik");
  193.     string nazwaplikuszyfr=wczytaj_s("Podaj nazwe pliku ktory chcesz zaszyfrowac (z rozszerzeniem): ");
  194.     string nazwaplikuwynik=wczytaj_s("Podaj nazwe pliku w ktorym zapisac wynik (program nie narzuca rozszerzenia) :");
  195.     if (decyzja==1)
  196.         int a=szyfrowanie_enigma(rotor1, rotor2, nazwaplikuszyfr, nazwaplikuwynik, true);
  197.     if (decyzja==2)
  198.         int a=szyfrowanie_enigma(rotor1, rotor2, nazwaplikuszyfr, nazwaplikuwynik, false);
  199.  
  200.     return 0;
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement