Crypto Algo Absturz
-
Hallo,
evtl kann mir ja jemand helfen ist jetzt 3:21 muss morgen raus *g*
hab ein paar probleme ich vermute das die sbox Funktion irgendwie überläuft.
sehe vor lauter Code nichts mehr.
habe die ganze Sache hier mal provisorisch aufgebaut
Gruß tom.#include <stdlib.h> #include <stdio.h> #include <string.h> #include <fstream.h> #define PASSLEN 60 //beide bei 70 wegen schleife 0 #define STRINGLEN 60 unsigned char key[60]; //71 byte haben platz //--------------------------------------------------------------------------- void sbox(char *box); void crypt(unsigned char *passwort, unsigned char *string, int stringlen); void fullstring(unsigned char *string); //--------------------------------------------------------------------------- int main() { fstream keyfile("key.txt", ios::in|ios::out|ios::binary ); keyfile.getline(key,61); //schlussel laden keyfile.close(); int stringlen = 0; sbox(key); unsigned char test[STRINGLEN]; stringlen = strlen(test); strcpy(test, "hallo lalelo 123"); fullstring(test); crypt(key, test, STRINGLEN); //entschlusseln fstream keyfile2("key.txt", ios::in|ios::out|ios::binary ); keyfile2.getline(key,61); //schlussel laden keyfile2.close(); sbox(key); crypt(key, test, STRINGLEN); cout << "Entschlusselt :" << test; return 0; } void sbox(char *box) { int posB; //posB position fur B int round = 65; //zudruchlaufende runden int i; //schleifen durchlauf int rest; //restwert modulus nur temp char a, b; //zuaddierende zeichen for(int counter = 0; counter <= PASSLEN; counter ++)//lese erstes zeichen { a = box[counter]; //sichere zeichen posB = box[counter]; //wert in dezimal wandeln //posB += 1; //null byte irgendwie vermeiden rest = posB % PASSLEN; //restwert ermitteln posB = rest; //restwert ist position im string for(i = 1; i <= round; i++) //jedes zeichen wird 64 verschluselungen durchfuhren { b = box[posB]; //position b speichern box[posB] ^= a; //positon b mit a verschlusseln posB = b; //wert b in dezimal wandeln //posB += 1; //null byte irgendwie vermeiden rest = posB % PASSLEN; //restwert ermitteln posB = rest; //restwert ist neue position von b im string } } } void crypt(unsigned char *passwort, unsigned char *string, int stringlen) { if( stringlen <= 0 ) return; // Wenn <= 0 Function beenden int curpasscharpos = 0; // Aktuelle Position im Passwort damit wir wissen mit welchen Zeichen wir verschlüsseln for( int i = 0; i < stringlen; i++){ // solange durchlaufen bis jedes Zeichen des Strings verschlüsselt wurde string[i] ^= passwort[curpasscharpos]; // xor if( ++curpasscharpos >= PASSLEN ) // erhöhen der Position im Passwort und wenn die > als die länge dessen ist curpasscharpos = 0; // fangen wir wieder vorn an } } void fullstring(unsigned char *string) { int stringlen = strlen(string); //lange des strings int miss = PASSLEN - stringlen; for( int i = 0; i <= miss; i++) { strcat(string, "_"); } }
-
ohne es genau anzuschauen würde ich hier auf das <= tippen
for(int counter = 0; counter <= PASSLEN; counter ++)
-
genau:
for(int counter = 0; counter <= PASSLEN; counter ++)Druch das "<=" greifst du auf den Index 60 von "box" zu! Indexarea out of bounce! mach ein "<" draus
-
Nur mal am Rande:
kronos33 schrieb:
#define PASSLEN 60 //beide bei 70 wegen schleife 0 #define STRINGLEN 60 unsigned char key[60]; //71 byte haben platz }Hast du mal darüber nachgedacht, wie weit deine Kommentare noch zum Quelltext passen?
(außerdem solltest du beim Umgang mit C-Strings daran denken, immer ein Byte extra für den Null-Terminator bereitzustellen)