Saiph Temat założony przez niniejszego użytkownika |
Szyfrowanie danych » 2009-12-06 18:40:06 Witam wszystkich. Pisze własnie program szyfrujący dane, opieram się na bibliotece fstream. I tu mam pewien kłopot... Szyfr polega na przesunięciu znaków ASCII o liczbę podana przez użytkownika. Stworzyłem plik a.txt o treści: abc def ghi
Plik wazy 13 bajtow. Wczytuje plik, następnie zaszyfrowuje treść(przesuniecie wynosi 1) i zapisuje do pliku b.txt: bcd efg hij[spacja][spacja]
No to dalej... Teraz rozszyfrowuje plik i wynik zapisuje do pliku c.txt: abc def ghj[spacja][spacja]
I kłopot mam z tymi spacjami, dlaczego one się pojawiają? Czasami przy innych plikach tych spacji może być więcej albo może pojawić się jakiś inny znak :( Bardzo to utrudnia sprawę przy szyfrowaniu większych plików, a tym bardziej szyfrując jakieś zdiecia, czy pliki otwierane przez inny program... Oto 2 części programu które odpowiadają za szyfrowanie i deszyfrowanie: -szyfrowanie: clrscr(); int move5, lol; string b5, NazwaPliku5, NazwaPliku5a; cout << "Podaj nazwe pliku wejsciowego: "; getline( cin, NazwaPliku5 ); cout << "Podaj nazwe pliku wyjsciowego: "; getline( cin, NazwaPliku5a ); cout << "Podaj przesuniecie znakow: "; cin >> move5; cout << endl;
fstream plik5; plik5.open( NazwaPliku5.c_str(), std::ios::in ); plik5.seekg( 0, ios::end ); lol = plik5.tellg(); plik5.seekg( 0, ios::beg );
fstream plik5a( NazwaPliku5a.c_str(), ios::out | ios::trunc ); if( plik5.good() == true ) { textcolor( 10 ); cout << "Plik wejsciowy otwarto!" << endl; textcolor( 7 ); char a5[ lol ]; plik5.read( a5, lol ); for( int i = 0; i < lol; i++ ) b5 += textToCode( a5[ i ], move5 ); textcolor( 10 ); cout << "Tresc pliku wejsciowego zaszyfrowano!" << endl; textcolor( 7 ); plik5a.write( & b5[ 0 ], b5.length() ); if( !plik5a ) { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie zapisac!" << endl; getch(); clrscr(); goto main; } else { textcolor( 10 ); cout << "Zapisano zaszyfrowana tresc do pliku wyjsciowego!" << endl; getch(); clrscr(); goto main; } getch(); clrscr(); goto main; } else { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie otworzyc!" << endl; getch(); clrscr(); goto main; }
-deszyfrowanie: clrscr(); int move6, lol2; string a6, b6, NazwaPliku6, NazwaPliku6a; cout << "Podaj nazwe pliku wejsciowego: "; getline( cin, NazwaPliku6 ); cout << "Podaj nazwe pliku wyjsciowego: "; getline( cin, NazwaPliku6a ); cout << "Podaj przesuniecie znakow: "; cin >> move6;
cout << endl;
fstream plik6; plik6.open( NazwaPliku6.c_str(), std::ios::in );
plik6.seekg( 0, ios::end ); lol2 = plik6.tellg(); plik6.seekg( 0, ios::beg );
fstream plik6a( NazwaPliku6a.c_str(), ios::out | ios::trunc ); if( plik6.good() == true ) { textcolor( 10 ); cout << "Plik wejsciowy otwarto!" << endl; textcolor( 7 ); char a6[ lol2 ]; plik6.read( a6, lol2 ); for( int i = 0; i < lol2; i++ ) b6 += codeToText( a6[ i ], move6 ); textcolor( 10 ); cout << "Tresc pliku wejsciowego zdeszyfrowano!" << endl; textcolor( 7 ); plik6a.write( & b6[ 0 ], b6.length() ); if( !plik6a ) { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie zapisac!" << endl; getch(); clrscr(); goto main; } else { textcolor( 10 ); cout << "Zapisano zdeszyfrowana tresc do pliku wyjsciowego!" << endl; getch(); clrscr(); goto main; } getch(); clrscr(); goto main; } else { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie otworzyc!" << endl; getch(); clrscr(); goto main; } }
Proszę o pomoc w rozwiązaniu sprawy. |
|
Elaine |
» 2009-12-06 18:56:07 Kiedy wy się wreszcie nauczycie, że wymyślanie przykładów niedziałania kodu, który się nie kompiluje nie ma sensu, bo niektórzy na tym forum (jeszcze) myślą?
Sformatuj ten kod sensownie i przepisz bez goto, wtedy pogadamy. I oczywiście pokaż textToCode i codeToText. |
|
Saiph Temat założony przez niniejszego użytkownika |
» 2009-12-06 19:32:33 o nie cały post mi znikł ;( #include <iostream> #include <conio.h> #include <fstream> #include "console.ddt"
using namespace std; using namespace ddt::console;
int textToCode( int menu, int move ); int codeToText( int menu, int move ); void info( void );
int main() { main: bool koniec = false; while( koniec != true ) { info(); unsigned char znak = getch(); if( znak == 49 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Szyfrowanie" ); clrscr(); int move1; string a1, b1; cout << "Podaj text ktory chcesz zaszyfrowac: " << endl; getline( cin, a1 ); cout << "Podaj przesuniecie znakow: "; cin >> move1; for( int i = 0; i < a1.length(); i++ ) b1 += textToCode( a1[ i ], move1 ); cout << endl; cout << "Zaszyfrowany tekst to:" << endl << b1 << endl; getch(); clrscr(); goto main; } if( znak == 50 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Deszyfrowanie" ); clrscr(); int move2; string a2, b2; cout << "Podaj text ktory chcesz zdeszyfrowac: " << endl; getline( cin, a2 ); cout << "Podaj przesuniecie znakow: "; cin >> move2; for( int i = 0; i < a2.length(); i++ ) b2 += codeToText( a2[ i ], move2 ); cout << endl; cout << "Zdeszyfrowany tekst to:" << endl << b2 << endl; getch(); clrscr(); goto main; } if( znak == 51 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Szyfrowanie do pliku" ); clrscr(); int move3; string a3, b3, NazwaPliku3; cout << "Podaj nazwe pliku: "; getline( cin, NazwaPliku3 ); cout << "Podaj text ktory chcesz zaszyfrowac: " << endl; getline( cin, a3 ); cout << "Podaj przesuniecie znakow: "; cin >> move3; cout << endl; fstream plik3( NazwaPliku3.c_str(), ios::out | ios::trunc ); for( int i = 0; i < a3.length(); i++ ) b3 += textToCode( a3[ i ], move3 ); cout << "Zaszyfrowany tekst to:" << endl << b3 << endl << endl;; plik3.write( & b3[ 0 ], b3.length() ); if( !plik3 ) { textcolor( 12 ); cout << "ERROR!" << endl; } else { textcolor( 10 ); cout << "Zapisano" << endl; } getch(); clrscr(); goto main; } if( znak == 52 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Deszyfrowanie z pliku" ); clrscr(); int move4, lol3; string a4, b4, NazwaPliku4; cout << "Podaj nazwe pliku: "; getline( cin, NazwaPliku4 ); cout << "Podaj przesuniecie znakow: "; cin >> move4; fstream plik4; plik4.open( NazwaPliku4.c_str(), std::ios::in ); plik4.seekg( 0, ios::end ); lol3 = plik4.tellg(); plik4.seekg( 0, ios::beg ); if( plik4.good() == true ) { textcolor( 10 ); cout << "Plik otwarto!" << endl; textcolor( 7 ); char a4[ lol3 ]; plik4.read( a4, lol3 ); cout << "Zawartosc pliku: \n" << a4 << "\n\n Zdeszyfrowana zawartosc pliku: \n"; for( int i = 0; i < lol3; i++ ) b4 += codeToText( a4[ i ], move4 ); cout << b4; } else { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie otworzyc!" << endl; } getch(); clrscr(); goto main; } if( znak == 53 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Szyfrowanie pliku" ); clrscr(); int move5, lol; string b5, NazwaPliku5, NazwaPliku5a; cout << "Podaj nazwe pliku wejsciowego: "; getline( cin, NazwaPliku5 ); cout << "Podaj nazwe pliku wyjsciowego: "; getline( cin, NazwaPliku5a ); cout << "Podaj przesuniecie znakow: "; cin >> move5; cout << endl; fstream plik5; plik5.open( NazwaPliku5.c_str(), std::ios::in ); plik5.seekg( 0, ios::end ); lol = plik5.tellg(); plik5.seekg( 0, ios::beg ); fstream plik5a( NazwaPliku5a.c_str(), ios::out | ios::trunc ); if( plik5.good() == true ) { textcolor( 10 ); cout << "Plik wejsciowy otwarto!" << endl; textcolor( 7 ); char a5[ lol ]; plik5.read( a5, lol ); for( int i = 0; i < lol; i++ ) b5 += textToCode( a5[ i ], move5 ); textcolor( 10 ); cout << "Tresc pliku wejsciowego zaszyfrowano!" << endl; textcolor( 7 ); plik5a.write( & b5[ 0 ], b5.length() ); if( !plik5a ) { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie zapisac!" << endl; getch(); clrscr(); goto main; } else { textcolor( 10 ); cout << "Zapisano zaszyfrowana tresc do pliku wyjsciowego!" << endl; getch(); clrscr(); goto main; } getch(); clrscr(); goto main; } else { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie otworzyc!" << endl; getch(); clrscr(); goto main; } } if( znak == 54 ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph - Deszyfrowanie pliku" ); clrscr(); int move6, lol2; string a6, b6, NazwaPliku6, NazwaPliku6a; cout << "Podaj nazwe pliku wejsciowego: "; getline( cin, NazwaPliku6 ); cout << "Podaj nazwe pliku wyjsciowego: "; getline( cin, NazwaPliku6a ); cout << "Podaj przesuniecie znakow: "; cin >> move6; cout << endl; fstream plik6; plik6.open( NazwaPliku6.c_str(), std::ios::in ); plik6.seekg( 0, ios::end ); lol2 = plik6.tellg(); plik6.seekg( 0, ios::beg ); fstream plik6a( NazwaPliku6a.c_str(), ios::out | ios::trunc ); if( plik6.good() == true ) { textcolor( 10 ); cout << "Plik wejsciowy otwarto!" << endl; textcolor( 7 ); char a6[ lol2 ]; plik6.read( a6, lol2 ); for( int i = 0; i < lol2; i++ ) b6 += codeToText( a6[ i ], move6 ); textcolor( 10 ); cout << "Tresc pliku wejsciowego zdeszyfrowano!" << endl; textcolor( 7 ); plik6a.write( & b6[ 0 ], b6.length() ); if( !plik6a ) { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie zapisac!" << endl; getch(); clrscr(); goto main; } else { textcolor( 10 ); cout << "Zapisano zdeszyfrowana tresc do pliku wyjsciowego!" << endl; getch(); clrscr(); goto main; } getch(); clrscr(); goto main; } else { textcolor( 12 ); cout << "ERROR! Pliku nie udalo sie otworzyc!" << endl; getch(); clrscr(); goto main; } } if( znak == 27 ) koniec = true; } return 0; }
int textToCode( int menu, int move ) { for( int i = 0; i <= 255; i++ ) { int j = i + move; if( menu == i ) return j; } }
int codeToText( int menu, int move ) { for( int i = 0; i <= 255; i++ ) { int j = i + move; if( menu == j ) return i; } } void info( void ) { ddt::console::title( "Szyfrownik 1.0 (c)2009 by Saiph" ); clrscr(); textcolor( 11 ); cout << "Szyfownik 1.0 "; textcolor( 14 ); cout << "(c)2009 by Saiph" << endl; textcolor( 7 ); textcolor( 15 ); cout << "[1]"; textcolor( 7 ); cout << " - Szyfrowanie" << endl; textcolor( 15 ); cout << "[2]"; textcolor( 7 ); cout << " - Deszyfrowanie" << endl; textcolor( 15 ); cout << "[3]"; textcolor( 7 ); cout << " - Szyfrowanie do pliku" << endl; textcolor( 15 ); cout << "[4]"; textcolor( 7 ); cout << " - Deszyfrowanie z pliku" << endl; textcolor( 15 ); cout << "[5]"; textcolor( 7 ); cout << " - Szyfrowanie pliku" << endl; textcolor( 15 ); cout << "[6]"; textcolor( 7 ); cout << " - Deszyfrowanie pliku" << endl; textcolor( 8 ); cout << "[ESC]"; textcolor( 8 ); cout << " - Wyjscie" << endl; textcolor( 7 ); }
|
|
malan |
» 2009-12-06 21:34:47 Pierwszą rzeczą, za którą powinieneś się zabrać to poprawić "algorytm (de)szyfrujący", bo ten tak trochę nie za bardzo działa :). Weź sobie kartkę i długopis, napisz: "programowanie" i zaszyfruj go (tzn. przesuń o np. +5 znaków), a potem przelej to na c++. Powinno Ci wyjść: "uwtlwfrt|fsnj". |
|
Saiph Temat założony przez niniejszego użytkownika |
» 2009-12-06 21:48:35 algorytm działa(chyba), wpisałem żeby zaszyfrował programowanie z przesunięciem o 5 i wyszło tak jak napisałeś... ale nie w tym rzecz...chodzi mi o to jak zrobić żeby nie było tych dodatkowych znaków |
|
malan |
» 2009-12-06 23:04:23 Skompilowałem kod u siebie i nadal pozostaje przy stwierdzeniu, że algorytm jest zły ;p. Zamiast plik4.read (a4,lol3); użyłem plik4.getline(a4,lol3); i dane z pliku zostały pobrane poprawnie, ale po odkodowaniu do słowa dodały się 2 znaki. Żeby nie było, że kłamie ;p: Twój kod: Podaj nazwe pliku: a.txt Podaj przesuniecie znakow: 5 Plik otwarto! Zawartosc pliku: "uwtlwfrt|fsnj!@" // !@ ?
Zdeszyfrowana zawartosc pliku: programowanie&ang90;
Po moim tuningu: Podaj nazwe pliku: a.txt Podaj przesuniecie znakow: 5 Plik otwarto! Zawartosc pliku: "uwtlwfrt|fsn"
Zdeszyfrowana zawartosc pliku: programowani &ang90;
Mam nadzieję, że czegoś nie pomieszałem :). // EDIT: dopiero teraz zauważyłem: do zmiennej lol3 trzeba dodać jeszcze 1, ponieważ ostatniej literki nie pobiera. |
|
« 1 » |