Einfache verschlüsselung funktioniert nicht!
-
Ich habe die folgende einfache verschlüsselung geschrieben. Es ist nur eine art test, ich weiss, dass sie nicht sicher ist. Das problem ist, das bei der entschlüsselung immer nur die ersten 4-5 zeichen entschlüsselt werden, der rest aber nicht! Wieso ist das so!?
Die verschlüsselung funktioniert so:
Ein passwort wird eingelesen, als string. die einzelnen buchstaben werden dann als ASCII werte in ein int array geschrieben. bei der eigentlichen verschlüsselung wird dann aus einer datei ein buchstabe eingelesn und mit der esten stelle des schlüssels addiert. der nächste buchstabe mit der zweiten stelle, der dritte mit der vierten und so weiter, bis der schlüssel zu ende ist, dann wird von vorne angefangen.
Hier der code:
#include <iostream> #include <cstdio> #include <fstream> #include <string> #include <cstdlib> using namespace std; void ver(string, string, string); void ent(string, string, string); int main() { string eingabe; int auswahl; string Ein; string Aus; string passwort; system("cls"); cout<<"\t\t\tWillkommen zu Krypt++ 3.0 !!!"<<endl<<endl; cout<<" Was moechten sie tun?"<<endl<<endl; cout<<" [1] Datei verschluesseln"<<endl; cout<<" [2] Datei entschluesseln"<<endl; cout<<" [3] Programm beenden"<<endl; cout<<endl<<" Aktion: "; cin>>eingabe; auswahl=atoi(eingabe.c_str()); switch(auswahl) { case 1: system("cls"); cout<<"Bitte die zu verschluesselnde Datei angeben: "; cin>>Ein; cout<<"Bitte die Ausgabedatei angeben: "; cin>>Aus; cout<<"Bitte Passwort eingeben: "; cin>>passwort; ver(Ein, Aus, passwort); cout<<"Verschluesselung abgeschlossen"<<endl; getchar(); main(); break; case 2: system("cls"); cout<<"Bitte die zu verschluesselnde Datei angeben: "; cin>>Ein; cout<<"Bitte die Ausgabedatei angeben: "; cin>>Aus; cout<<"Bitte Passwort eingeben: "; cin>>passwort; ent(Ein, Aus, passwort); cout<<"Entschluesselung abgeschlossen"<<endl; getchar(); main(); break; case 3: cout<<"Auf wiedersehen!"<<endl; break; default: system("cls"); cout<<"\aFalsche Eingabe"<<endl; getchar(); main(); } } void ver(string Ein, string Aus, string passwort) { int i=0; char ch; int a; int laenge=strlen(passwort.c_str()); int schluessel[laenge]; while(i<laenge) { schluessel[i]=passwort[i]; i++; } ifstream in(Ein.c_str()); ofstream out(Aus.c_str()); i=0; while(in.get(ch)) { if(i == laenge) { i=0; } else { a=ch; a=a+schluessel[i]; ch=a; out<<ch; i++; } } } void ent(string Ein, string Aus, string passwort) { int i=0; char ch; int a; int laenge=strlen(passwort.c_str()); int schluessel[laenge]; while(i<laenge) { schluessel[i]=passwort[i]; i++; } ifstream in(Ein.c_str()); ofstream out(Aus.c_str()); i=0; while(in.get(ch)) { if(i == laenge) { i=0; } else { a=ch; a=a-schluessel[i]; ch=a; out<<ch; i++; } } }
Vielen dank schonmal für alle antworten!
-
Wenn i == laenge ist, verarbeitest du das eingelesene Zeichen nicht.
-
Vielen Dank!!! Jetzt funktioniert es!!!
-
So. nun funktioniert das alles zwar optimal, und ich hab die verschlüsselung auch noch etwas erweitert um sie evtl. etwas sicherer zu machen, aber mir ist aufgefallen das beim ersten buchstaben der datei immer der tatsächliche ASCII wert gespeichert wird, was ich mir nicht erklären kannn! (Ich speichere nicht mehr als zeichen sondern jetzt als zahl) Hier der neue Code:
#include <iostream> #include <cstdio> #include <fstream> #include <string> #include <cstdlib> using namespace std; void ver(string, string, string); void ent(string, string, string); int main() { string eingabe; int auswahl; string Ein; string Aus; string passwort; system("cls"); cout<<"\t\t\tWillkommen zu Krypt++ 3.0 !!!"<<endl<<endl; cout<<" Was moechten sie tun?"<<endl<<endl; cout<<" [1] Datei verschluesseln"<<endl; cout<<" [2] Datei entschluesseln"<<endl; cout<<" [3] Programm beenden"<<endl; cout<<endl<<" Aktion: "; cin>>eingabe; auswahl=atoi(eingabe.c_str()); switch(auswahl) { case 1: system("cls"); cout<<"Bitte die zu verschluesselnde Datei angeben: "; cin>>Ein; cout<<"Bitte die Ausgabedatei angeben: "; cin>>Aus; cout<<"Bitte Passwort eingeben: "; cin>>passwort; ver(Ein, Aus, passwort); cout<<"Verschluesselung abgeschlossen"<<endl; getchar(); main(); break; case 2: system("cls"); cout<<"Bitte die zu verschluesselnde Datei angeben: "; cin>>Ein; cout<<"Bitte die Ausgabedatei angeben: "; cin>>Aus; cout<<"Bitte Passwort eingeben: "; cin>>passwort; ent(Ein, Aus, passwort); cout<<"Entschluesselung abgeschlossen"<<endl; getchar(); main(); break; case 3: cout<<"Auf wiedersehen!"<<endl; break; default: system("cls"); cout<<"\aFalsche Eingabe"<<endl; getchar(); main(); } } void ver(string Ein, string Aus, string passwort) { int i=0; char ch; int a; int laenge=strlen(passwort.c_str()); int schluessel[laenge]; while(i<laenge) { schluessel[i]=passwort[i]*(laenge+i*i); i++; } ifstream in(Ein.c_str()); ofstream out(Aus.c_str()); i=0; while(in.get(ch)) { if(i == laenge) { i=0; goto verschluesseln; } else { verschluesseln: a=ch; a=a+schluessel[i]*(i*laenge); ch=a; out<<a<<" "; i++; } } } void ent(string Ein, string Aus, string passwort) { int i=0; char ch; int a; int laenge=strlen(passwort.c_str()); int schluessel[laenge]; while(i<laenge) { schluessel[i]=passwort[i]*(laenge+i*i); i++; } ifstream in(Ein.c_str()); ofstream out(Aus.c_str()); i=0; while(in>>a) { if(i == laenge) { i=0; goto entschluesseln; } else { entschluesseln: a=a-schluessel[i]*(i*laenge); ch=a; out<<ch; i++; } } }
Danke schonmal!
-
Diese goto-Lösung ist mMn hässlich und dazu noch völlig unnötig:
if(i == laenge) { i=0; } a=ch; a=a+schluessel[i]*(i*laenge); ch=a; out<<a<<" "; i++;
Was dein Problem angeht: Du addierst zu a eine Zahl, die den Faktor i enthält. Wenn i Null ist...
-
Argh stimmt, Danke!!! Ich bin so dumm...egal
und zum goto:
Ich finde (speziell hier) die lösung mit dem goto übersichtlicher und einfacher als das alles jetzt nochma in irgendwelche schleifen zu packen oder sonstwas! Schliesslich gibts dadurch keine nachteile und die übersichtlichkeit leidet ja nich, weil die das label und das goto überhauptnicht weit voneinander weg oder so sind und weils auch das einzige im code ist...aber egal, ich sag immer: Jeder wie er will...
-
Krypter schrieb:
und zum goto:
Ich finde (speziell hier) die lösung mit dem goto übersichtlicher und einfacher als das alles jetzt nochma in irgendwelche schleifen zu packen oder sonstwas!
Du brauchst hier keine zusätzlichen Kontrollstrukturen, um ohne goto auszukommen. Du kannst sogar etwas weglassen.
Die folgenden Codeausschnitte bewirken das gleiche:
if(Bedingung) { tue_dieses(); goto label; } else { label: tue_jenes(); }
if(Bedingung) { tue_dieses(); } tue_jenes();
So viel zur Übersichtlichkeit
-
Hm ok, das stimmt. Aber trotzdem finde ich die goto lösung in diesem Fall nicht so schlimm. Sicher, ein Code kann durch sowas schnell wirr werden, aber in diesem fall ist das ja nicht so. Ich werds ändern, Ich hab halt nur den felher gesehen und das goto war ne schnelle lösung....bin ja auch noch anfänger ^^