base64 - Binärdaten mit ASCII Zeichen verschlüsseln

Link zu Doug Hellmanns Original Artikel

Zweck: Das base64 Modul enthält Funktionen zur Übersetzung von Binärdaten in eine Untermenge des ASCII Zeichensatzes. Diese können bei Übertragungen mittels Klartext Protokollen genutzt werden.
Python: ab 1.4

Die base64, base32 und base16 Zeichenkodierungen konvertieren 8 Bit Bytes zu Werten mit 6, 5 und 4 Bits Nutzdaten pro Byte, welches Nicht-ASCII Bytes erlaubt als ASCII Zeichen kodiert zu werden und von Klartextprotokollen, wie SMTP, übertragen zu werden. Die Basiswerte korrespondieren zu den Längen der Alphabete, die in den jeweiligen Zeichenkodierungen verwendet werden. Es gibt auch URL-sichere Varianten der Originalkodierungen, die leicht abweichende Ergebnisse benutzen.

Base64 Zeichenkodierung

Ein einfaches Beispiel für die Kodierung eines Textes sieht wie folgt aus:

import base64

initial_data = open(__file__, 'rt').read()

encoded_data = base64.b64encode(initial_data)

num_initial = len(initial_data)
padding = { 0:0, 1:2, 2:1 }[num_initial % 3]

print '%d Bytes vor der Verschlüsselung' % num_initial
print 'Erwarte %d Füll-Bytes' % padding
print '%d Bytes nach der Verschlüsselung' % len(encoded_data)
print
print encoded_data

Die Ausgabe zeigt wie die 558 Bytes der Originalquelle auf 744 Bytes nach der Verschlüsselung erweitert wurden.

Hinweis: Die Bibliothek erzeugt keine Zeilenumbrüche, diese sind nur zur besseren Lesbarkeit eingefügt worden.

558 Bytes vor der Verschlüsselung
Erwarte 0 Füll-Bytes
744 Bytes nach der Verschlüsselung

IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgZW5
jb2Rpbmc6IHV0Zi04CiMKIyBDb3B5cmlnaH
QgKGMpIDIwMDggRG91ZyBIZWxsbWFubiBBb
GwgcmlnaHRzIHJlc2VydmVkLgojCiIiIgoi
IiIKCl9fdmVyc2lvbl9fID0gIiRJZDogYmF
zZTY0X2I2NGVuY29kZS5weSAxNTI1IDIwMD
gtMDctMjAgMTM6MjM6MzVaIGRoZWxsbWFub
iAkIgojZW5kX3B5bW90d19oZWFkZXIKCmlt
cG9ydCBiYXNlNjQKCmluaXRpYWxfZGF0YSA
9IG9wZW4oX19maWxlX18sICdydCcpLnJlYW
QoKQoKZW5jb2RlZF9kYXRhID0gYmFzZTY0L
mI2NGVuY29kZShpbml0aWFsX2RhdGEpCgpu
dW1faW5pdGlhbCA9IGxlbihpbml0aWFsX2R
hdGEpCnBhZGRpbmcgPSB7IDA6MCwgMToyLC
AyOjEgfVtudW1faW5pdGlhbCAlIDNdCgpwc
mludCAnJWQgYnl0ZXMgYmVmb3JlIGVuY29k
aW5nJyAlIG51bV9pbml0aWFsCnByaW50ICd
FeHBlY3QgJWQgcGFkZGluZyBieXRlcycgJS
BwYWRkaW5nCnByaW50ICclZCBieXRlcyBhZ
nRlciBlbmNvZGluZycgJSBsZW4oZW5jb2Rl
ZF9kYXRhKQpwcmludApwcmludCBlbmNvZGV
kX2RhdGEK

Base64 Entschlüsselung

Der verschlüsselte String kann in das Original zurück konvertiert werden, indem 4 Bytes in die ursprünglichen 3 Bytes konvertiert werden. Die b64decode() Funktion erledigt dies für Sie.

import base64

original_string = 'Das sind die Daten im Klartext.'
print 'Original:', original_string

encoded_string = base64.b64encode(original_string)
print 'Verschlüsselt :', encoded_string

decoded_string = base64.b64decode(encoded_string)
print 'Entschlüsselt :', decoded_string

Der Verschlüsselungsprozess schaut bei den Eingabedaten nach jeder Sequenz von 24 Bits und verschlüsselt diese verteilt über 4 Bytes. Die letzten beiden Zeichen, die == sind Füllzeichen, da die Anzahl der Bits im Originaltext nicht durch 24 teilbar waren.

Original: 'Das sind die Daten im Klartext.
Verschlüsselt : RGFzIHNpbmQgZGllIERhdGVuIGltIEtsYXJ0ZXh0Lg==
Entschlüsselt : This is the data, in the clear

URL-erhaltende Varianten

Da das Standard base64 Alphabet die Zeichen + und / verwendet und diese beiden Zeichen in URLs genutzt werden, ist es erforderlich geworden, alternative Verschlüsselungen für diese zu finden. Das + wird durch - ersetzt und der / wird durch einen (_) ersetzt. Ansonsten bleibt das Alphabet unverändert.

import base64

for original in [ chr(251) + chr(239), chr(255) * 2 ]:
    print 'Original         :', repr(original)
    print 'Standard Verschlüsselung:', base64.standard_b64encode(original)
    print 'URL-erhaltende Verschlüsselung:', base64.urlsafe_b64encode(original)
    print

Standard Verschlüsselung: ++8=
URL-erhaltende Verschlüsselung: --8=

Standard Verschlüsselung: //8=
URL-erhaltende Verschlüsselung: __8=

Andere Verschlüsselungen

Neben base64, stellt das Modul Funktionen für base32 und base16 (hex) verschlüsselte Daten bereit.

import base64

original_string = 'Das sind die Daten im Klartext.'
print 'Original:', original_string

encoded_string = base64.b32encode(original_string)
print 'Verschlüsselt :', encoded_string

decoded_string = base64.b32decode(encoded_string)
print 'Entschlüsselt :', decoded_string


Original: Das sind die Daten im Klartext.
Encoded : IRQXGIDTNFXGIIDENFSSARDBORSW4IDJNUQEW3DBOJ2GK6DUFY======
Decoded : Das sind die Daten im Klartext.

Die base16 Funktionen arbeiten mit dem hexadezimalen Alphabet.

import base64

original_string = 'Das sind die Daten im Klartext.'
print 'Original:', original_string

encoded_string = base64.b16encode(original_string)
print 'Verschlüsselt :', encoded_string

decoded_string = base64.b16decode(encoded_string)
print 'Entschlüsselt :', decoded_string



Original: Das sind die Daten im Klartext.
Verschlüsselt : 4461732073696E642064696520446174656E20696D204B6C6172746578742E
Entschlüsselt : Das sind die Daten im Klartext.

Siehe auch

base64

Die Dokumenation der Standardbibliothek für dieses Modul.

RFC 3548

Die Base16, Base32 und Base64 Daten Verschlüsselungen.

In der Übersetzung