Implentiert wurde eine Base64 Funktion, die eine Textdatei ausliest und codiert.
Ich würde gerne den decodierten String wieder in eine Textdatei schreiben. Doch er schreibt mir an bestimmten Stellen immer das/die Zeichen "\00" hinein.
Woher diese kommen verstehe ich nicht und die Textdatei lässt sich auch nicht ohne Probleme öffnen.
Wenn ich den Dekodierten und Kodierten String aber auf Kommandozeile ausgebe bzw. ein "cat output.txt" machen wird alles richtig dargestellt.
Der Code sollte noch eine Base16 und Base32 enthalten. Dieser wurde aus Übersichtgründen herausgenommen. (hätte auch noch nicht funktioniert)
Hier mal mein Code.
./base binary // Liest die angegebene Textdatei aus und verschluesselt sie. Dabei wird eine Datei "verschluesselung_base64" erzeugt.
./base output.txt // Legt die Datei output.txt an und schreibt den dekodierten String hinein. Dabei wird die Datei "verschluesselung_base64" automatisch ausgelesen
Code: Alles auswählen
import base64
import StringIO
def encode_base64(argument, lookup):
foutput = open("verschluesselung_base64", "w")
finput = open(argument, "r")
#aus = ''
#for line in finput:
# encoded = base64.b64encode(line)
# aus = aus + encoded
#print "Decode: %s" %aus
ausgabe = ''
for line in finput:
it = []
it = ( line[i:i+3] for i in xrange(0, len(line), 3) )
#for i in line:
for item in it:
#print item
if len(item) == 2:
bin = 0
bin = ((ord(item[0])) << 16) | ((ord(item[1])) << 8)
arr = []
arr = [((bin >> 18) & 63), ((bin >> 12) & 63), ((bin >> 6) & 63)]
ausgabe += lookup[arr[0]] + lookup[arr[1]] + lookup[arr[2]] + '='
elif len(item) == 1:
bin = 0
bin = ((ord(item[0])) << 16)
arr = []
arr = [((bin >> 18) & 0x00003F), ((bin >> 12) & 0x00003F)]
ausgabe += lookup[arr[0]] + lookup[arr[1]] + '=' + '='
else:
bin = 0
bin = ((ord(item[0])) << 16) | ((ord(item[1])) << 8) | (ord(item[2]))
arr = []
arr = [((bin >> 18) & 0x00003f), ((bin >> 12) & 0x00003F), ((bin >> 6) & 0x00003F), (bin & 0x00003F)]
ausgabe += lookup[arr[0]] + lookup[arr[1]] + lookup[arr[2]] + lookup[arr[3]]
#print ("Kodiert: %s") %ausgabe
foutput.write(ausgabe)
foutput.close()
finput.close()
def decode_base64(argument, lookup):
alpha = { "A":0, "B":1, "C":2, "D":3, "E":4, "F":5, "G":6, "H":7, "I":8, "J":9, "K":10, "L":11, "M":12, "N":13,
"O":14, "P":15, "Q":16, "R":17, "S":18, "T":19, "U":20, "V":21, "W":22, "X":23, "Y":24, "Z":25, "a":26,
"b":27, "c":28, "d":29, "e":30, "f":31, "g":32, "h":33, "i":34, "j":35, "k":36, "l":37, "m":38, "n":39,
"o":40, "p":41, "q":42, "r":43, "s":44, "t":45, "u":46, "v":47, "w":48, "x":49, "y":50, "z":51, "0":52,
"1":53, "2":54, "3":55, "4":56, "5":57, "6":58, "7":59, "8":60, "9":61, "+":62, "/":63 }
finput = open("verschluesselung_base64", "r")
foutput = open(argument, "w")
kette = ''
for line in finput:
#line = line.strip()
it = ( line[i:i+4] for i in xrange(0, len(line), 4) )
for item in it:
anzahl = item.count("=")
org = len(item) - anzahl
newitem = item[0:org]
#print "%s --- %i --- %i --- %s" %(item, anzahl, org, newitem)
laenge = len(newitem)
if laenge == 3:
bin = 0
bin = ((alpha[newitem[0]]) << 18) | ((alpha[newitem[1]]) << 12) | ((alpha[newitem[2]]) << 6)
kette = kette + chr((bin >> 16) & 0x0000FF) + chr((bin >> 8) & 0x0000FF) + chr(bin & 0x0000FF)
elif laenge == 2:
bin = 0
bin = ((alpha[newitem[0]]) << 18) | ((alpha[newitem[1]]) << 12)
kette = kette + chr((bin >> 16) & 0x0000FF) + chr((bin >> 8) & 0x0000FF) + chr(bin & 0x0000FF)
elif laenge == 1:
bin = 0
bin = ((alpha[newitem[0]]) << 18)
kette = kette + chr((bin >> 16) & 0x0000FF) + chr((bin >> 8) & 0x0000FF) + chr(bin & 0x0000FF)
else:
bin = 0
bin = ((alpha[newitem[0]]) << 18) | ((alpha[newitem[1]]) << 12) | ((alpha[newitem[2]]) << 6) | (alpha[newitem[3]])
kette = kette + chr((bin >> 16) & 0x0000FF) + chr((bin >> 8) & 0x0000FF) + chr(bin & 0x0000FF)
#print "Dekodiert: %s" %kette
#kette = kette.strip()
foutput.write(kette)
finput.close()
foutput.close()
# 4 Bit pro Zeichen
def my_base16(argument, option):
table = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', "A", "B", "C", "D", "E", "F"]
if option == 1:
encode_base16(argument, table)
else:
decode_base16(argument)
# 5 Bit pro Zeichen
def my_base32(text, option):
code = {0:"A", 1:"B", 2:"C", 3:"D", 4:"E", 5:"F", 6:"G", 7:"H", 8:"I", 9:"J", 10:"K",
11:"L", 12:"M", 13:"N", 14:"O", 15:"P", 16:"Q", 17:"R", 18:"S", 19:"T", 20:"U",
21:"V", 22:"W", 23:"X", 24:"Y", 25:"Z", 26:'2', 27:'3', 28:'4', 29:'5', 30:'6',
31:'7'}
if option == 1:
encode_base32(text, code)
else:
decode(text, code)
# 6 Bit pro Zeichen
def my_base64(argument, option):
code = ["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', "+", "/"]
if option == 1:
encode_base64(argument, code)
else:
decode_base64(argument, code)