napisz program szyfrujący tekst wczytany z pliku tekstowego c++



Odpowiedź :

Odpowiedź:

#include <iostream>

#include <iomanip>

#include <fstream>

using namespace std;

char plik_we[ 50 ], plik_wy[ 50 ];

int licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII, licznik_bit;

char txt[ 16 ];

int licznik_bin[ 8 ];

int wektor[ 8 ] = { 0, 1, 0, 1, 0, 1, 0, 1 };

int txt_bin[ 255 ];

void szyfruj( char plik_we[], char plik_wy[], int licznik, int licznik_wpisany, int mnoznik, int wartosc, int wartosc_ASCII, int licznik_bit, char txt[], int wektor[], int txt_bin[], int licznik_bin[] )

{

   cout << "Podaj licznik do szyfrowania (0-255): " << endl;

   cin >> licznik_wpisany;

   

   if( licznik < 0 and licznik > 255 )

   {

       cout << "Podales niedozwolony licznik" << endl;

   }

   else

        cout << "Podaj nazwe pliku do zaszyfrowania: " << endl;

   

   cin >> plik_we;

   cout << "Podaj nazwe pliku do zapisu: " << endl;

   cin >> plik_wy;

   

   ifstream plikIn( plik_we );

   if( !plikIn )

   {

       cout << "Plik do zaszyfrowania nie zostal otwarty" << endl;

       system( "PAUSE" );

   }

   

   ofstream plikOut( plik_wy );

   if( !plikOut )

   {

       cout << "Plik do zapisu nie zostal otwarty" << endl;

       system( "PAUSE" );

   }

   while( plikIn )

   {

       plikIn.read( reinterpret_cast < char *>( txt ), 16 );

       int len = plikIn.gcount();

       if( len == 0 ) break;

       

       for( int i = 0; i < len; i++ )

       {

           plikIn >> txt[ i ];

       }

       for( int i = 0; i < len; i++ )

       {

           licznik_bit = 0;

           do //zamiana znaku na binarny

           {

               for( int j = 0; j < 8; j++ )

               {

                   txt_bin[ j ] = txt[ i ] % 2;

                   txt[ i ] /= 2;

                   licznik_bit++;

               }

           } while( licznik_bit < 8 );

           

           for( int i = 7; i >= 0; i-- ) //xor z wektorem 0xAA

           {

               if( txt_bin[ i ] == wektor[ i ] )

                    txt_bin[ i ] = 0;

               else

                    txt_bin[ i ] = 1;

               

           }

           

           licznik = licznik_wpisany; // zamiana licznika na binarny

           licznik_bit = 0;

           do

           {

               for( int j = 0; j < 8; j++ )

               {

                   licznik_bin[ j ] = licznik % 2;

                   licznik /= 2;

                   licznik_bit++;

               }

           } while( licznik_bit < 8 );

           

           for( int i = 7; i >= 0; i-- ) // xor z licznikiem

           {

               if( txt_bin[ i ] == licznik_bin[ i ] )

                    txt_bin[ i ] = 0;

               else

                    txt_bin[ i ] = 1;

               

           }

           

           mnoznik = 0; //zamiana na ASCII

           wartosc = 1;

           wartosc_ASCII = 0;

           for( int i = 0; i < 8; i++ )

           {

               if( txt_bin[ i ] == 1 )

                    wartosc_ASCII = wartosc_ASCII + wartosc;

               

               mnoznik++;

               wartosc = wartosc * 2;

           }

           

           plikOut << static_cast < char >( wartosc_ASCII );

           

           for( int i = 7; i >= 0; i-- ) //przypisanie wyniku do wektora

                wektor[ i ] = txt_bin[ i ];

           

           if( licznik_wpisany == 255 )

                licznik_wpisany = 0;

           else

                licznik_wpisany++;

           

       }

   }

   plikIn.close();

   plikOut.close();

}

void odszyfruj( char plik_we[], char plik_wy[], int licznik, int licznik_wpisany, int mnoznik, int wartosc, int wartosc_ASCII, int licznik_bit, char txt[], int wektor[], int txt_bin[], int licznik_bin[] )

{

   cout << "Podaj licznik do odszyfrowania (0-255): " << endl;

   cin >> licznik;

   if( licznik < 0 and licznik > 255 )

   {

       cout << "Podales niedozwolony licznik" << endl;

   }

   else

        cout << "Podaj nazwe pliku do odszyfrowania: " << endl;

   

   cin >> plik_we;

   cout << "Podaj nazwe pliku do zapisu: " << endl;

   cin >> plik_wy;

   

   ifstream plikIn( plik_we );

   if( !plikIn )

   {

       cout << "Plik do odszyfrowania nie zostal otwarty" << endl;

       system( "PAUSE" );

   }

   

   ofstream plikOut( plik_wy );

   if( !plikOut )

   {

       cout << "Plik do zapisu nie zostal otwarty" << endl;

       system( "PAUSE" );

   }

   while( plikIn )

   {

       plikIn.read( static_cast < char *>( txt ), 16 );

       int len = plikIn.gcount();

       if( len == 0 ) break;

       

       for( int i = 0; i < len; i++ )

       {

           plikIn >> txt[ i ];

           cout << static_cast < int >( txt[ i ] ) << endl;

       }

       

       for( int i = 0; i < len; i++ )

       {

           int licznik_bit = 0;

           do

           {

               for( int j = 0; j < 8; j++ )

               {

                   txt_bin[ j ] = txt[ i ] % 2 + 1; //zamiana znaku na binarny

                   txt[ i ] /= 2;

                   licznik_bit++;

               }

           } while( licznik_bit < 8 );

           

           for( int i = 8; i > 0; i-- )

                cout << txt_bin[ i ];

           

           cout << endl;

       }

   }

Wyjaśnienie: