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)


Anmelden zum Antworten