Verschlüsseln eines Strings(XOR)

mowl

Mitglied
Ich habe ein kleines Verschlüsselungsprogramm geschrieben, leider funktioniert dies nicht, das Fenster schließt sich obwohl eine Ausgabe erfolgen bzw. durch PAUSE der Bildschirm erhalten bleiben müsste.
Der Code sollte ausreichend kommentiert sein, falls es doch Fragen gibt bitte posten. Die Verschlüsselungsmethode müsste sich XOR nennen bin mir aber nicht sicher.
Code:
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    int i, x, chr;
    
    // in dem Array sind Wert von 1 - 255, also eine gemischte ASC II Tabelle, werte sind nicht doppelt vorhanden
    int tab[] = {106, 123, 238, 135, 24, 107, 194, 195, 158, 80, 136, 91, 81, 168, 227, 174, 22, 44, 73, 26, 131, 219, 105, 15, 129, 62, 221, 32, 191, 10, 170, 171, 233, 180, 28, 8, 5, 98, 240, 149, 176, 95, 199, 16, 60, 113, 228, 118, 11, 109, 9, 127, 177, 115, 93, 41, 205, 250, 75, 218, 49, 7, 220, 193, 90, 155, 188, 1, 145, 254, 35, 241, 20, 247, 27, 46, 175, 86, 84, 159, 248, 222, 237, 160, 71, 103, 117, 165, 161, 17, 236, 139, 151, 99, 57, 217, 54, 42, 40, 89, 153, 83, 201, 209, 156, 104, 78, 19, 33, 167, 111, 154, 55, 121, 239, 230, 66, 190, 47, 65, 70, 235, 164, 137, 210, 101, 231, 112, 148, 200, 134, 225, 77, 92, 198, 242, 197, 88, 172, 147, 67, 122, 36, 72, 69, 138, 211, 76, 252, 223, 186, 82, 163, 152, 202, 96, 31, 207, 214, 108, 58, 249, 85, 34, 68, 189, 23, 245, 48, 213, 157, 184, 12, 133, 39, 212, 179, 162, 14, 144, 30, 2, 234, 166, 25, 97, 53, 224, 43, 50, 185, 246, 94, 203, 59, 206, 13, 37, 187, 6, 178, 169, 216, 208, 21, 130, 61, 126, 3, 150, 226, 140, 232, 244, 251, 143, 125, 100, 229, 63, 120, 74, 173, 52, 128, 196, 146, 132, 192, 29, 141, 204, 124, 45, 4, 110, 243, 51, 255, 114, 87, 64, 102, 142, 181, 215, 183, 116, 182, 56, 38, 119, 253, 18, 79};

    string text("hallo"),
           enkodiert,
           dekodiert;
   
    /* enkodiert wird wie folgt, text[i] wird in einen integer gecastet,
    dieser wird dann durch den im tab Array befindlichen integer, welcher
    auch in einen char gecastet wird, ersetzt */
    for (i = 0; i < text.size(); i++) {
        enkodiert += (char)tab[(int)text[i]];
    }
    
    /* das dekodieren, ist im Prinzip das Gegenteil vom kodieren, es wird
    also im tab Array nach dem ASC II Wert gesucht welcher vom aktuellen Zeichen
    zurückgegeben wird */
    for (i = 0; i < enkodiert.size(); i++) {
        // hier wird das tab-Array nach dem Zeichen durchsucht, hier vermute ich die Fehlerquelle
        for (x = 0; x < 255; i++) {
            if (tab[x] == (int)enkodiert[i]) {
                chr = x;
            }
        }
        // Buchstaben anhängen
        dekodiert += (char)chr;
    }
    
    // hier wird nichts ausgegeben
    cout << "Text: " << dekodiert << "\n";

    system("PAUSE");
    return 0;
}
das tab Array als Fehlerquelle ist auszuschließen!
Ich bin für jede Hilfe dankbar!
 
Habe deinen Code nur überflogen, aber ich glaube, in der inneren Schleife inkrementierst du die falsche Variable:
Code:
for (x = 0; x < 255; i++)
Sollte da nicht x erhöht werden?
 
Hallo!

Beim Überfliegen ist mir erst einmal die Endlosschleife hier aufgefallen:
Code:
for (x = 0; x < 255; i++)

Ich guck mal, ob das das einzige war!

Gruß
Johannes

EDIT: Mist - Kachelator war schneller ;).
 
Achja :) , danke das funktioniert schonmal! Leider wird das h und das o nicht gefunden nur das "all" wird ausgegeben, hier der aktuelle Code:
Code:
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{
    int i, x, chr;
    
    int tab[] = {106, 123, 238, 135, 24, 107, 194, 195, 158, 80, 136, 91, 81, 168, 227, 174, 22, 44, 73, 26, 131, 219, 105, 15, 129, 62, 221, 32, 191, 10, 170, 171, 233, 180, 28, 8, 5, 98, 240, 149, 176, 95, 199, 16, 60, 113, 228, 118, 11, 109, 9, 127, 177, 115, 93, 41, 205, 250, 75, 218, 49, 7, 220, 193, 90, 155, 188, 1, 145, 254, 35, 241, 20, 247, 27, 46, 175, 86, 84, 159, 248, 222, 237, 160, 71, 103, 117, 165, 161, 17, 236, 139, 151, 99, 57, 217, 54, 42, 40, 89, 153, 83, 201, 209, 156, 104, 78, 19, 33, 167, 111, 154, 55, 121, 239, 230, 66, 190, 47, 65, 70, 235, 164, 137, 210, 101, 231, 112, 148, 200, 134, 225, 77, 92, 198, 242, 197, 88, 172, 147, 67, 122, 36, 72, 69, 138, 211, 76, 252, 223, 186, 82, 163, 152, 202, 96, 31, 207, 214, 108, 58, 249, 85, 34, 68, 189, 23, 245, 48, 213, 157, 184, 12, 133, 39, 212, 179, 162, 14, 144, 30, 2, 234, 166, 25, 97, 53, 224, 43, 50, 185, 246, 94, 203, 59, 206, 13, 37, 187, 6, 178, 169, 216, 208, 21, 130, 61, 126, 3, 150, 226, 140, 232, 244, 251, 143, 125, 100, 229, 63, 120, 74, 173, 52, 128, 196, 146, 132, 192, 29, 141, 204, 124, 45, 4, 110, 243, 51, 255, 114, 87, 64, 102, 142, 181, 215, 183, 116, 182, 56, 38, 119, 253, 18, 79};

    string text("hallo"),
           enkodiert,
           dekodiert;
   
    for (i = 0; i < text.size(); i++) {
        enkodiert += (char)tab[(int)text[i]];
    }
    
    cout << enkodiert << "\n";
    
    for (i = 0; i < enkodiert.size(); i++) {
        for (x = 0; x < 255; x++) {
            if (tab[x] == (int)enkodiert[i]) {
                chr = x;
            }
        }
        dekodiert += (char)chr;
        chr = 0;
    }
    
    cout << "Text: " << dekodiert << "\n";

    system("PAUSE");
    return 0;
}
 
Zuletzt bearbeitet:
Hast du gemerkt, das tab[255] nicht initialisiert ist?
In folgender Zeile sind nur 255 Werte:
Code:
int tab[] = {106, 123, 238, 135, 24, ...
 
Das macht der Compiler automatisch;). Ich habe die Fehlerquelle gefunden:
Code:
£*Ü
gesucht wird -100
gesucht wird 42
gesucht wird 33
gesucht wird 33
gesucht wird -102
Text:  all
Drücken Sie eine beliebige Taste . . .
Ich weiß nur noch nicht was falsch ist.
Nach gesucht wird ist immer der Integer aus der if Abfrage
Code:
(if (tab[x] == input[i])).
 
Ha, da kann ich dir helfen. Du musst überall unsigned char verwenden. Die Werte über 127 werden nämlich als negative Werte behandelt, wenn du char verwendest. Da hätte ich auch früher drauf kommen können. :rolleyes:
 
Ich bin auch nicht drauf gekommen. Dazu musste ich erst dein Log ansehen. Und da waren dann diese plakativen '-'.

Ein schönes Beispiel für Synergie! ;)
 
Hallo!

Noch ein Punkt, den ich ändern würde:
Code:
if (tab[x] == (int)enkodiert[i]) {
                chr = x;
            }
Setz da mal ein "break" rein! Sonst verschwendest du Rechenzeit!

Gruß
Johannes
 
Zurück