Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Program szyfrujacy/deszyfrujacy pliki.

Ostatnio zmodyfikowano 2015-01-01 22:22
Autor Wiadomość
crazy12
Temat założony przez niniejszego użytkownika
Program szyfrujacy/deszyfrujacy pliki.
» 2015-01-01 17:58:15
Witam
Mam do napisania program szyfrujący/deszyfrujący pliki. Mam napisana część szyfrującą plik, ale problem pojawił się gdy chce ten sam plik odszyfrować do pierwotnej postaci. W linku przesyłam skan polecenia: http://www.img.pl/cvHg. Mój problem pojawia się gdy po wczytaniu pliku z zaszyfrowanym tekstem chce każdy znak zamienić na wartość dziesiętną w kodzie ASCII np. dla "T" po zaszyfrowaniu jest to wartość -2. Czy byłby ktoś w stanie sprawdzić mi ten kod i powiedzieć co zle robię z tym odszyfrowywaniem? Z góry dziękuje;)
C/C++
#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;
        }
    }
   
   
   
   
   
   
   
   
   
   
   
}

int main()

{
    int odpowiedz;
    cout << "------------- SZYFR XOR ---------------" << endl;
    cout << "--------- Wybierz opcje i wcisnij ENTER -----------" << endl;
    cout << "1 - szyfrowanie" << endl << "2 - odszyfrowanie" << endl << endl;
    cout << "Odpowiedz: ";
    cin >> odpowiedz;
    switch( odpowiedz )
    {
    case 1: szyfruj( plik_we, plik_wy, licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII, licznik_bit, txt, wektor, txt_bin, licznik_bin );
        cout << "szyfrowanie zakonczone pomyslnie" << endl;
        break;
    case 2: odszyfruj( plik_we, plik_wy, licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII, licznik_bit, txt, wektor, txt_bin, licznik_bin );
        cout << "odszyfrowywanie zakonczone" << endl;
        break;
        default: cout << "Nieznane polecenie" << endl;
        break;
    }
   
    system( "PAUSE" );
    return 0;
}
P-123795
C-Objective
» 2015-01-01 18:31:55
Po co ci iomanip? Nie możesz zastosować innego algorytmu? Mogę ci coś podrzucić. Użyj do wykonania pliku "math.h", "cstring" i "string"

Tekst -> Liczba ↓
               
Liczba -----> Pierwiastek 2 stopnia -> zaokrąglenie w górę ->Jeżeli 2 niżej jeżeli nie, dalej. -> pomnóż przez 4 i podziel przez 7. -> Podziel liczby po dwa. (Tzn. 1927= 19, 27) i zamień na System szesnastkowy. -> Uzyskaną liczbę zamień na znak i wprowadź do pliku.

Pomnóż przez 5 i powtórz proces na uzyskanej cyfrze.

//Koniec przykładu. Algorytm możesz zmieniać losowo, a w pliku wyściowym wypisywać zasadę działania...
Musisz zrobić coś w rodzaju tablicy znaków, najlepiej wczytuj z pliku. Usuń niepotrzebne include bo zwiększy się rozmiar pliku. Logi zapisz do pliku żeby nie generować brzydkiego okna konsoli. Potem jakiś user sobie przejrzy.
Radź sobie sam, zabierasz się daleko. Podałem ci pomysł jak zrobić teraz tylko zakoduj. I tak odwaliłem za ciebie za dużo.
P-123800
crazy12
Temat założony przez niniejszego użytkownika
» 2015-01-01 18:53:19
Dzięki za odpowiedz, ale myślę że to co mi zaproponowałeś wykracza poza moją wiedze i nie mogę tego użyć. Moje pytanie dotyczyło zamiany znaku na liczbę w funkcji deszyfrującej. Ktoś inne rozwiązania?
P-123805
C-Objective
» 2015-01-01 19:16:31
Jak chcesz mogę ci napisać algorytm za FREE ale reszte prostrzą możesz sobie załatwić.
P-123807
crazy12
Temat założony przez niniejszego użytkownika
» 2015-01-01 19:26:11
mnie interesuje rozwiazanie problemu zamiany znaku na liczbe w funkcji deszyfrujacej. mozesz to zrobic?
P-123808
Kaikso
» 2015-01-01 20:29:34
Dawno dawno temu, gdy zaczynałem programować napisałem coś takiego:

C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <ctime>

#define WEPCS_VERSION       "0.0.1"

#define STAT_KEY            0x01
#define STAT_IFILE          0x02
#define STAT_OFILE          0x04

#define FLAG_DECRYPTION     0x01

void hash( const unsigned char * key, const unsigned char * iv, char unsigned * keystream )
{
    unsigned char i = 0, j = 0;
    while( i < 5 ) keystream[ i ] = key[ i++ ];
   
    while( i < 8 ) keystream[ i++ ] = iv[ j++ ];
   
    j = keystream[ 7 ] % 15;
    for( i = 0; i < 8; i++ )
    {
        unsigned char tmp = keystream[ i ] % 15;
        keystream[ i ] ^= j;
        j = tmp;
    }
}

int main( int argc, char * argv[] )
{
    char key[ 6 ];
    char data[ 8 ];
    char * ifile_name;
    char * ofile_name;
   
    unsigned char iv[ 3 ];
    unsigned char keystream[ 8 ];
    unsigned char stats = 0x00;
    unsigned char flags = 0x00;
   
    std::ifstream ifile;
    std::ofstream ofile;
   
    for( int i = 1; i < argc; i++ )
    {
        if( argv[ i ][ 0 ] == '-' )
        {
            if( strcmp( argv[ i ], "-h" ) == 0 || strcmp( argv[ i ], "--help" ) == 0 )
            {
                std::cout << "Użycie: " << argv[ 0 ] << " [opcja] [klucz (max. 5 znaków)] [plik] ..." << std::endl;
                std::cout << std::endl;
                std::cout << "Opcje:" << std::endl;
                std::cout << " -h, --help\t\t\t\tWyświetla ten tekst pomocy" << std::endl;
                std::cout << " -v, --version\t\t\t\tWyświetla wersje programu" << std::endl;
                std::cout << " -d, --decryption\t\t\tDeszyfrowanie pliku" << std::endl;
                std::cout << std::endl;
                std::cout << " -o <plik>\t\t\t\tNazwa pliku wyjściowego" << std::endl;
                std::cout << " -i <plik>\t\t\t\tNazwa pliku wejściowego" << std::endl;
               
                return 0;
            }
            else if( strcmp( argv[ i ], "-v" ) == 0 || strcmp( argv[ i ], "--version" ) == 0 )
            {
                std::cout << "wepcs " << WEPCS_VERSION << std::endl;
                std::cout << "Copyright (c) 2014 Andrzej \"K@ikso\" Brzeziński" << std::endl;
               
                return 0;
            }
            else if( strcmp( argv[ i ], "-o" ) == 0 )
            {
                if(( i + 1 ) >= argc )
                {
                    std::cerr << "Podano zamało parametrów." << std::endl;
                    std::cout << "Wpisz \"" << argv[ 0 ] << " --help\" aby wyświetlić tekst pomocy." << std::endl;
                   
                    return 1;
                }
               
                i++;
                ofile_name = new char[ strlen( argv[ i ] ) ];
                strcpy( ofile_name, argv[ i ] );
                stats |= STAT_OFILE;
            }
            else if( strcmp( argv[ i ], "-i" ) == 0 )
            {
                if(( i + 1 ) >= argc )
                {
                    std::cerr << "Podano zamało parametrów." << std::endl;
                    std::cout << "Wpisz \"" << argv[ 0 ] << " --help\" aby wyświetlić tekst pomocy." << std::endl;
                   
                    return 1;
                }
               
                i++;
                ifile_name = new char[ strlen( argv[ i ] ) ];
                strcpy( ifile_name, argv[ i ] );
                stats |= STAT_IFILE;
            }
            else if( strcmp( argv[ i ], "-d" ) == 0 )
            {
                flags |= FLAG_DECRYPTION;
            }
            else
            {
                std::cerr << "Nieprawidłowa opcja `" << argv[ i ] << '\'' << std::endl;
                std::cout << "Wpisz \"" << argv[ 0 ] << " --help\" aby wyświetlić tekst pomocy." << std::endl;
               
                return 1;
            }
        }
        else
        {
            if( !( stats & STAT_KEY ) )
            {
                if( strlen( argv[ i ] ) > 24 )
                {
                    std::cerr << "Klucz jest zbyt długi długość (max. 5 znaków)." << std::endl;
                    return 1;
                }
               
                strcpy( key, argv[ i ] );
                stats |= STAT_KEY;
            }
            else if( !( stats & STAT_IFILE ) )
            {
                ifile_name = new char[ strlen( argv[ i ] ) ];
                strcpy( ifile_name, argv[ i ] );
                stats |= STAT_IFILE;
            }
            else
            {
                std::cerr << "Podano za dużo parametrów." << std::endl;
                std::cout << "Wpisz \"" << argv[ 0 ] << " --help\" aby wyświetlić tekst pomocy." << std::endl;
               
                return 1;
            }
           
        }
    }
   
    if( !( stats & STAT_KEY ) | !( stats & STAT_IFILE ) )
    {
        std::cerr << "Podano za mało argumentów." << std::endl;
        std::cout << "Wpisz \"" << argv[ 0 ] << " --help\" aby wyświetlić tekst pomocy." << std::endl;
       
        return 1;
    }
   
    if( !( stats & STAT_OFILE ) )
    {
        ofile_name = new char[ strlen( ifile_name ) + 6 ];
        strcpy( ofile_name, ifile_name );
        strcat( ofile_name, ".wepcs" );
        stats |= STAT_OFILE;
    }
   
    ifile.open( ifile_name, std::ios::binary );
    if( !ifile.good() )
    {
        std::cerr << "Wystąpił błąd podczas otwierania pliku `" << ifile_name << "\'." << std::endl;
        ifile.close();
       
        return 1;
    }
   
    ofile.open( ofile_name, std::ios::binary );
    if( !ofile.good() )
    {
        std::cerr << "Wystąpił błąd podczas otwierania pliku `" << ofile_name << "\'." << std::endl;
        ofile.close();
       
        return 1;
    }
   
    if( flags & FLAG_DECRYPTION )
         ifile.read(( char * ) iv, 3 );
   
    else
    {
        srand( time( NULL ) );
        for( int i = 0; i < 3; i++ )
             iv[ i ] = rand() % 256;
       
        ofile.write(( char * ) iv, 3 );
    }
   
    hash(( unsigned char * ) key, iv, keystream );
   
    unsigned char count;
    do
    {
        ifile.read( data, 8 );
        count = ifile.gcount();
        for( int i = 0; i < count; i++ )
             data[ i ] ^= keystream[ i ];
       
        ofile.write( data, count );
       
    } while( count > 0 );
   
    ifile.close();
    ofile.close();
   
    return 0;
}

Program ogólnie jest dobry, kod funkcji hash jest strasznie prymitywny :P
A więc wystarczy zmienić kod funkcji hash i maksymalną liczbę znaków dla klucza i program działa idealnie ;)

Program generuje losowy iv, dlatego ten sam plik dwa razy zaszyfrowany wgląda inaczej.
P-123817
crazy12
Temat założony przez niniejszego użytkownika
» 2015-01-01 22:22:46
Dobra już sobie poradziłem, problem polegał na tym że znak należało przypisywać do zmiennej unsigned int a nie zwykłego int z powodu rozrzeszonej tablicy znaków ASCII. Zamieszczam kod programu, może komuś sie przyda.

C/C++
#include <iostream>
#include <iomanip>
#include <fstream>

using namespace std;

char plik_wejsciowy[ 20 ];
char plik_wyjsciowy[ 20 ];
int licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII;
char txt;
int licznik_bin[ 8 ];
int wektor[ 8 ] = { 0, 1, 0, 1, 0, 1, 0, 1 };
int wektor_odszyfrujacy[ 8 ];
int txt_bin[ 255 ];

void szyfruj( char plik_wejsciowy[], char plik_wyjsciowy[], int licznik, int licznik_wpisany, int mnoznik, int wartosc, int wartosc_ASCII, char txt, int licznik_bin[], int wektor[], int txt_bin[] )
{
   
    cout << "Podaj nazwe pliku do zaszyfrowania: ";
    cin >> plik_wejsciowy;
    cout << "Podaj nazwe pliku do zapisu: ";
    cin >> plik_wyjsciowy;
   
    ifstream plikIn( plik_wejsciowy );
    if( !plikIn )
    {
        cout << "Plik do zaszyfrowania nie zostal otwarty";
        system( "PAUSE" );
    }
   
    ofstream plikOut( plik_wyjsciowy );
    if( !plikOut )
    {
        cout << "Plik do zapisu nie zostal otwarty";
        system( "PAUSE" );
    }
   
    cout << "Podaj licznik do szyfrowania (0-255): ";
    cin >> licznik_wpisany;
   
    if( licznik < 0 and licznik > 255 )
    {
        cout << "Podales niedozwolony licznik" << endl;
    }
    else
   
    while( plikIn )
    {
        plikIn.get( txt );
        for( int j = 0; j < 8; j++ )
        {
            txt_bin[ j ] = txt % 2;
            txt /= 2;
        }
       
        for( int i = 7; i >= 0; i-- )
        {
            if( txt_bin[ i ] == wektor[ i ] )
                 txt_bin[ i ] = 0;
            else
                 txt_bin[ i ] = 1;
           
        }
       
        licznik = licznik_wpisany;
        for( int j = 0; j < 8; j++ )
        {
            licznik_bin[ j ] = licznik % 2;
            licznik /= 2;
        }
       
        for( int i = 7; i >= 0; i-- )
        {
            if( txt_bin[ i ] == licznik_bin[ i ] )
                 txt_bin[ i ] = 0;
            else
                 txt_bin[ i ] = 1;
           
        }
       
        wartosc = 1;
        wartosc_ASCII = 0;
        for( int i = 0; i < 8; i++ )
        {
            if( txt_bin[ i ] == 1 )
                 wartosc_ASCII = wartosc_ASCII + wartosc;
           
            wartosc = wartosc * 2;
        }
       
        plikOut << static_cast < char >( wartosc_ASCII );
       
        for( int i = 7; i >= 0; i-- )
             wektor[ i ] = txt_bin[ i ];
       
        if( licznik_wpisany == 255 )
             licznik_wpisany = 0;
        else
             licznik_wpisany++;
       
    }
    plikIn.close();
    plikOut.close();
}

void odszyfruj( int wektor_odszyfrujacy[], char plik_wejsciowy[], char plik_wyjsciowy[], int licznik, int licznik_wpisany, int mnoznik, int wartosc, int wartosc_ASCII, char txt, int licznik_bin[], int wektor[], int txt_bin[] )
{
   
    cout << "Podaj nazwe pliku do odszyfrowania: ";
    cin >> plik_wejsciowy;
    cout << "Podaj nazwe pliku do zapisu: ";
    cin >> plik_wyjsciowy;
   
    ifstream plikIn( plik_wejsciowy );
    if( !plikIn )
    {
        cout << "Plik do odszyfrowania nie zostal otwarty";
        system( "PAUSE" );
    }
   
    ofstream plikOut( plik_wyjsciowy );
    if( !plikOut )
    {
        cout << "Plik do zapisu nie zostal otwarty";
        system( "PAUSE" );
    }
   
    cout << "Podaj licznik do odszyfrowania (0-255): ";
    cin >> licznik_wpisany;
   
    if( licznik < 0 and licznik > 255 )
    {
        cout << "Podales niedozwolony licznik" << endl;
    }
    else
   
    while( plikIn )
    {
        plikIn.get( txt );
        unsigned char znak = txt;
       
        for( int j = 0; j < 8; j++ )
        {
            txt_bin[ j ] = znak % 2;
            znak /= 2;
        }
       
        for( int i = 7; i >= 0; i-- )
             wektor_odszyfrujacy[ i ] = txt_bin[ i ];
       
        licznik = licznik_wpisany;
        for( int j = 0; j < 8; j++ )
        {
            licznik_bin[ j ] = licznik % 2;
            licznik /= 2;
        }
       
        for( int i = 7; i >= 0; i-- )
        {
            if( txt_bin[ i ] == licznik_bin[ i ] )
                 txt_bin[ i ] = 0;
            else
                 txt_bin[ i ] = 1;
           
        }
       
        for( int i = 7; i >= 0; i-- )
        {
            if( txt_bin[ i ] == wektor[ i ] )
                 txt_bin[ i ] = 0;
            else
                 txt_bin[ i ] = 1;
           
        }
       
        wartosc = 1;
        wartosc_ASCII = 0;
        for( int i = 0; i < 8; i++ )
        {
            if( txt_bin[ i ] == 1 )
                 wartosc_ASCII = wartosc_ASCII + wartosc;
           
            wartosc = wartosc * 2;
        }
       
        plikOut << static_cast < char >( wartosc_ASCII );
       
        for( int i = 7; i >= 0; i-- )
             wektor[ i ] = wektor_odszyfrujacy[ i ];
       
        if( licznik_wpisany == 255 )
             licznik_wpisany = 0;
        else
             licznik_wpisany++;
       
    }
    plikIn.close();
    plikOut.close();
}




int main()

{
    int odpowiedz;
    cout << "------------- SZYFR XOR ---------------" << endl;
    cout << "--------- Wybierz opcje i wcisnij ENTER -----------" << endl;
    cout << "1 - szyfrowanie" << endl << "2 - odszyfrowanie" << endl << endl;
    cout << "Odpowiedz: ";
    cin >> odpowiedz;
    switch( odpowiedz )
    {
    case 1: szyfruj( plik_wejsciowy, plik_wyjsciowy, licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII, txt, licznik_bin, wektor, txt_bin );
        cout << "szyfrowanie zakonczone pomyslnie" << endl;
        break;
    case 2: odszyfruj( wektor_odszyfrujacy, plik_wejsciowy, plik_wyjsciowy, licznik, licznik_wpisany, mnoznik, wartosc, wartosc_ASCII, txt, licznik_bin, wektor, txt_bin );
        cout << "odszyfrowywanie zakonczone" << endl;
        break;
        default: cout << "Nieznane polecenie" << endl;
        break;
    }
   
    system( "PAUSE" );
    return 0;
}
P-123831
« 1 »
  Strona 1 z 1