Codeproblem bei einem Verschlüsselungsprogramm



  • Liebe Community,

    Ich programmiere seit einiger Zeit in C und bin or kurzem auf C++ umgestiegen.
    Jetzt habe ich ein Programm geschrieben welches einen Text einlesen und verschlüsseln soll.
    Die Idee: 1. Der Text wird zeichenweise eingelesen.
    2. Jedes Zeichen wird sofort nachdem es eingetippt wurde mit einem Buchstaben aus dem Alphabet verglichen (vorest nur Kleinbuchstaben).
    3. Für jedes Zeichen ist ein Code aus Buchstaben und Zahlen vordefiniert.
    4.Der entsprechende Code wirt in einer Textdatei zeilenweise abgespeichert.

    z.B.: ich gebe das Zeichen 'a' ein, welches sfort auf dem Bildschirm ausgegeben wird (wegen der besseren Übersicht), danach mit Buchstaben verglichen wird und schliesslich sofort als unleserlicher code in einer Zeile abgespeichert wird. Danach kommt das nächste Zeichen dran. Die Zeichen sollten alle sofort und ohne der Eingabetaste geschrieben geschrieben und verschlüsselt werden (deswegen verwende ich den Befehl "getch()").

    An der Entschlüsselung arbeite ich erst später.

    jetzt habe ich aber ein Problem bei dem Vergleih von dem eingegebenen Zeichen und den Buchstaben aus dem Alphabet (ich verwende "strcmp()"):
    Jedesmal beim Compilieren kommen 2 Fehlermeldungen:
    1. error: invalid conversion from `char' to `const char*'
    2. initializing argument 1 of `int strcmp(const char*, const char*)'

    Leider habe ich keine Ahnung wie diese Fehler zu beheben sind.

    Hier der Code:

    #include <iostream>
    #include <conio.h>
    #include <string.h>
    
    FILE *file;
    
    using namespace std;
    
    void codensave(char text)
    {
        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";
    
        file=fopen("savefile.txt", "w");
    
        if(strcmp(text, "a")==0)
        {
            fputs(a, file);
        }
    
    }
    
    int main()
    {
        char text;
    
        cout << "Geben Sie hier den Text ein (esc zum Beenden): " << endl <<"\t-->" << endl;
    
        while(text!=27)
        {
            text=getch();
            cout << text;
            codensave(text);
        }
    
        return 0;
    }
    

    PS: Ich verwenden den GNU GCC Compiler, Codeblocks 8.02 und habe Windows XP Home Edition mit SP 3.
    Ausserdem will ich alle Zeichen vorerst nur mit dem Buchstaben 'a' vergleichen.

    Vielen Dank an Alle im Voraus.



  • strcmp arbeitet mit Zeichenketten.
    Du hast als 1. Argument allerdings mit text nur ein einzelnes Zeichen.

    Da du hier sowieso nur ein Zeichen miteinander vergleichen möchtest, kannst du auf strcmp gleich verzichten und es direkt machen.

    if(text == 'a')
    {
        //tu was oder auch nicht
    }
    


  • 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 😃


Anmelden zum Antworten