Pokaż wyniki 1 do 6 z 6

Temat: Problem z działaniem (program szyfrujący)

  1. #1
    Zarejestrowany
    May 2008
    Postów
    99

    Domyślnie Problem z działaniem (program szyfrujący)

    To mój pierwszy kontakt z programami szyfrującymi tekst (a zarazem pierwsza, samodzielna zabawa z plikami).
    Kod:
    #include <iostream>
    #include <fstream>
    #include <conio.h>
    #include <string>
    
      using namespace std;
      void szyfrowanie (void);
      void deszyfrowanie (void);
      void inf (void);
    
    /*------------------------------main ()-------------------------------*/
     int main()
     {
    	bool exit=true;
    	int wybor;
    	cout<<"[ctrl]+[S] - szyfruj    plik"<<endl;
    	cout<<"[ctrl]+[D] - deszyfruj  plik"<<endl;
    	cout<<"[esc]      - exit"<<endl;
    	while(exit)
    	{
    	 wybor=getch();
    	 switch(wybor)
    	 {
    	 		  case 19:
    		  			 szyfrowanie();
    		  			 break;
          
    				case 4:
            		 deszyfrowanie();
            		 break;
            
    				case 27:
    						 exit=false;
    						 break;
    			  case 59:
                 inf();
                 break;
    	 }
    	}
     }
     /*---------------------------szyfrowanie()---------------------------*/
     void szyfrowanie(void)
     {
        	cout<<"Szyfrowanie pliku\n";
     /*=====OPERACJE NA KLUCZU=====*/
             int a, b, c, d;
     			cout<<"Podaj 4-cyfrowy klucz szyfrowania"<<endl;
          a=getch();
          b=getch();
          c=getch();
          d=getch();
          
          cout<<"Klucz to: "<<a<<b<<c<<d<<endl;
     /*===== PLIK POCZĄTKOWY =====*/
          fstream wejscie;
     			wejscie.open("wiadomosc.txt",ios::in|ios::binary);
     			if(!wejscie)
     			{
    				cerr<<"Open (in)      [ERROR]\n";
    				return;
    	    }
    	    else cout<<"Open (in)      [OK]\n";
     /*====== PLIK WYNIKOWY ======*/
          fstream wyjscie;
    	    wyjscie.open("wiadomosc_w.txt",ios::out|ios::binary);
    			if(!wyjscie)
    			{
    			  cerr<<"Open (out)    [ERROR]\n";
    			  return;
          }
          else cout<<"Open (out)     [OK]\n";		
    
    /*== ODCZYT I ZAPIS ZNAKÓW DO PLIKÓW ==*/
        char znak[1000];
        wejscie.read(znak, 1000);
    /*""""""""" PROCES SZYFROWANIA """"""""*/
         int l=0;
         while(l<=999)
         {
         znak[l]=znak[l]>>a;
         l++;
         znak[l]=znak[l]>>b;
         l++;
         znak[l]=znak[l]>>c;
         l++;
         znak[l]=znak[l]>>d;
         l++;
         }
         
        wyjscie.write(znak, 1000);
         
         wejscie.close();
         wyjscie.close();
         return; 
     }
     
     /*--------------------------deszyfrowanie()--------------------------*/
     void deszyfrowanie(void)
     {
    	    cout<<"Deszyfrowanie pliku\n";
     /*=====OPERACJE NA KLUCZU=====*/
             int a, b, c, d;
     			cout<<"Podaj 4-cyfrowy klucz do deszfrowania, klucz\n";
     			cout<<"ten musi byc identyczny z kluczem szyfrowania."<<endl;
          a=getch();
          b=getch();
          c=getch();
          d=getch();
          
          cout<<"Klucz to: "<<a<<b<<c<<d<<endl;
     /*===== PLIK POCZĄTKOWY =====*/
          fstream wejscie;
     			wejscie.open("wiadomosc_w.txt",ios::in|ios::binary);
     			if(!wejscie)
     			{
    				cerr<<"Open (in)      [ERROR]\n";
    				return;
    	    }
    	    else cout<<"Open (in)      [OK]\n";
     /*====== PLIK WYNIKOWY ======*/
          fstream wyjscie;
    	    wyjscie.open("wiadomosc.txt",ios::out|ios::binary);
    			if(!wyjscie)
    			{
    			  cerr<<"Open (out)    [ERROR]\n";
    			  return;
          }
          else cout<<"Open (out)     [OK]\n";		
    
    /*== ODCZYT I ZAPIS ZNAKÓW DO PLIKÓW ==*/
        char znak[1000];
        wejscie.read(znak, 1000);
         cout<<znak<<endl;  
    /*"""""""" PROCES DESZYFROWANIA """""""*/
         int l=0;
         while(l<=999)
         {
         znak[l]=znak[l]<<a;
         l++;
         znak[l]=znak[l]<<b;
         l++;
         znak[l]=znak[l]<<c;
         l++;
         znak[l]=znak[l]<<d;
         l++;
         }
         
        wyjscie.write(znak, 1000);
         
         wejscie.close();
         wyjscie.close();
         return;
     }	
     /*---------------------------Informacje[F1]--------------------------*/
     void inf (void)
     {
      
     }
    Program się kompiluje i uruchamia. Problem pojawia się przy szyfrowaniu/ deszyfrowaniu. Z założenia wiadomość do zaszyfrowania miała być wpisana w wiadomosc.txt, a w pliku wiadomosc_w.txt miala byc w postaci zaszyfrowanej. Deszyfrowanie analogicznie. Niestety po zaszyfrowaniu i odszyfrowaniu wiadomości w obu plikach znajduje się ciąg białych znaków.

    Proszę o jakieś wskazówki (zależy mi na możliwości wprowadzenia "klucza" i chcę uniknąć czegoś w stylu:
    Kod:
    if (znak[x]==a)znak[x]=b;
    if (znak[x]==b)znak[x]=c;
    etc.)

    //Przepraszam za dość ograniczoną czytelność kodu (wcięcia). U mnie wygląda to dobrze, nie wiem czemu na forum się przestawia.

  2. #2
    Zarejestrowany
    May 2008
    Skąd
    Katowice
    Postów
    59

    Domyślnie

    Nie używaj zwykłych przesunięć bitowych bo tracisz dane, powinieneś użyć przesunięć cyklicznych. Nie znajdziesz w C operatora dla tego typu przesunięć, ale można je łatwo zaimplementować np:

    Kod:
    //w lewo
    unsigned char rol(unsigned char value, unsigned int count) {
             for (int i = 0; i < count; ++i) {
                 unsigned char bit = value & 0x80 ? 0x01 : 0x00;
                 
                 value <<= 1;
                 value |= bit;
             }
             
             return value;
    }
    
    //w prawo
    unsigned char ror(unsigned char value, unsigned int count) {
             for (int i = 0; i < count; ++i) {
                 unsigned char bit = value & 0x01 ? 0x80 : 0x00;
                 
                 value >>= 1;
                 value |= bit;
             }
             
             return value;
    }
    Użycie:
    Kod:
    /*""""""""" PROCES SZYFROWANIA """"""""*/
         int l=0;
         while(l<=999)
         {
         znak[l]=ror(znak[l], a);
         l++;
         znak[l]=ror(znak[l], b);
         l++;
         znak[l]=ror(znak[l], c);
         l++;
         znak[l]=ror(znak[l], d);
         l++;
         }
    
    /*"""""""" PROCES DESZYFROWANIA """""""*/
         int l=0;
         while(l<=999)
         {
         znak[l]=rol(znak[l], a);
         l++;
         znak[l]=rol(znak[l], b);
         l++;
         znak[l]=rol(znak[l], c);
         l++;
         znak[l]=rol(znak[l], d);
         l++;
         }
    Dla plików mniejszych od 1000 bajtów, oprócz danych szyfrujesz też śmieci ze stosu, które po deszyfracji znajdują się w pliku wynikowym.
    Ostatnio edytowane przez tyter : 06-02-2008 - 11:44

  3. #3
    Zarejestrowany
    May 2008
    Postów
    99

    Domyślnie

    Dziękuje za odpowiedź. Jak wrócę do domu to sprawdzę czy to działa. Co do szyfrowania śmieci, to najpierw chciałem zrobić jakiekolwiek szyfrowanie, a potem dopiero się tym zająć. Myślałem o pętli, która będzie się wykonywać do czasu gdy skończą się znaki w pliku. Dodał bym też przy tym rozwiązaniu zliczanie i wyświetlanie ilości znaków. Tylko... jak sprawdzić gdzie jest koniec? (mówiłem, że to mój pierwszy kontakt z plikami :P ).

  4. #4
    Zarejestrowany
    May 2008
    Skąd
    Katowice
    Postów
    59

  5. #5
    Zarejestrowany
    May 2008
    Postów
    99

    Domyślnie

    thx - temat myślę, że można zamknąć

  6. #6
    Avatar Nikow
    Nikow jest offline -=[ZRP]=-
    Zarejestrowany
    Sep 2007
    Skąd
    Różne zakątki sieci.
    Postów
    995

    Domyślnie

    Mogę dorzucić swoje 5gr? Nie czekając na odpowiedź, dam Ci radę, algorytmy kryptograficzne lepiej pisać w assemblerze
    http://nikowek.blogspot.com/
    Zbrojne Ramię Pingwina!
    -----BEGIN GEEK CODE BLOCK-----
    Version: 3.12
    GCS d- s++:++ a--- C+++ UL+++ P L+++ E--- W++ N++ o K- w--
    O M- V- PS PE Y PGP++ t+ 5 X+ R tv- b++ DI- D-
    G+ e- h! r% y?
    ------END GEEK CODE BLOCK------

Podobne wątki

  1. program zdalnie otwierajacy inny program:P
    By northdakota in forum C/C++
    Odpowiedzi: 9
    Autor: 02-27-2009, 23:48
  2. "n" bitowy klucz szyfrujący
    By SARS in forum Kryptografia
    Odpowiedzi: 4
    Autor: 06-17-2008, 20:22
  3. program 'pinger'
    By pinger in forum Inne metody
    Odpowiedzi: 7
    Autor: 01-28-2008, 22:47
  4. program
    By Goku1994 in forum Hacking
    Odpowiedzi: 9
    Autor: 08-05-2007, 15:51

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj