Hilfe bei Verschlüsselung
-
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 dutest.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.
-
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
-
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.
-
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.
-
Ja klar, aber sagen wir mal ich gebe für Text = AAA ein und für key=jk ein, dann soll das Result doch AjAkAj sein?
Ach Moment, die Ausgabe AjAkAj hääte ich nur mit dem '+' Operator bekommen, da ich XOR verwende wird das dann ja richtig verschlüsselt, also nicht mehr lesbar auf der Konsole oder?
-
Nein. Was wäre das denn für eine Verschlüsselung bei der einfach nur Zeichen eingefügt werden? Wie kommst du überhaupt auf sowas? Hast du dir mal angeschaut was XOR überhaupt macht?