Crypto Algo Decode



  • Hallo, hatte vor einiger zeit schon einmal ähnliches gepostet ..
    der Alge arbeitet mit 2 boxen nun habe ich das Problem das das verschlüsseln
    wunder bar funktioniert soweit ich das sehen kann,
    nur das entschlüsseln bereitet Probleme die ersten 71 Byte der Datei werden wunderbar entschlüsselt, nur alle folgenden erweisen sich als Datenschrott .
    das einzige was ich mir erklären könnte ist das ich nach den ersten 71 Byte immer X versetzte einlese. oder die sbox Funktion zufällige Daten aus den Speicher mit einbringt .

    Verschlüsseln

    strcpy(text, "HalloHalloHalloHalloHallo");
    sbox(key);
    crypt(key, text);
    daten.write(text, 71);
    

    Entschlüsseln

    while (!daten.eof())
        {
        i++;
        daten.read(daten, 71); //einlesen
        sbox(key);                      //key generieren
        debug("key", key);
        debug2("daten", daten);
        crypt(key,daten);                //id mit key entschlusseln
        cout << "AUSGABE " << i << ":" << daten  << endl;    // Zeige sie auf dem Bildschirm
    
        }
    

    crypt.h

    #define PASSLEN 70              //beide bei 70 wegen schleife 0
    #define STRINGLEN 71
    
    unsigned char key[71];        //71 byte haben platz puls 0
    unsigned char sbox1[255] =    //sbox 1
    {
        0xF8, 0xC4, 0xC8, 0x7F, 0xCD, 0xCD, 0x20, 0xD5, 0xB3, 0x58, 0xD6, 0x35, 0x0A, 0x96, 0xC0, 0x80, 
        0xAE, 0xBD, 0x22, 0xF5, 0xC2, 0xFC, 0xC1, 0x33, 0x08, 0xAB, 0x1C, 0x03, 0x08, 0x77, 0x0C, 0x6D, 
        0xC2, 0x7D, 0xFC, 0x13, 0xA6, 0x54, 0x86, 0xEC, 0x7B, 0xC6, 0x6F, 0x97, 0x53, 0xDA, 0x34, 0x53, 
        0xCF, 0x8A, 0xE7, 0x55, 0xC5, 0xAC, 0xCC, 0x1A, 0x09, 0x67, 0x6B, 0xFA, 0xD9, 0x12, 0xBA, 0x55, 
        0x9A, 0x44, 0xC9, 0x7A, 0xEA, 0xEE, 0x34, 0xB6, 0x74, 0xA6, 0x98, 0x97, 0x0F, 0xC7, 0x45, 0x5F, 
        0x8D, 0x56, 0xF9, 0xA5, 0x8B, 0x4F, 0xF0, 0xC7, 0x5F, 0xAF, 0xB8, 0x26, 0x1C, 0x1E, 0x29, 0x94, 
        0x59, 0x80, 0xBD, 0xEB, 0xD0, 0xAC, 0x26, 0x04, 0x1E, 0x4F, 0x5E, 0x1D, 0x25, 0xE3, 0xE9, 0x15, 
        0xBE, 0x3D, 0x44, 0xD1, 0x1D, 0x0F, 0xDE, 0xE1, 0xC0, 0xD6, 0x1D, 0xDA, 0xEE, 0x8E, 0x27, 0x55, 
        0x4B, 0x64, 0x89, 0x59, 0x09, 0x5C, 0x56, 0x56, 0x14, 0xDC, 0x12, 0xBC, 0x04, 0x1B, 0x0C, 0xE3, 
        0x12, 0x76, 0x5F, 0x24, 0x82, 0xF1, 0xD5, 0xD4, 0xED, 0xB4, 0x1C, 0xED, 0xBE, 0x3A, 0xAA, 0xCA, 
        0x88, 0x9A, 0xAE, 0x7C, 0x61, 0x78, 0xBD, 0x0C, 0x56, 0x2E, 0x8C, 0x90, 0xC7, 0xB1, 0x6F, 0x64, 
        0x90, 0x72, 0xF5, 0x36, 0x54, 0x4E, 0x17, 0xE4, 0x7A, 0xF9, 0x61, 0x83, 0xEA, 0xD7, 0x90, 0x31, 
        0xD1, 0xEA, 0x42, 0x6F, 0x0F, 0xF6, 0xBA, 0xA6, 0x4C, 0xC7, 0x34, 0x1F, 0x17, 0x3C, 0x90, 0xAB, 
        0xFB, 0x56, 0x50, 0xD7, 0x36, 0xBA, 0x6E, 0xBA, 0xF1, 0x0A, 0xA5, 0x3E, 0x88, 0x71, 0xFC, 0x80, 
        0x72, 0x12, 0xC5, 0x75, 0x2A, 0x47, 0x95, 0x08, 0xCA, 0xB8, 0xBD, 0x7D, 0x59, 0xB5, 0x6B, 0x4C, 
        0xCF, 0xF3, 0x52, 0x38, 0xBB, 0x6A, 0x2E, 0xB9, 0x45, 0x7F, 0x09, 0xEB, 0xD7, 0x78, 0xEC, 
    } ;
    unsigned char sbox2[255] =  //sbox2
    {
        0x13, 0x14, 0xA1, 0x11, 0xE7, 0x84, 0xCF, 0xBC, 0x3D, 0x36, 0xA8, 0x21, 0x0A, 0x01, 0x6F, 0x08, 
        0x74, 0x61, 0x3D, 0xF3, 0x8A, 0xBC, 0x37, 0x4F, 0x02, 0xBA, 0x7B, 0x3E, 0x18, 0x80, 0x42, 0x0C, 
        0x3B, 0x0F, 0x54, 0x8B, 0x3D, 0xA8, 0x9D, 0xF2, 0x03, 0x13, 0xA6, 0xD0, 0x22, 0x37, 0x10, 0x19, 
        0xB0, 0x84, 0x05, 0x9F, 0x42, 0xBF, 0x67, 0x5B, 0x6F, 0x7A, 0x77, 0x23, 0x2D, 0xB6, 0x6F, 0xFF, 
        0xFF, 0x7E, 0x4D, 0x41, 0x5A, 0x2D, 0x7E, 0x9A, 0xE5, 0x67, 0x43, 0xFC, 0x19, 0x7D, 0x16, 0x45, 
        0x11, 0x08, 0xBA, 0x67, 0xB2, 0x3F, 0x5E, 0xCA, 0xC6, 0xDC, 0xDA, 0xCB, 0x15, 0x8B, 0x2F, 0xEF, 
        0x2E, 0xF5, 0xD4, 0x3A, 0x17, 0xFD, 0xF7, 0x9F, 0x45, 0xEB, 0xF3, 0x32, 0x56, 0x14, 0x90, 0x38, 
        0xE8, 0x0F, 0xBF, 0x53, 0xCF, 0x8A, 0xDF, 0x21, 0x5D, 0x63, 0x80, 0xB3, 0x3E, 0x10, 0x54, 0x65, 
        0x88, 0x5C, 0xEC, 0x90, 0xE3, 0xD1, 0x04, 0x99, 0x35, 0xBB, 0x8F, 0x0E, 0x60, 0xB8, 0x38, 0xC2, 
        0xC9, 0x39, 0x90, 0x5B, 0xFC, 0x05, 0x84, 0x0B, 0x8F, 0x04, 0x05, 0x85, 0x95, 0x4C, 0xD2, 0x5F, 
        0xE7, 0x14, 0x9B, 0xE9, 0x60, 0xBD, 0x60, 0x45, 0xBE, 0xE4, 0xB1, 0xBD, 0xC8, 0x48, 0x38, 0x21, 
        0xE0, 0x4C, 0x7F, 0x26, 0xC1, 0x67, 0xFE, 0x08, 0xF0, 0xB3, 0xE8, 0x62, 0xD1, 0xEF, 0xAD, 0x79, 
        0x1B, 0x43, 0x0C, 0x54, 0x33, 0x9B, 0x98, 0xB4, 0x19, 0xE2, 0x07, 0xB0, 0xFA, 0xAC, 0xAF, 0x70, 
        0x83, 0x73, 0x33, 0x5C, 0x30, 0xBE, 0xFE, 0x8E, 0x08, 0xC6, 0x32, 0xD2, 0xB4, 0x10, 0x83, 0xAF, 
        0xCC, 0x10, 0x35, 0xAE, 0x8B, 0xF2, 0xB5, 0xCE, 0x01, 0xBC, 0xF0, 0xF5, 0x52, 0x3F, 0x75, 0x89, 
        0x50, 0x7A, 0x2C, 0x6C, 0x70, 0xE2, 0xB3, 0x78, 0xA7, 0x4A, 0xFC, 0x63, 0x9C, 0xE9, 0x87, 
    };
    fstream keyfile("key.dat", ios::in|ios::out|ios::binary );
    //---------------------------------------------------------------------------
    void sbox(unsigned char *box);
    void crypt(unsigned char *passwort, unsigned char *string, int stringlen);
    void fullstring(unsigned char *string);
    void debug(char *name, unsigned char *str);
    void debug2(char *name, unsigned char *str);
    //---------------------------------------------------------------------------
    
    void sbox(unsigned char *box)
    {
    int posA, posB;                     //posB position fur B
    int i;                       //schleifen durchlauf
    int rest;                    //restwert modulus nur temp
    unsigned char tmp;           //zuaddierende zeichen
    
    keyfile.getline(key,71); //schlussel laden
    
        for(int counter = 0; counter < PASSLEN; counter ++)//lese erstes zeichen
        {
          posA  = counter;
          posA %= 255;
          posB  = box[counter];                                 //sichere zeichen
          tmp = sbox1[posA] ^ sbox2[posB];
          box[counter] ^= tmp;
                                   //restwert ist neue position von b im string
        }
    keyfile.seekg(0, ios::beg); //schreiben am anfang der datei
    keyfile.write(key, 71);   //key wieder speicher
    }
    
    void crypt(unsigned char *passwort, unsigned char *string)
    {
        fullstring(string);
        int stringlen = 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, "A");
        }
      //cout << string << endl;
    }
    
    void debug(char *name, unsigned char *str)
    {
    	int i = 0;
    	cout <<endl << "-----------" <<endl << "DEBUG :" << name << endl;
    
    	cout << "SIZE: " << sizeof(key) <<endl;
    
    	cout << "HEX : ";
    	for(i = 0; i < sizeof(key); i++)
       {
       printf("%x", str[i]);
       }
      cout <<endl << "-----------" <<endl;
    
    }
    void debug2(char *name, unsigned char *str)
    {
    	int i = 0;
    	cout <<endl << "-----------" <<endl << "DEBUG :" << name << endl;
    	cout << "HEX : ";
    	for(i = 0; i < 72; i++)
       {
       printf(" %x ", str[i]);
       }
      cout <<endl << "-----------" <<endl;
    
    }
    


  • Weißt du was ein Debugger ist?



  • ja etwas was mir nicht weiter geholfen hat .. sonst würde ich hier nicht posten .



  • Ich verstehs nicht ganz.. Du verschlüsselst doch laut deiner Methode auch nur 71 Byte, wieso willst du dann mehr entschlüsseln? Und das mit dem versetzten X hab ich auch nicht verstanden..



  • dachte evtl. hab ich irgend was vergessen zb Beginn bei 0, das mit den versetzt war eine Spinnerei das read die Position immer nur um 70 in der Datei erhöht oder irgend etwas in dieser Art .. denn die erste Zeile wird wunderbar entschlüsselt alles darauf folgende ist leider Datenschrott , manchmal ist allerdings auch die zweite Zeile zu gebrauchen ...
    dass macht mich ein bissel verrückt...



  • kronos33 schrieb:

    ja etwas was mir nicht weiter geholfen hat .. sonst würde ich hier nicht posten .

    Dann hast du den Debugger falsch benutzt. Aber Übung macht den Meister.


Anmelden zum Antworten