Hilfe bei Verschlüsselung



  • Hallo ich hab folgende Aufgabenstellung:

    Eingabe: Zu verschlüsselnde Zeichenkette text, Passwort key

    Ausgabe: Verschlüsselte Zeichenkette result.

    Wandle jedes Zeichen text[i] mit Hilfe einer bitweisen, exklusiven Oder-Operation (^in C++) um, bei der das Zeichen text[i] verknüpft wird mit dem Passwort-Zeichen key[i]. Falls i die Länge von key überschreitet, dann wird zyklisch der Anfang von key durchlaufen.
    Implementieren Sie den Algorithmus in einer separaten Funktion
    string encrypt (string text, string key)
    und verschlüsseln Sie die vorgegebene Zeichenkette text mit Hilfe des vorgegebenen Passwortes key.

    So weit bin ich bisher:

    #include "stdafx.h"
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string encrypt(string text, string key)
    {
    	string result;
    
    	char *text_char = NULL;
    	text_char = new char[text.length];
    
    	for ( unsigned int i = 0;i <= text.length();i++ , text_char++) {
    		*text_char = text.at(i);
    	}
    	return result;
    }
    
    int main(int argc, char* argv[])
    {	
    	string text;
    	string key;
    
    	cout << "Bitte text und key eingeben: ";
    
    	cin >> text;
    	cin >> key;
    	encrypt(text, key);
    
    	return 0;
    }
    

    Ich versuche erst mal die Zeichen des Strings text in ein Array zu speichern, bekomme aber folgende Fehlermeldung: error C2440: "Initialisierung": "unsigned int (__thiscall std::basic_string<char,std::char_traits<char>,std::allocator<char>>::* )(void) noexcept const" kann nicht in "unsigned int" konvertiert werden

    Wo liegt mein Fehler?

    Danke für die Hilfe

    Gruß



  • text.length => text.length()

    Frage: Warum willst du mit new rumgurken?



  • oh stimmt, danke.
    Sonst konnte ich das array nicht erzeugen, weil die Länge noch nicht fest stand.

    und wenn ich das Programm jetzt ausführe stürzt es nach der Eingabe ab.



  • Wahrscheinlich, weil du in der Schleife mit i um 1 zu weit läufst.

    Frage: Warum willst du mit arrays rumgurken?



  • Ich muss doch an jedes Zeichen von "text" ein Zeichen von "key" dran hängen und ich komme doch nur an jedes einzelne Zeichen wenn ich alle Zeichen in einem array speichere oder nicht?



  • Ein string ist doch schon ein "array" aus chars.

    std::string text = "test";
        std::string text_char = {};
    
        for (int i=0; i<text.length(); i++)
        {
            text_char += text.at(i);
        }
    


  • Und mit text.at(i) kommst du woran?



  • Erst mal danke für die Antworten, habe das array wieder entfernt und bin jetzt so weit:

    string encrypt(string text, string key)
    {
    	string result;
    
    	for (unsigned int i = 0; i < text.length();i++) {
    
    		result = result + text.at(i) + key.at(i);
    	}
    
    	return result;
    }
    

    So funktioniert es auch, aber nur solange "key" nicht kürzer als "text" ist. In der Aufgabe steht ja noch was von exklusiver Oder-Operation, muss man das dafür noch irgendwie einbauen?



  • Sobald der zeichenzähler größer ist als die länge von key soll wieder am anfang von key begonnen werden. Dazu eignet es sich den rest der division des zählers durch die schlüssellänge als index in key zu benutzen (wäre dann key[i%key.size()])



  • Ja so klappt es perfekt, danke 👍 . Nur hab ich jetzt nicht wirklich das Gefühl den Lösungsweg, der eigentlich für die Aufgabe vorgesehen war, zu benutzen.
    Es wird ja von text[i] geschrieben und von der exklusiven Oder-Operation, nur hab ich davon jetzt nichts benutzt.



  • Einfach den xor operator (^) mit dem key und text als operand benutzen und das ergebnis in result packen.



  • Statt text[i] hast du test.at(i) was effektiv das gleiche tut, aber mit Check ob du noch im gültigen Bereich des Strings bist. Die XOR Verknüpfung musst du tatsächlich noch einbauen. Momentan hast du stattdessen eine Addition.



  • Wenn es nie die grenzen überschreitet braucht man auch nicht prüfen, ob es vielleicht doch außerhalb ist 😉 im Debugmodus sollte [] auch ne meldungen ausgeben.



  • string encrypt(string text, string key)
    {
    	string result;
    
    	for (unsigned int i = 0; i < text.length();i++) {
    
    		result[i] = text[i] ^ key[i%key.length()];
    	}
    
    	return result;
    
    }
    

    So etwa? Nach der Eingabe bekomme ich immer die Fehlermeldung "string subscript out of range"
    Und ich verstehe ehrlich gesagt das XOR nicht so richtig in diesem Fall. Was genau macht das XOR denn hier? Ich soll die Zeichen doch aneinander reihen mit '+'.

    und verstehe ich das richtig? Wenn ich einen String habe, kann ich einfach an den Namen eine eckige Klammer dran setzen und somit auf den jeweiligen Zeichenplatz zugreifen?
    Sagen wir mal ich habe string name = "Bob";
    dann wäre bei name[0] = 'B' ? 😕



  • Genau wie bei einem array. Das Problem bei deinem string ist, dass er leer ist. Willst du jetzt auf ein nicht vorhandenes Element zugreifen, geht das natürlich nicht. Einfach das Zeichen mit push_back oder += anhängen oder so wie du es zuvor gemacht hast.


  • Mod

    andre16 schrieb:

    und verstehe ich das richtig? Wenn ich einen String habe, kann ich einfach an den Namen eine eckige Klammer dran setzen und somit auf den jeweiligen Zeichenplatz zugreifen?
    Sagen wir mal ich habe string name = "Bob";
    dann wäre bei name[0] = 'B' ? 😕

    Ja. Aber das geht natürlich nur, wenn es dieses Zeichen überhaupt gibt. Was hier das Problem ist: Denn result ist bei dir ein leerer String, du greifst aber fröhlich auf dessen vermeintlichen Inhalt zu. Häng die neuen Zeichen an (zum Beispiel mit push_back), anstatt zu versuchen, nicht existierende Zeichen zu verändern.



  • string encrypt(string text, string key)
    {
    	string result = text;
    
    	for (unsigned int i = 0; i < text.length();i++) {
    
    		result[i] = text[i] ^ key[i%key.length()];
    	}
    
    	return result;
    }
    

    So ich habe jetzt für result den text gesetzt. Push_back sagt mir jetzt gar nichts, ich würde gerne meine Lösung mit den Mitteln lösen, die wir bisher an der uni auch gelernt haben und das machen wir erst seit 2 Wochen.

    Jetzt bekomme ich nach der Eingabe aber nur irgendetwas unlesbares raus.
    Danke für eure Mühe 👍


  • Mod

    andre16 schrieb:

    Jetzt bekomme ich nach der Eingabe aber nur irgendetwas unlesbares raus.

    Soll das eine Problembeschreibung oder eine Erfolgsmeldung sein?



  • Problembeschreibung, also in der Konsole sehe ich dann nur noch Rechtecke als Ergebnis.


  • Mod

    andre16 schrieb:

    Problembeschreibung, also in der Konsole sehe ich dann nur noch Rechtecke als Ergebnis.

    Dir ist schon klar, was "Verschlüsselung" bedeutet, oder?



  • Zum testen kannst du deinen verschlüsselten Text ja wieder entschlüsseln. Bei deiner XOR Verschlüsselung ist das besonders einfach, da Verschlüsseln und Entschlüsseln genau das gleiche machen.


Anmelden zum Antworten