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;) #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 { 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-- ) { if( txt_bin[ i ] == wektor[ i ] ) txt_bin[ i ] = 0; else txt_bin[ i ] = 1; } licznik = licznik_wpisany; 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-- ) { if( txt_bin[ i ] == licznik_bin[ i ] ) txt_bin[ i ] = 0; else txt_bin[ i ] = 1; } mnoznik = 0; 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-- ) 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; 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; }
|
|
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. |
|
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? |
|
C-Objective |
» 2015-01-01 19:16:31 Jak chcesz mogę ci napisać algorytm za FREE ale reszte prostrzą możesz sobie załatwić. |
|
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?
|
|
Kaikso |
» 2015-01-01 20:29:34 Dawno dawno temu, gdy zaczynałem programować napisałem coś takiego: #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. |
|
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. #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; }
|
|
« 1 » |