Codeproblem bei einem Verschlüsselungsprogramm
-
Dankesehr das was die Lösung.
-
Nach weiterem Programmieren bin ich wieder auf einen Fehler gestossen:
Der codierte Text soll nun dekodiert werden, es kommen aber 2 Fehlermeldungen:
1. invalid initializer (in Zeile 91)
2. incompatible types in assignment of `char' to `char[7]' (in Zeile 41)hier der Code:
#include <iostream> #include <conio.h> #include <string.h> #include <windows.h> using namespace std; FILE *file; const char a[7]="a3y0us"; const char b[7]="X793wr"; const char c[7]="kxKi77"; const char d[7]="q833t4"; const char e[7]="ik2n4R"; const char f[7]="ko31i2"; const char g[7]="s8Rz94"; const char h[7]="p31ve5"; const char i[7]="sp24n5"; const char j[7]="r46He1"; const char k[7]="A8io20"; const char l[7]="nI9383"; const char m[7]="kR9D43"; const char n[7]="ni5oLe"; const char o[7]="o82YkL"; const char p[7]="eT68pZ"; const char q[7]="y3o58R"; const char r[7]="E91kLa"; const char s[7]="K82nAw"; const char t[7]="g82oS3"; const char u[7]="fg3ku2"; const char v[7]="h4uN19"; const char w[7]="qu1R6d"; const char x[7]="yW39cE"; const char y[7]="e92sTr"; const char z[7]="cn0wH3"; const char leer[7]="gl2Uo9"; char decsend(char dec[]) { char td[7]=dec; char zeichen; if(strcmp(td, a)==0) { zeichen='a'; } return zeichen; } void decode() { char ch; char pfad[200]; char dec[7]; ask: cout << endl << "Befindet sich codefile.txt in demselben Ordner wie dieses Programm? (Y/N)" << endl << endl; cin >> ch; cout << endl << endl; if( ch == 121 || ch == 89) { file=fopen("codefile.txt", "r"); } else if( ch == 110 || ch == 78) { cout << endl << "Geben Sie den vollstaendigen Pfad der zu entschluesselnden Datei an:" << endl << endl; cin >> pfad; file=fopen(pfad, "r"); } else { cout << endl << endl << "Geben Sie bitte 'Y' oder 'N' ein." << endl << endl; system ("cls"); goto ask; } if(file==NULL) { cout << endl << "Die Datei konnte aufgrund eines Fehlers nicht geöffnet werden." << endl << endl; } else { while (fgets(dec, 7, file)!=0) { dec=decsend(dec); fputs(dec, stdout); } } } void codensave(char text) { int fail=0; if(text=='a') { fputs(a, file); } else if(text=='b') { fputs(b, file); } else if(text=='c') { fputs(c, file); } else if(text=='d') { fputs(d, file); } else if(text=='e') { fputs(e, file); } else if(text=='f') { fputs(f, file); } else if(text=='g') { fputs(g, file); } else if(text=='h') { fputs(h, file); } else if(text=='i') { fputs(i, file); } else if(text=='j') { fputs(j, file); } else if(text=='k') { fputs(k, file); } else if(text=='l') { fputs(l, file); } else if(text=='m') { fputs(m, file); } else if(text=='n') { fputs(n, file); } else if(text=='o') { fputs(o, file); } else if(text=='p') { fputs(p, file); } else if(text=='q') { fputs(q, file); } else if(text=='r') { fputs(r, file); } else if(text=='s') { fputs(s, file); } else if(text=='t') { fputs(t, file); } else if(text=='u') { fputs(u, file); } else if(text=='v') { fputs(v, file); } else if(text=='w') { fputs(w, file); } else if(text=='x') { fputs(x, file); } else if(text=='y') { fputs(y, file); } else if(text=='z') { fputs(z, file); } else if(text==' ') { fputs(leer, file); } else { fail=1; cout << endl << endl << "Geben Sie bitte ein Zeichen von A bis Z ein" << endl << endl; } if(fail!=1) { fputs("\n", file); } else { fail=0; } } void code() { char text; cout << endl << "Geben Sie hier den Text ein (esc zum Beenden): " << endl <<"\t-->"; file=fopen("codefile.txt", "w"); while(text!=27) { text=getch(); cout << text; codensave(text); } fclose(file); } int main() { int ch; ask: cout << "Was wollen sie tun?" << endl << endl << "<1> Text codieren" << endl << "<2> Text decodieren" << endl; cin >> ch; fflush(stdin); if (ch==1) { code(); } else if (ch==2) { decode(); } else { cout << endl << "Bitte geben sie '1' oder '2' ein" << endl << endl; Sleep(1000); system ("cls"); goto ask; } getch(); getch(); return 0; }
-
Du solltest dir in einem kleinen Testprogramm nochmal die unterschiede zwischen
char a; char a[7];
anschauen
zu deinem Problem:
char decsend(char dec[]) { /* folgende Zeile schlaegt fehl: Option A: du zeigst auf das erste Zeichen von dec: char *td = dec; Option B: du kopierst die Zeichenkette von dec nach td mittels strcpy Option C: du verzichtest auf td und verwendest dec direkt in strcmp */ char td[7]=dec; char zeichen; if(strcmp(td, a)==0) { zeichen='a'; } // was gibst du zurueck, wenn der Vergleich darueber fehlschlaegt? return zeichen; } /* Schau dir auch hier deinen Funktionskopf oben an. Du uebergibst ein Array bekommst aber nur ein Zeichen. Das ist inkompatible */ // falsch: char dec[7]; dec=decsend(dec); //richtig char dec[7]; char result; result=decsend(dec);
-
Danke das ver- und entschlüsseln funktioniert jetzt im groben. Nach jedem entschlüsselten und ausgegebenen Zeichen fügt sich jedoch ein Leerzeichen an. Was mache ich falsch?
der neue Programmcode:
#include <iostream> #include <conio.h> #include <string.h> #include <windows.h> using namespace std; FILE *file; const char a[7]="a3y0us"; const char b[7]="X793wr"; const char c[7]="kxKi77"; const char d[7]="q833t4"; const char e[7]="ik2n4R"; const char f[7]="ko31i2"; const char g[7]="s8Rz94"; const char h[7]="p31ve5"; const char i[7]="sp24n5"; const char j[7]="r46He1"; const char k[7]="A8io20"; const char l[7]="nI9383"; const char m[7]="kR9D43"; const char n[7]="ni5oLe"; const char o[7]="o82YkL"; const char p[7]="eT68pZ"; const char q[7]="y3o58R"; const char r[7]="E91kLa"; const char s[7]="K82nAw"; const char t[7]="g82oS3"; const char u[7]="fg3ku2"; const char v[7]="h4uN19"; const char w[7]="qu1R6d"; const char x[7]="yW39cE"; const char y[7]="e92sTr"; const char z[7]="cn0wH3"; const char leer[7]="gl2Uo9"; char decsend(char dec[]) { char zeichen; if(strcmp(dec, a)==0) { zeichen='a'; } else if(strcmp(dec, b)==0) { zeichen='b'; } else if(strcmp(dec, c)==0) { zeichen='c'; } else if(strcmp(dec, d)==0) { zeichen='d'; } else if(strcmp(dec, e)==0) { zeichen='e'; } else if(strcmp(dec, f)==0) { zeichen='f'; } else if(strcmp(dec, g)==0) { zeichen='g'; } else if(strcmp(dec, h)==0) { zeichen='h'; } else if(strcmp(dec, i)==0) { zeichen='i'; } else if(strcmp(dec, j)==0) { zeichen='j'; } else if(strcmp(dec, k)==0) { zeichen='k'; } else if(strcmp(dec, l)==0) { zeichen='l'; } else if(strcmp(dec, m)==0) { zeichen='m'; } else if(strcmp(dec, n)==0) { zeichen='n'; } else if(strcmp(dec, o)==0) { zeichen='o'; } else if(strcmp(dec, p)==0) { zeichen='p'; } else if(strcmp(dec, q)==0) { zeichen='q'; } else if(strcmp(dec, r)==0) { zeichen='r'; } else if(strcmp(dec, s)==0) { zeichen='s'; } else if(strcmp(dec, t)==0) { zeichen='t'; } else if(strcmp(dec, u)==0) { zeichen='u'; } else if(strcmp(dec, v)==0) { zeichen='v'; } else if(strcmp(dec, w)==0) { zeichen='w'; } else if(strcmp(dec, x)==0) { zeichen='x'; } else if(strcmp(dec, y)==0) { zeichen='y'; } else if(strcmp(dec, z)==0) { zeichen='z'; } else if(strcmp(dec, leer)==0) { zeichen=' '; } return zeichen; } void decode() { char ch, result; char pfad[200]; char dec[7]; ask: cout << endl << "Befindet sich codefile.txt in demselben Ordner wie dieses Programm? (Y/N)" << endl << endl; cin >> ch; cout << endl << endl; if( ch == 121 || ch == 89) { file=fopen("codefile.txt", "r"); } else if( ch == 110 || ch == 78) { cout << endl << "Geben Sie den vollstaendigen Pfad der zu entschluesselnden Datei an:" << endl << endl; cin >> pfad; file=fopen(pfad, "r"); } else { cout << endl << endl << "Geben Sie bitte 'Y' oder 'N' ein." << endl << endl; system ("cls"); goto ask; } if(file==NULL) { cout << endl << "Die Datei konnte aufgrund eines Fehlers nicht geöffnet werden." << endl << endl; } else { while (fgets(dec, 7, file)!=0) { result=decsend(dec); cout << result; } } fclose(file); } void codensave(char text) { int fail=0; if(text=='a') { fputs(a, file); } else if(text=='b') { fputs(b, file); } else if(text=='c') { fputs(c, file); } else if(text=='d') { fputs(d, file); } else if(text=='e') { fputs(e, file); } else if(text=='f') { fputs(f, file); } else if(text=='g') { fputs(g, file); } else if(text=='h') { fputs(h, file); } else if(text=='i') { fputs(i, file); } else if(text=='j') { fputs(j, file); } else if(text=='k') { fputs(k, file); } else if(text=='l') { fputs(l, file); } else if(text=='m') { fputs(m, file); } else if(text=='n') { fputs(n, file); } else if(text=='o') { fputs(o, file); } else if(text=='p') { fputs(p, file); } else if(text=='q') { fputs(q, file); } else if(text=='r') { fputs(r, file); } else if(text=='s') { fputs(s, file); } else if(text=='t') { fputs(t, file); } else if(text=='u') { fputs(u, file); } else if(text=='v') { fputs(v, file); } else if(text=='w') { fputs(w, file); } else if(text=='x') { fputs(x, file); } else if(text=='y') { fputs(y, file); } else if(text=='z') { fputs(z, file); } else if(text==' ') { fputs(leer, file); } else { fail=1; cout << endl << endl << "Geben Sie bitte ein Zeichen von A bis Z ein" << endl << endl; } if(fail!=1) { fputs("\n", file); } else { fail=0; } } void code() { char text; cout << endl << "Geben Sie hier den Text ein (esc zum Beenden): " << endl <<"\t-->"; file=fopen("codefile.txt", "w"); while(text!=27) { text=getch(); cout << text; codensave(text); } fclose(file); } int main() { int ch; ask: cout << "Was wollen sie tun?" << endl << endl << "<1> Text codieren" << endl << "<2> Text decodieren" << endl; cin >> ch; fflush(stdin); if (ch==1) { code(); } else if (ch==2) { decode(); } else { cout << endl << "Bitte geben sie '1' oder '2' ein" << endl << endl; Sleep(1000); system ("cls"); goto ask; } getch(); getch(); return 0; }
-
const char a[7]="a3y0us";
schreibt man kürzer:
const char a[]="a3y0us";
oder
char *a="a3y0us";
Besser noch, du packst die ganze Liste in ein Stringarray, z.B.
char *liste[]={ "abc","123","45", ... };
und greifst dann statt
if( text=='a' ) fputs(a,file);
zu mittels
fputs(liste[text-'a'],file);
file ist eine globale Variable, das ist ganz schlecht.
Du verwendest goto, das ist ganz schlecht.
Du verwendest:fflush(stdin);
Also irgendwie scheint es nicht möglich zu sein, den Leuten dieses auszureden.
1x pro Woche schreibt hier irgendwer sowas, scheint wohl in irgendwelchen Büchern so falsch zu stehen.
-
Was ist an globalen Variablen und an goto so schlecht?
Und was ist mit fflush(stdin)?
Was steht in irgendwelchen Büchern falsch?
-
Das ist keinen Verschlüsselung sondern nur müll. Sorry
dau
-
Und fflush(stdin); geht sehr wohl auf windows ! Weis nicht wer dir das eingeredet hat! Und das ist getestet !
Dau
-
fflush(stdout); wird wohl eher nicht gehen. Vileicht solltest du mal ein Buch lesen.
dau
-
Versuch ab Zeile 192 mal mit einem Debugger drüber zu gehen.
Sind die Leerzeichen auch schon in der Datei vorhanden?Nachdem du dann den Fehler behoben hast, wäre es durchaus angebracht, wie wutz schon meinte, einige Optimierungen vorzunehmen.
-
dau schrieb:
Das ist keinen Verschlüsselung sondern nur müll. Sorry
dau
Verschlüsselung nennt man den Vorgang, bei dem ein klar lesbarer Text (Klartext) (oder auch Informationen anderer Art, wie Ton- oder Bildaufzeichnungen) mit Hilfe eines Verschlüsselungsverfahrens (Kryptosystem) in eine „unleserliche“, das heißt nicht einfach interpretierbare Zeichenfolge (Geheimtext) umgewandelt wird.
Ist aus Wikipedia. Genaueres: http://de.wikipedia.org/wiki/Verschlüsselung
Resultat=unleserlich
BasicMan01 schrieb:
Versuch ab Zeile 192 mal mit einem Debugger drüber zu gehen.
Sind die Leerzeichen auch schon in der Datei vorhanden?Nachdem du dann den Fehler behoben hast, wäre es durchaus angebracht, wie wutz schon meinte, einige Optimierungen vorzunehmen.
Die Leerzeichen sind nicht in der Datei, das mit dem Debugger werde ich mal versuchen
-
BasicMan01 schrieb:
Versuch ab Zeile 192 mal mit einem Debugger drüber zu gehen.
Sind die Leerzeichen auch schon in der Datei vorhanden?Nachdem du dann den Fehler behoben hast, wäre es durchaus angebracht, wie wutz schon meinte, einige Optimierungen vorzunehmen.
Ich habe jetzt den debugger angewendet und bemerkt, dass die Variable "result" jeden zweiten Schleifendurchlauf den Wert "-1" annimmt (entspricht wie auch der Wert "152" dem Zeichen 'ÿ
'). Nach langem herumprobieren habe ich jetzt einfach diese Zeilen dazugefügt:if(result==-1) cout << "\b";
-
Die Lösung find ich nicht so toll Das löst für dich vielleicht erstmal das Problem, aber die Ursache ist damit noch nicht geklärt.
Kann es sein, dass in der Funktion "decsend" zeichen als ungesetzter Wert zurückgegeben wird, weil keiner der Vergleiche positiv ist?
-
Verschlüsselung nennt man den Vorgang, bei dem ein klar lesbarer Text (Klartext) (oder auch Informationen anderer Art, wie Ton- oder Bildaufzeichnungen) mit Hilfe eines Verschlüsselungsverfahrens (Kryptosystem) in eine „unleserliche“, das heißt nicht einfach interpretierbare Zeichenfolge (Geheimtext) umgewandelt wird.
Ist aus Wikipedia. Genaueres: http://de.wikipedia.org/wiki/Verschlüsselung
Müll bleibt Müll !
1 Sekunde und dein Cryptosystem ist gebrochen !
dau
-
Verschlüsselung nennt man den Vorgang, bei dem ein klar lesbarer Text (Klartext) (oder auch Informationen anderer Art, wie Ton- oder Bildaufzeichnungen) mit Hilfe eines Verschlüsselungsverfahrens (Kryptosystem) in eine „unleserliche“, das heißt nicht einfach interpretierbare Zeichenfolge (Geheimtext) umgewandelt wird. Als entscheidend wichtige Parameter der Verschlüsselung werden hierbei ein oder auch mehrere Schlüssel verwendet.
-
dau schrieb:
Und fflush(stdin); geht sehr wohl auf windows ! Weis nicht wer dir das eingeredet hat! Und das ist getestet !
Dau
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html
Es ist undefiniert und deine Aussage damit einfach schwachsinnig und falsch. Wer sich auf undefiniertes Verhalten verlässt ist einfach als Programmierer nicht geeignet.
-
uiuiu schrieb:
Verschlüsselung nennt man den Vorgang, bei dem ein klar lesbarer Text (Klartext) (oder auch Informationen anderer Art, wie Ton- oder Bildaufzeichnungen) mit Hilfe eines Verschlüsselungsverfahrens (Kryptosystem) in eine „unleserliche“, das heißt nicht einfach interpretierbare Zeichenfolge (Geheimtext) umgewandelt wird. Als entscheidend wichtige Parameter der Verschlüsselung werden hierbei ein oder auch mehrere Schlüssel verwendet.
und...?
-
Nimm ein Algorithus wie aes/blowfish/3des/serpent ,oder sonnst ein angesehener Algorithmus. Ansonnsten ist dein Ciphertext leicht zu brechen.
Das was du da machst, hat heute nichts mehr mit Verschlüsselung zu tun. Ausserdem ist dein source-code echt lustig.
Dau
-
hi
@uiui
Wir sprechen hier von Windows und nicht ansi c !!
Dau
-
BasicMan01 schrieb:
Die Lösung find ich nicht so toll Das löst für dich vielleicht erstmal das Problem, aber die Ursache ist damit noch nicht geklärt.
Kann es sein, dass in der Funktion "decsend" zeichen als ungesetzter Wert zurückgegeben wird, weil keiner der Vergleiche positiv ist?
Du hast recht die Variable "zeichen" wird jedes 2. Mal als irgendein wert zurückgegeben weil die Variable "dec" jedes 2. Mal das Zeichen "\n" ist.
Ich habe jetzt diesen Code in die Funktion "decsend" zu den Anderen Vergleichen dazugetan:else if(strcmp(dec, "\n")==0) { zeichen=-1; }