[C++] XOR-Verschlüsselung

albaum

Ensign
Registriert
Juli 2014
Beiträge
172
Hallo,

ich habe mir mal diese Aufgabe rausgesucht und wollte die mal bearbeiten. Es geht um die XOR-Verschlüsselung in C++:

Einfacher Verschlüsselungsalgorithmus:
Eingabe: Zu verschlüsselnde Zeichenkette "text", Passwort "key"
Ausgabe: Verschlüsselte Zeichenkette "result".
Algorithm. Idee: Wandle jedes Zeichen text mit Hilfe einer bitweisen, exklusiven Oder-Operation (^in C++) um, bei der das Zeichen text verknüpft wird mit dem Passwort-Zeichen key. 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.


Das Programm für diese Aufgabe habe ich soweit auch geschrieben jedoch wird mir in der Main-Funktion ein Type-Fehler in Form von "int" angezeigt. Jedoch habe ich eine " int main" Funktion wodurch dieses Problem doch eig gar nicht auftreten sollte oder?


PHP:
#include <iostream>
#include <string>

using namespace std;

string encrypt(string text, string key)
{
	string result;
	
 string toEncrypt = "fail";
 char keyToEncrypt = 's'; //s oder 115 in ascii

 for (int temp = 0; temp < toEncrypt.size(); temp++)
   toEncrypt[temp] ^= keyToEncrypt;
 cout << "nThe encrypted data = " << toEncrypt;

 for (int temp = 0; temp < toEncrypt.size(); temp++)
   toEncrypt[temp] ^= keyToEncrypt; 
 cout << "nThe unencrypted data = " << toEncrypt;

	return result;
}

/** Hier beginnt das Hauptprogramm */
int main(int argc, char* argv[])
{
	string text = "Dies ist irgendein Text.";
	string key  =  "irgendein Passwort";
	
	string encrypted = " ";
	string unencrypt = " ";

for (int temp = 0; temp < text.size(); temp++){
  encrypted += text[temp] ^ (int(key) + temp) % 255;  // hier ebenfalls ein Typ Fehler bei int(key)
 }
 cout << "nEncrypted data = " << encrypted;

 for (int temp = 0; temp < text.size(); temp++){
  unencrypted += encrypted[temp] ^ (int(key) + temp) % 255;  //unencrypted soll nicht definiert sein (ist es doch eigentlich)                                                                                                                 und int key soll ein Type-Fehler sein...
 }
 cout << "nUnencrypted data = " << unencrypt;

		
	return 0;
}


Ich hoffe ihr könnt mir helfen da das mein erstes Programm mit der XOR-Verschlüsselung ist und ich mir noch unsicher bin.
 
encrypted hat Typ string, dass was du in Zeile 34 anhängen willst, hat aber nicht den Typ string.

Die Fehlermeldung hat auch nichts mit der main Funktion zu tun.

unencrypt definierst du, unencrypted nutzt du weiter unten.

Schau halt mal ein wenig sorgfältiger über dein Programm. Die Fehlermeldungen bringen dich eigentlich locker zur Lösung.
 
Ja aber wie soll ich das Problem denn lösen? Ich will dort eine Rechnung einsetzen, dafür brauche ich doch den Typ int...

Wenn ich den Typ String benutze kann ich die Rechnung ja nicht durchführen...
 
Habe jetzt druch "int i = std::stoi(key);" erstellt und "int(key)" durch "i" ersetzt.

Das Programm kann ich jetzt comprilieren und ausführen jedoch kommt beim ausführen dass heraus:

"terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information."

Kann mir einer Erklären was das bedeutet?... Heißt ja eig dass das Programm sofort beendet wird... Ist mein Programm fehlerhaft? Muss etwas umprogrammieren?
 
Bitte Nachdenken, nicht einfach irgendwas coden. stoi klappt zum Beispiel bei "15", oder bei "zahl ist 12" mit dem zweiten Parameter auf 9. aber nicht bei "hier gibts keine Zahl".

Du willst glaube eher aus "key" nen "char*" machen, chars kannst du dann wie ints verwenden (durch (int)char)
 
Wie wandel ich den String denn in ein char* um?

std::string key = "hello world";
char *y = x.c_str();

geht dass damit? Oder gibt es eine andere bessere Methode? Weil wenn dann "key" fehlerhaft wird, ist ja auch "y" betroffen...
 
Darf ich fragen, was du mit (int(key) + temp) erreichen willst?

Wenn ich dein problem richtig verstehe, willst du doch das "temp-te" Zeichen von key haben, dabei aber sicherstellen, dass temp nicht größer ist als die Länge des keys, oder nicht?
 
albaum schrieb:
Wie wandel ich den String denn in ein char* um?

std::string key = "hello world";
char *y = x.c_str();

geht dass damit? Oder gibt es eine andere bessere Methode? Weil wenn dann "key" fehlerhaft wird, ist ja auch "y" betroffen...

Bitte auf const-correctness achten! Die c_str()-Methode gibt einen const char* zurück. Also:

const char *y = x.c_str();

Soll heißen, du darfst die Zeichenkette, auf die y zeigt, auf keinen Fall verändern.
 
Es gibt eigentlich überhaupt keinen Grund die string variable in einen char* "umzuwandeln". An die einzelnen chars kommst du ja auch direkt ran (key).
 
Zurück
Oben