Bitte zeigt mir meinen Fehler!!!

Dieses Thema im Forum "C/C++" wurde erstellt von Yellow, 14.12.2007.

  1. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Guten abend liebe Community!

    Ich beschäftige mich zur Zeit mit dem Thema Kryptographie. Nun habe ich mich mal mit der Caesar Chiffre auseinander gesetzt und versucht einen Brauchbaren Code zu generieren.

    Nun zu meinem Problem:

    Ich habe das gleiche Programm wie unten angegeben mit einem Cipher von meinem Namen ausprobiert. Und es konnte mit dem Algorithmus decheffriert werden. Doch wenn ich einen längeren Cipher eingebe, dann sagt der mir

    "SPEICHERZUGRIFFSVERLETZUNG!"

    Ich bitte euch mir da meinen Fehler zu zeige. Ich hänge da von den ganzen Tag an diesem einen Problem und wäre euch super dankbar! Ach auch wenn ihr Verbesserungsvorschläge habt bin ich gerne offen mir diese anzuhören!

    Lieber grüße und danke erstmal an alle die sich damit beschäftigen

    Yellow

    PHP:
    /* Ceasar du Hund :D */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    /* MOD ist die Anzahl der Gesamten Zeichen der Schlüsseltabelle */
    #define MOD 32

    const charcipher[] = { "tqjhowtdm,uywafm_fm" };
    const 
    charplain[] = { "t","q","j","h","o","w","t","d","m",",","u","y","w","a","f","m","_","f","m" };

    int main(int argcchar **argv) {
        
    int i,k,c=0,index[MOD];
        static 
    int x=0;

        
    /* Initialisieren vom index */
        
    for(i=0;i<MOD;i++)
            
    index[i] = i;

        
    charmatrix[] = { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",".",",","-","_","+","#" };

        
    /* Brutenforce des mit dem Schlüssel k */
        
    for(k=1;k<MOD;k++) {
            
    /* Solange durchlaufen bis alle Zeichen im Cipher durch sind */
            
    for(x=0;x<20;x++) {
                
    /* Ermitteln der Zahl des cipher Zeichens */
                
    for(i=0;i<MOD;i++) {
                    
    /* cipher[x] solange mit matrix[i] vergleichen bis das Cipher Zeichen vorkommt */
                    
    if(strcmp(cipher[x],matrix[i]) == 0) {
                        
    /* Entschlüsseln des ciphers */
                        
    index[i] - k;

                        if(
    c<0) { /* Wenn c kleiner als 0 ist, dann muß er c + MOD nehmen. */
                            
    += MOD;
                            
    printf("%s",matrix[c]);
                        }
                        else
                        { 
    /* Wenn c nicht gleich 0 ist, dann soll er nur matrix[mit x Zeichen] ausgeben! */
                            
    printf("%s",matrix[c]);
                        }
                    }
                }
                
    /* Ist i = MOD dann KEY mitteilen und eine neue Zeile */
                
    if(x==19) {
                    
    printf("\tKEY: %i\n",k);
                }
            }
        }

        
    printf("\n"); // Abschließende weitere Zeile!
        
    return 0;
    }
    :hilfe2: -> :think: -> :hilfe2: -> :think: -> :(
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 ew_wolf, 14.12.2007
    ew_wolf

    ew_wolf Tripel-As

    Dabei seit:
    02.06.2006
    Beiträge:
    157
    Zustimmungen:
    0
    Hast du bedacht, dass dein Code nur einen Chiphre von maximal 20 Zeichen bearbeiten kann?
     
  4. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Naja der Cipher besteht aus 19 Zeichen. Und die Schleife läuft dann auch nur bis 19!

    Was dann zur nächsten Zeile führen müßte!
     
  5. #4 ew_wolf, 14.12.2007
    ew_wolf

    ew_wolf Tripel-As

    Dabei seit:
    02.06.2006
    Beiträge:
    157
    Zustimmungen:
    0
    Ich wollte nur sicherstellen, dass dein verschlüsseltes Wort nciht mehr als 19 Zeichen hat. Wie du sicher weißt, wäre dein Code dann nicht ganz richtig.

    Ich schau mir mal deinen Code genauer an und werde mal versuchen deine Gedanken nachzuvollziehen. Im Moment sind mir ein Paar deiner Code-Zeilen zuspekt. Ich hoffe ich finde deinen Fehler. Auf alle Fälle scheint an einer Stelle eine Probelm mit dem Zugriff auf ein Element eines Objektes vorzu liegen. Ein Beispiel wäre, dass auf ein Element außerhalb des Arreys zugegriffen werden soll. Prüf dies auch mal nach. Mir ist klarr, dass du zeimlich viel Bildschirmlogs einstelen solltest.
    Poste auch mal den funktionierenden und nicht funktionierenen Chiphre.
     
  6. #5 Yellow, 14.12.2007
    Zuletzt bearbeitet: 14.12.2007
    Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Also erstmal danke das du dich damit beschäftigst. Und ok werde dir/euch den Funktionierenden Code auch mal Posten!

    Hier der Code der Funktioniert:
    PHP:
    /* Ceasar du Hund :D */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    /* MOD ist die Anzahl der Gesamten Zeichen der Schlüsseltabelle */
    #define MOD 32

    const charcipher[] = { "ufywnhp" };
    const 
    charplain[] = { "u","f","y","w","n","h","p" };

    int main(int argcchar **argv) {
        
    int i,k,c=0,index[MOD];
        static 
    int x=0;

        
    /* Initialisieren vom index */
        
    for(i=0;i<MOD;i++)
            
    index[i] = i;

        
    charkey[1000];

        
    charmatrix[] = { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",".",",","-","_","+","#" };

        
    /* Brutenforce des mit dem Schlüssel k */
        
    for(k=1;k<MOD;k++) {
            
    /* Solange durchlaufen bis alle Zeichen im Cipher durch sind */
            
    for(x=0;x<8;x++) {
                
    /* Ermitteln der Zahl des cipher Zeichens */
                
    for(i=0;i<MOD;i++) {
                    
    /* cipher[x] solange mit matrix[i] vergleichen bis das Cipher Zeichen vorkommt */
                    
    if(strcmp(cipher[x],matrix[i]) == 0) {
                        
    /* Entschlüsseln des ciphers */
                        
    index[i] - k;

                        if(
    c<0) { // ist c kleiner als 0 dann plus MOD
                            
    += MOD;
                            
    printf("%s",matrix[c]);
                        }
                        else
                        {
                            
    printf("%s",matrix[c]);
                        }
                    }
                }
                
    /* Ist i = MOD dann neue Zeile */
                
    if(x==7) {
                    
    printf("\tKEY: %i\n",k);
                }
            }
        }

        
    printf("\n"); // Abschließende weitere Zeile!
        
    return 0;
    }
    Das seltsahme hier ist das wenn ich den plain[] entfehrne, dann geht es auch nicht mehr. Obwohl der eigentlich nirgends verwendet wird! ???

    [DA ICH IM I-CAFE BIN WERDE ICH MORGEN SCHAUEN OB DIR WAS AUFGEFALLEN IST! DANKE WIE GESAGT NOCHMAL ;)]
     
  7. #6 ew_wolf, 14.12.2007
    ew_wolf

    ew_wolf Tripel-As

    Dabei seit:
    02.06.2006
    Beiträge:
    157
    Zustimmungen:
    0
    Ich hab mal ne ganze Reihe "printf" eingefügt.

    Code:
    /* Ceasar du Hund :D */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /* MOD ist die Anzahl der Gesamten Zeichen der Schlüsseltabelle */
    #define MOD 32
    
    const char* cipher[] = { "tqjhowtdm,uywafm_fm" };
    const char* plain[] = { "t","q","j","h","o","w","t","d","m",",","u","y","w","a","f","m","_","f","m" };
    
    int main(int argc, char **argv) {
        int i=0,k=1,c=0,index[MOD];
        int x=0;
    
        /* Initialisieren vom index */
        for(i=0;i<MOD;i++)
            index[i] = i;
    
        char* matrix[] = { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z",".",",","-","_","+","#" };
    
        /* Brutenforce des mit dem Schlüssel k */
        for(k=1;k<MOD;k++) {
            /* Solange durchlaufen bis alle Zeichen im Cipher durch sind */
    		printf("k=%i\t",k);
    		for(x=0;x<20;x++) {
                /* Ermitteln der Zahl des cipher Zeichens */
    			printf("x = %i\t",x);
                for(i=0;i<MOD;i++) {
                    /* cipher[x] solange mit matrix[i] vergleichen bis das Cipher Zeichen vorkommt */
                    printf("i= %i\n",i);
    				if(cipher[x]== matrix[i]) {
                        /* Entschlüsseln des ciphers */
                        printf("index[%i]= %i\n", i, index[i]);
    					printf("In 1.IF: k= %i, Vorher ist c: %i\t", k, c);
    					c = index[i] - k;
    					printf("In 1.IF: k= %i, Nachher ist c: %i\n", k, c);
    					if(c<0) { /* Wenn c kleiner als 0 ist, dann muß er c + MOD nehmen. */
    						printf("in 2. IF: Vorher ist c: %i\t", c);
    						c += MOD;
    						printf("in 2. IF: Nachher ist c: %s\n", c);
                            printf("matrix[%i] = %s\n",c,matrix[c]);
                        }
                        else
                        { /* Wenn c nicht gleich 0 ist, dann soll er nur matrix[mit x Zeichen] ausgeben! */
    						printf("Else matrix[%i] = %s",c,matrix[c]);
                        }
                    }
                }
                /* Ist i = MOD dann KEY mitteilen und eine neue Zeile */
                if(x==19) {
                    printf("\tKEY: %i\n",k);
                }
            }
        }
    
        printf("\n"); // Abschließende weitere Zeile!
        return 0;
    }  
    
    Dabei ist mir aufgefallen, das die Anweisung
    Code:
    c+=MOD
    einen Fehler verursacht. Sobald der Wert "c" auf "-1" springt. Mir scheint in diesem Fall ist dein Algorythmus fehlerhaft.
    Erkläre mir mal bitte was du mit dieser Zeile bezwecken möchtest?
    (PS: ich tuhe mir immer schwer mit den Anwisungen c+=MOD bzw. c=+MOD)
     
  8. #7 bytepool, 14.12.2007
    Zuletzt bearbeitet: 14.12.2007
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    hi,

    hast du es denn mal mit einem debugger wie gdb versucht? Dann haettest du naemlich direkt schonmal gewusst, dass der Fehler in der Funktion strcmp auftaucht...

    Ok, 2 Fehler die mir auffallen:

    1.
    Code:
    const char* cipher[] = { "ufywnhp" };
    
    ist ein Pointer auf einen Pointer auf eine Zeichenkette.

    Und deswegen vergleichst du in dieser Zeile hier
    Code:
    if(strcmp(cipher[x],matrix[i]) == 0) { 
    
    diese Strings: "ufywnhp" und "a" im ersten Durchlauf. Diese Bedingung kann logischerweise nie wahr werden.

    <edit>
    Und schon beim zweiten Durchlauf zeigt cipher[1] ins Leere, daher der Segmentation Fault.
    </edit>

    Was du hier willst ist:
    Code:
    if(strcmp(plain[x],matrix[i]) == 0) { 
    

    Und zweitens, indexing beginnt in C bei 0. D.h.
    Code:
    for(x=0;x<8;x++)
    
    ist auch falsch, das muss natuerlich eine 7 sein. Im uebrigen solltest du in solchen Faellen auch keine magic numbers (konstanten) wie 8 benutzen, sondern die laenge des Strings minus 1 oder so. Ich glaube die Funktion in C dafuer waere strlen(), aber ich bin auch nicht so der C Kenner, koennte auch was anderes sein.

    Wenn du diese 2 Fehler berichtigst, sollte das ganze laufen.

    edit:
    Und ich kann dir die Benutzung eines Debuggers wirklich nur sehr empfehlen, es dauert vielleicht ein bisschen bis man den Umgang mit dem Debugger gelernt hat, aber das zahlt sich beim debuggen sehr schnell wieder aus, man findet solche Fehler wesentlich schneller, bzw. man findet Fehler die man sonst wohlmoeglich gar nicht finden wuerde...
    Ich kann mir programmieren ohne vernuenftigen Debugger kaum noch vorstellen ;)

    mfg,
    bytepool
     
  9. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  10. #8 Yellow, 15.12.2007
    Zuletzt bearbeitet: 15.12.2007
    Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    Also erstmal ein Dickes Danke an euch zwei. Ich muß mir jetzt eure Posts erstmal ganz genau durch lesen und abarbeiten^^. Ist ja leider wie ihr selber gemerkt habt nichts was man mal schnell in 2 Min kann :)

    Also ich danke euch jetzt erstmal mit einem Dicken THX und werde mir das mal ausdrucken und zuhause in ruhe mit einem Kaffee unter der Adventskerze mal genauer durchlesen ;)

    Nach dem WE werde ich euch melden ob ich es hinbekommen habe ;)

    Danke und schönes WE wünsche ich euch allen!

    [EDIT]
    @ed_wolf: Hätte ich doch deine Frage fast vergessen :) . Die Formel um den Caesar Chiffre zu cheffrieren wäre:

    c[cipher] = p + s[schlüssel] mod m[anzahl der Zeichen]

    also Zeichen a mit 0 wäre dann Verschlüsselt mit Schlüssel 13 = 13 und 13 entspricht dann dem Zeichen n.

    die Formel mit dem c+=MOD würde dann folgendes heisen:

    wenn c[cipher] - s[schlüssel] einen negativien Wert ausgibt, dann soll dieser mit der Anzahl der Zeichen Addiert werden. Und somit müste ich auf das Plain kommen!

    Ich hoffe das ich diese Formel richtig gerafft habe .... :) ... sonst wäre mein Algorithmus im Eimer :)
     
  11. Yellow

    Yellow Doppel-As

    Dabei seit:
    04.06.2007
    Beiträge:
    149
    Zustimmungen:
    0
    Ort:
    Bad Arolsen
    ...so habe die Änderungen durchgeführt und es funktioniert.

    Danke nochmal an euch zwei und euch allen noch ein Frohes Weihnachtsfest!
     
Thema:

Bitte zeigt mir meinen Fehler!!!

Die Seite wird geladen...

Bitte zeigt mir meinen Fehler!!! - Ähnliche Themen

  1. Artikel: OpenBSD - Einmal Kugelfisch, bitte

    Artikel: OpenBSD - Einmal Kugelfisch, bitte: OpenBSD legt als Teil der BSD-Familie seinen Fokus auf Sicherheit und Korrektheit. Dementsprechend hält es für Linux-Nutzer einige interessante...
  2. XFCE schon wieder zerstört erbitte Hilfe

    XFCE schon wieder zerstört erbitte Hilfe: Schon wieder mal habe ich irgendwie xfce kaputt gemacht. 3 Stunden klicken und suchen im www jetzt geht es wieder einigermassen. Wie kann...
  3. bitte um hilfe bei: Logdatei mit "sed" anpassen

    bitte um hilfe bei: Logdatei mit "sed" anpassen: Hallo zusammen, ich möchte gerne in eine vorhandene Logdatei mit nachfolgendem code anpassen. echo " Bitte nun Hostnamen des Servers...
  4. Install wer kann mir das bitte erklären unter Linux

    Install wer kann mir das bitte erklären unter Linux: Bin immer noch auf Kriegsfuss mit dem Neuinstallieren von Programmen. sudo apt-get install audacity und wenn das klappt, dann ist es ok....
  5. Bitte um Hilfe beim schreiben eines GREP-Scripts

    Bitte um Hilfe beim schreiben eines GREP-Scripts: Hallo, Ich habe als Hausaufgabe ein Script entwickelt, dies funkitoniert auch, nun soll ich als Zusatzaufgabe das machen: Idealerweise...