Base24-Kodierung
-
Hi,
ich habe mich vor kurzem mit Base64-Kodierung beschäftigt, welche recht einfach zu verstehen ist. Nun habe ich mir mal das Base24 Verfahren angeschaut und einen interessanten Quellcode dazu gefunden. Dieser funktioniert auch wunderbar aber ich habe arge Verständnisschwierigkeiten.
Ich habs ins Unterforum "Rund um die Programmierung" gestellt, weil mir nur die Erklärung wichtig ist, auf die Sprache kommts mir jetzt gar nicht an.
Hier der Auszug, der mir unklar ist:
for ( int i = 24; i >= 0; i-- ) { iCur = 0; for ( int j = 14; j >= 0; j-- ) { iCur = iCur * 256 ^ bProductKey[j]; bProductKey[j] = (byte)(iCur/24); iCur = iCur%24; } sKey = ((char)bKeyChars[iCur]) + sKey; }
Dazu gehört natürlich noch eine Zuordnungtabelle, die 24 Zeichen umfasst. 15 Zeichen ist der kodierte String lang und mit dem angegebenen Code-Schnippsel wird er dekodiert.
Was ich denke zu verstehen:
*256 --> hängt binär 8 Nullen rechts an iCur (bit shifting).
^bProductKey[j] --> (xor) füllt das neu erstellte Byte mit der Binärzahl von bProductKey[j]
bProductKey[j] = (byte)(iCur/24) --> bei base64 teilt man nur 64 um 6 stellen abzuspalten. hier teilt man durch 24 um die entsprechenden stellen abzuspalten.
iCur = iCur%24 --> der rest der teilung wird in iCur gesteckt.
sKey = ((char)bKeyChars[iCur]) + sKey --> key wird zusammengebaut.Ich verstehe das gesammte Prinzip aber nicht. Warum wird das ganze 25 bzw. 15 mal durchlaufen. Was wird mit dem Rest der Teilung gemacht?
Gibt es noch andere Möglichkeiten base24 zu kodieren/dekodieren?
Es wäre schön, wenn mir jemand erklären kann, was diese aufgezeigt Funktion Schritt für Schritt bewirkt.
Danke und Gruß
ravel
-
Die Ursprungsdaten sind 15 byte groß, das Resultat ist ein String mit 25 Zeichen aus einem Zeichenvorrat von 24 Zeichen.
Da man 24 Kombinationen nicht deckungsgleich auf Bits abbilden kann, wie es zum Beispiel bei der Umwandlung vom Binärsystem in das Hexadezimalsystem möglich ist(4 Bit = 1 Hex-Ziffer), muss man den Ursprungspuffer als Gesamtes betrachten.Betrachtet also man den gesamten Ursprungsbuffer als eine Zahl, so erhält man bei jeder ganzzahligen Division durch die neue Basis(24) eine Stelle im neuen Stellenwertsystem also ein Zeichen des Ausgabestrings.
Da man ja den byte-Buffer programmiertechnisch nicht als einzelne Zahl betrachten kann, durchläuft man es byteweise von der Stelle mit der niedrigsten Wertigkeit zur Stelle mit der höchsten Wertigkeit und gibt den Rest der Division an die nächsthöhere Stelle weiter. Die Division an der Stelle mit höchster Wertigkeit darf eigentlich keinen Rest mehr erzeugen, da es ja ursprünglich auch in der Gegenrichtung kodiert wurde und die Dekodierung dort beendet ist.
Hat man eine einzelne Teilung durch 24 in der inneren Schleife beendet, sorgt die äußere Schleife für die Bearbeitung des nächsten Zeichens des Endstrings. Die Tatsache, dass dies rückwärts gemacht wurde ist spezifisch für den XP-Produktkey und kann natürlich auch umgekehrt gemacht werden bei der Kodierung eigener Daten.
Ich habe mich für diesen Thread schonmal explizit mit der Base24-Kodierung des Windows XP-Produktkeys beschäftigt:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-104590.html