Frage zu String und xOR



  • Hallo liebe Community. Ich hab da ne Frage: Ich hab ein Programm geschrieben um damit einen beliebigen String durch einen Passwort zu verschlüsseln. Dabei soll ich mti XoR arbeiten. Nur leider weist sich das als schwieriger als gedacht denn stets bekomm ich als Ergebnis kein zeichen bzw. ist die Länge 0!
    Was mache ich da Falsch? Hab den Code mal dazugefügt:

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    
    {
    		cout << "Bitte geben Sie den zu verschlüsselnden Text ein.\n";
    		cout << "Bitte für Leerschläge _ benutzen!"; // Es funktioniert nicht mit White-Spaces. Lösungen?
    		string input; 
    		cin >> input; 
    		int leninput = input.size();
    		cout << "Bitte geben Sie nun das Passwort von maximal 6 Zeichen ein" << endl;
    		char passwort[7];
    		cin >> passwort;
    		int lenpasswort = strlen(passwort);  // UmWiederholungen starten zu könen.
    		cout << endl;
    
    		string verschluesselt; 
    
    			for (int i = 0, k = 0; i < leninput; k++, i++) {
    
    				verschluesselt[i]= input[i]^passwort[k];
    				if ( i == lenpasswort-1){k =0;} // um einen Ring zu erzeugen
    			}
    
    		cout << verschluesselt << endl;
    
    		cout << verschluesselt.size();
    
    return 0;		
    }
    


  • würde mich auf Hilfe freuen

    sry for Doppelpost, war nicht beabsichtigt.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,
    Damit die Whitespaces funktionieren benutze std::getline().
    Als Passwort Variable würde ich auch std::string nehmen. Das dein verschlüsselter Text immer leer ist liegt daran, dass du die Zeichen nicht anhängst. Außerdem solltest du den Module Operator % nehmen, um einen "Ring" zu erzeugen.
    Also verschluesselt += input[i] ^passwort[i&passwortlen];
    Tschau



  • das & in der letzten zeile sollte % heißen



  • Aeqaaas schrieb:

    Hi,
    Damit die Whitespaces funktionieren benutze std::getline().
    Als Passwort Variable würde ich auch std::string nehmen. Das dein verschlüsselter Text immer leer ist liegt daran, dass du die Zeichen nicht anhängst. Außerdem solltest du den Module Operator % nehmen, um einen "Ring" zu erzeugen.
    Also verschluesselt += input[i] ^passwort[i&passwortlen];
    Tschau

    das mit dem Ring ist ein genialer Einfall. Is zwar in der Aufgabenstellung gestanden, aber ich habe nicht so recht verstanden, wie ich nun den Modulo richtig einsetzen muss.

    aber wäre es auch möglcih folgendermassen,
    verschluesselt[i] = input[i]^passwort[i%passwortlen];

    oder kommt es eben zu diesem Problem, dass mein verschlüsselter Text leer ist? Wenn ja, wieso eigentlich?

    ps: Habe die Aufgabe nun vorher anders gelöst. Der verschlüsselte text lässt sich zwar ned anzeigen, aber ich kanns wieder entschlüsseln, wobei aber der string sich nicht mit nem normalen cout << entschlüsselt anzeigen lässt sondern mit ner Schlaufe entschlüsselt[i] alle anordnen muss.



  • Die direkte Zuweisung geht nicht, weil du keinen Platz in deinem String reserviert hast. Das könntest du mit resize machen, aber es ist unnötig kompliziert.
    bei deinem ps verstehe ich zwar was du meinst aber ohne code ist es schwer rauszufinden was da nicht klappt.



  • ok ich hab den Code reingestellt.

    Danke für deine Hilfe. Werde es mal so versuchen...bissl fies dass uns nicht vorher gesagt wurde (kursleiter) dass man Werte nicht direkt zuweisen kann 🙂

    #include <iostream>
    #include <string>
    #include<cstring>
    
    using namespace std;
    
    int main()
    
    {
    		cout << "1.Bitte geben Sie den zu verschlüsselnden Text ein.\n";
    		cout << "Bitte für Leerschläge _ benutzen!"; // Es funktioniert nicht mit White-Spaces. Lösungen?
    		string input;
    		cin >> input;
    		int leninput = input.size();
    		cout << endl << leninput << endl; // Überprüfung
    		cout << "2.Bitte geben Sie nun das Passwort von maximal 6 Zeichen ein" << endl;
    		char passwort[7];
    		cin >> passwort;
    		int lenpasswort = strlen(passwort);  // UmWiederholungen starten zu könen.
    		cout << endl;
    
    		string verschluesselt; //leider wird nix angezeigt und die Grösse des Strings ist Null!
    		//VERSCHLUESSELUNG
    			for (int i = 0, k = 0; i < leninput; k++, i++) {
    
    				verschluesselt[i]= input[i]^passwort[k];
    				if ( i == lenpasswort-1){k =0;} // um einen Ring zu erzeugen
    			}
    
    		cout <<"3.String: "<< verschluesselt << endl; //passiert nix: wo Liegt das Problem?
    		cout <<"4.Einzelnindex " << endl<<verschluesselt[3]<< endl; // auch hier keine Reaktion
    		cout << "5.Index mit Schlaufe"<<endl;
    			for(int i = 0; i<leninput;i++) // viele Leerzeichen mit vereinzelten Zeichen
    			{ cout << verschluesselt[i];}
    
    		cout <<endl<<"6.Grösse des Strings" << endl << verschluesselt.size()<<endl;
    
    		string ent; // ENTSCHLUESSELUNG
    
    			for (int i = 0, k = 0; i < leninput; k++, i++) { // das Gleiche wie vorhin
    
    				ent[i]= verschluesselt[i]^passwort[k];
    				if ( i == lenpasswort-1){k =0;} // um einen Ring zu erzeugen
    			}
    
    		cout << "7.String: "<<endl; // geht nicht
    		cout << ent << endl;
    		cout << "8.Einzelindex "<<endl;
    		cout << ent[3]<< endl;// funktioniert
    
    		cout <<"9.Grösse der Entschluesselten Datei"<<endl;
    		cout << ent.size() << endl;// Wird null angezeigt!
    		cout << "10. Index mit Schlaufe"<<endl;
    		for(int i = 0; i<leninput;i++) // hier funktionierts einwandfrei...
    			{ cout << ent[i];}
    
    return 0;
    }
    
    $ ./startU0.exe
    1.Bitte geben Sie den zu verschlüsselnden Text ein.
    Bitte für Leerschläge _ benutzen!Der_Spiegel_ist_glaenzend.
    
    26
    2.Bitte geben Sie nun das Passwort von maximal 6 Zeichen ein
    Spiel
    
    3.String:
    4.Einzelnindex
    :
    5.Index mit Schlaufe
    ?
     ::
    
    ^
    6.Grösse des Strings
    0
    7.String:
    
    8.Einzelindex */
    
    //
    

    8.-10. hab ich jetzt irgendwo verlegt. Aber bei 9. kam eine Null raus. und bei 10. stand dann Der_Spiegel_ist_glaenzend



  • Just-Me schrieb:

    oder kommt es eben zu diesem Problem, dass mein verschlüsselter Text leer ist? Wenn ja, wieso eigentlich?

    ich schätze mal das liegt an dem cin/cout-mist. ich glaub' das interpretiert alle nicht-druckbaren zeichen als irgendwlche steuerzeichen (0 z.b.). mach' am besten die ausgabe als hexzahlen oder so...


Log in to reply