Bitte zeigt mir meinen Fehler!!!

Yellow

Yellow

Doppel-As
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 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,k,c=0,index[MOD];
	static 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 */
		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 */
					c = index[i] - k;

					if(c<0) { /* Wenn c kleiner als 0 ist, dann muß er c + MOD nehmen. */
						c += 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: -> :(
 
ew_wolf

ew_wolf

Tripel-As
Hast du bedacht, dass dein Code nur einen Chiphre von maximal 20 Zeichen bearbeiten kann?
 
Yellow

Yellow

Doppel-As
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!
 
ew_wolf

ew_wolf

Tripel-As
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!

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.
 
Yellow

Yellow

Doppel-As
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 char* cipher[] = { "ufywnhp" };
const char* plain[] = { "u","f","y","w","n","h","p" };

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

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

	char* key[1000];

	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 */
		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 */
					c = index[i] - k;

					if(c<0) { // ist c kleiner als 0 dann plus MOD
						c += 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 ;)]
 
Zuletzt bearbeitet:
ew_wolf

ew_wolf

Tripel-As
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)
 
bytepool

bytepool

Code Monkey
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
 
Zuletzt bearbeitet:
Yellow

Yellow

Doppel-As
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 :)
 
Zuletzt bearbeitet:
Yellow

Yellow

Doppel-As
...so habe die Änderungen durchgeführt und es funktioniert.

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

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

ip6tables Problem

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Prozesskommunikation mit PIPES - wie funktioniert das?

Oben