Passwordverschlüsselung
-
Du castest einfach jeden einzelnen Character nach short int und shiftest diesen Wert dann um 8 Bit nach links.
short int character = 'a'; //Wert: 0x61; character = character << 8; //Wert: 0x6100;
-
Okay, hat jemand ein Tutorial, wie man die Bytes denn nun vertauscht etc.?
Ich blicke bei den Shift-Operatoren nicht durch ^^
-
Also ich wuerde das so swappen:
character = (character & 0xF000) >> 4 | (character & 0x0F00) << 4Dann nur noch XOR:
character = character ^ 0xA5A5;Und fertig ist der Lack.

-
short int character = 'a'; //Wert: 0x61; character = character << 8; //Wert: 0x6100; character = (character & 0xF000) >> 4 | (character & 0x0F00) << 4 ; character = character ^ 0xA5A5; printf("%x", character);so oder wie? character is schon die Variable von oben oder? ^^
-
Was spricht dagegen es mit dem Beispiel von oben auszuprobieren? ^^
-
Wieso kompliziert, wenn's auch einfach(er) geht? Wir nehmen hier doch eh die ganze Zeit an, dass ein char 8 Bytes hat, dann kann man es auch gleich so machen:
string encode(string const& str) { string ret; for (string::const_iterator i = str.begin(); i != str.end(); ++i) { ret += (*i >> 4 | *i << 4) ^ 0xA5; ret += 0xA5; } return ret; }Wobei ich schon die Algorithmenbeschreibung bedenklich finde, denn dem Autor dieses Algorithmus ist offensichtlich selbst nicht ganz klar, wieso da immer Nullbytes eingefügt werden (anders kann ich mir die Anweisung nicht erklären, sonst hätte er gleich gesagt, man solle den Wert 0xA5 einfügen, und nicht etwa den Wert 0, der dann ge-xort wird).
-
Konrad Rudolph schrieb:
Wobei ich schon die Algorithmenbeschreibung bedenklich finde, denn dem Autor dieses Algorithmus ist offensichtlich selbst nicht ganz klar, wieso da immer Nullbytes eingefügt werden (anders kann ich mir die Anweisung nicht erklären, sonst hätte er gleich gesagt, man solle den Wert 0xA5 einfügen, und nicht etwa den Wert 0, der dann ge-xort wird).
Du weisst ja gar nicht wie recht du hast. Die Algorithmus-Beschreibung ist sogar falsch.

Angeblich soll das der Algorithmus sein, mit dem der MS SQL Server bei der SQL Authentication die Passwoerter verschluesselt. Aber der funktioniert ein bisschen anders:Erst wird das Passwort in UTF-16 konvertiert. Also wird dieses ominoese Fuellbyte *vor* dem eigentlichen Character eingefuegt.
Danach werden die 4 MSB jedes Bytes werden mit den 4 LSB eines jeden Bytes geswappt und dann jedes Byte mit 0xA5 geXORed.
-
ja genau, habe das aus irgendeiner Beschreibung vom MS SQL-Server.
Hast du denn den Algorithmus da?ich komme echt nicht weiter.
(Mein Problem liegt atm darin, eine Zahl von dezimal in hexadezimal zu kriegen, also 112 in 0x70)
-
pyromania schrieb:
...
(Mein Problem liegt atm darin, eine Zahl von dezimal in hexadezimal zu kriegen, also 112 in 0x70)Na DAS ist nun wirklich das Einfachste:
unsigned char zahl = 112; // fertigGruß,
Simon2.
-
Simon, irgendwie hat Dein Code mit der Aufgabenstellung nichts zu tun, oder? Folgender Code erledigt das hingegen:
unsigned int number = lexical_cast<unsigned int>(string("112")); stringstream sstr; sstr << "0x" << hex << number; string hex_string = sstr.str();