Passwordverschlüsselung



  • Hallo,

    ich habe folgenden Text im Internet gefunden, un möchte mein Passwort nun so verschlüsseln:

    The algorithm to encrypt the password is simply to expand every byte of the password to 2 bytes, swap the higher and lower 4 bits within each byte, xor each byte with A5. For example to encrypt the character "p":

    (ASCII is 70 hex):
    70 is expanded to 70 00
    After the swap the result is: 07 00
    XOR with A5: A2 A5

    Zum XOR'en benutzt man ja den ^-Operator.
    Was is nicht kapiere ist, wie man ein byte auf 2 vergrößern kann.

    Wie kann ich also jetzt das Passwort verschlüsseln?

    Danke schonmal,
    Gruß pyromania



  • pyromania schrieb:

    Was is nicht kapiere ist, wie man ein byte auf 2 vergrößern kann.

    Wie wär's, wenn du nach jedem Byte ein Dummy-Byte dazwischenschiebst 😉

    (btw, besonders sicher sieht das Verfahren nicht gerade aus)



  • Naja, sicher ist es nicht, das ist mir garnicht wichtig.
    Nur stehe ich gerade total auf dem Schlauch 😞



  • pyromania schrieb:

    Naja, sicher ist es nicht, das ist mir garnicht wichtig.
    Nur stehe ich gerade total auf dem Schlauch 😞

    Stell doch bitte konkrete Fragen, wenn möglich anhand von Codebeispielen. Oder hilft Dir folgende Antwort weiter, die die Frage "wie kann ich ein Byte auf zwei vergrößern" vollkommen ausreichend beantwortet?

    // Ein Byte
    char x = 'b';
    
    // Zwei Byte
    char y[2];
    y[0] = x;
    y[1] = 0;
    


  • 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) << 4
    

    Dann 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; // fertig
    

    Gruß,

    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();
    

Anmelden zum Antworten