Nachdem ich gestern den Beitrag über RSA veröffentlicht hatte, bekam ich Lust mich an base64 zu versuchen.
Auch das konnte ich gestern erfolgreich umsetzen.
Was ist base64?
Base64 ist kein Verschlüsselungsalgorithmus in dem Sinne, sondern nur ein Chiffre-Algorithmus, welcher eine Zeichenkette in eine andere umwandelt. Hierzu benötigt man nicht so viele mathematische Operationen, bis auf die Umwandlung eines Integers in eine Binärzahl und umgekehrt.
Wie funktioniert base64?
Bei der Chiffrierung wird zunächst jedes Zeichen in seinen entsprechenden ASCII-Zeichencode umgewandelt, welcher daraufhin in seine binäre Darstellung umgerechnet wird.
Den Binärcode gilt es auf 2 Byte zu vergrößern, in dem man vorne entsprechend Nullen auffüllt, bis der Binärcode 8 Stellen lang ist.
Die einzelnden Binärcodes der Zeichen werden dann zu einem Langen zusammengeführt.
Nun hängt man an diesen Binärcode solange 8 Nullen an, bis die eigentliche Textlänge Modulo 3 Null ergibt (len(text) % 3 == 0).
Der nun enstandene Binärcode wird dann in Päkchen von jeweils 6 Bit unterteilt.
Jedes Päkchen wird daraufhin in einen Integer umgerechnet.
Diese Zahl stellt den Index des Buchstaben im base64-Alphabet dar.
Für die Päkchen, welche aus Nullen bestehen, wird ein “=” gesetzt. (000000=>”=”)
Bei der Dechiffrierung sind die Schritte rückwärts durchzuführen. Besonders dabei ist, dass alle Zeichen, welche nicht im base64-Alphabet stehen, ignoriert werden.
Zunächst entfernt man alle nicht-base64-Alphabet Zeichen aus dem Chiffrat.
Danach holt man sich den Index des Zeichens aus dem Alphabet, wo bei “=” einfach ignoriert wird.
Den Index wandelt man in seine Binärdarstellung um, und verlängert ihn auf 6 Bit von vorne mit Nullen.
Die einzelnden Binärcodes werden wieder zu einem Langen zusammengefügt.
Es folgt eine Unterteilung in 8 Bit große Pakete.
Diese werden in den entsprechenden ASCII-Code umgewandelt und die Zeichen zu einem String zusammengefügt.
Fertig ist die Dechiffrierung.
Meine Implementierung in Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
|
Den Source findet ihr auch in meinem Git-Repo
Gruß
gehaxelt