Gehaxelts Blog

IT-Security & Hacking

Base64 in Python nachgebaut

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
#Encoding: UTF-8
import re
 
#Encode a text with base64
def base64Encode(text):
        alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"]
        bit_str=""      
        base64_str=""
 
        #Loop through all chars concatenate them as binary string
        for char in text:
                bin_char = bin(ord(char)).lstrip("0b")
                bin_char = (8-len(bin_char))*"0" + bin_char
                bit_str += bin_char
 
        #Add zero till text-length is divideable through 3
        while (((len(text)) % 3) != 0):
                bit_str += "00000000"   
                text += "0"
        
        #Split bit_str into 6bit long brackets
        brackets = re.findall('(\d{6})', bit_str)
 
        #Encode the brackets
        for bracket in brackets:
                if(bracket=="000000"):
                        base64_str+="="
                else:
                        base64_str+=alphabet[int(bracket,2)]
        return base64_str
 
#Decode a base64 chiffre
def base64Decode(chiffre):
        alphabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"]
        bit_str=""
        text_str=""
        
        #Loop through every char
        for char in chiffre:
                #Ignore characters, which are not in the alphabet. Concatenate the binary representation of alphabet index of char 
                if char in alphabet:
                        bin_char = bin(alphabet.index(char)).lstrip("0b")
                        bin_char = (6-len(bin_char))*"0" + bin_char
                        bit_str += bin_char
        
        #Make 8bit - 2byte brackets
        brackets = re.findall('(\d{8})', bit_str)
 
        #Decode char binary -> asciii
        for bracket in brackets:
                        text_str+=chr(int(bracket,2))
 
        return text_str
 
 
to_encode="Gehaxelts Python base64"
 
print "String to be encoded:"+to_encode
print "Base64 encoded:"
encoded= base64Encode(to_encode)
print encoded
 
print "Base64 decoded:"
decoded= base64Decode(encoded)
print decoded

Den Source findet ihr auch in meinem Git-Repo

Gruß

gehaxelt

Texttutorials

« RSA in Python nachgestellt Die erste Woche an der Uni »