Frage zu base64 Kodierung / OpenSSL Api
-
Hallo Forum!
Zur Zeit bastel ich ein wenig an einem Mail Client und versuche momentan, Anhänge zu implementieren. Für die base64 Kodierung verwende ich die OpenSSL API. Es scheint jedoch noch nicht 100%ig zu klappen.
Als Testanhang dient ein Bild, welches ich mir vorab zu Überprüfungszwecken per Thunderbird geschickt habe. Vergleiche ich den Quelltext der Mail, die ich von meinem Programm aus verschicke, mit dem der Mail, die ich per Thunderbird verschickt habe, fällt auf, dass die base64 Kodierung der funktionierenden Variante (Thunderbird) um genau 8 Zeichen längere Zeilen hat. Hier die ersten drei Zeilen der Datei in base64:
Thunderbird
/9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABABAgAUAAAA rAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgBAwABAAAAAgAAADIB AgAUAAAA3AAAABMCAwABAAAAAgAAAGmHBAABAAAA8AAAAAwPAAAgICAgICAgICAgICAgICAg
Mein Programm
/9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABAB AgAUAAAArAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgB AwABAAAAAgAAADIBAgAUAAAA3AAAABMCAwABAAAAAgAAAGmHBAABAAAA8AAAAAwP
Die restlichen Dinge wie korrekte MIME-Formatierung und boundaries scheinen alle in Ordnung zu sein. In der Tat zeigt Thunderbird den Anhang als solchen auch zunächst an, nur bei anschließendem Versuch, diesen zu entschlüsseln, kommt es dann zu Fehlern.
Der Code, mit dem ich die base64 Kodierung durchführe, sieht wie folgt aus und orientiert sich exakt an den Beispielen, die man hierzu u.a. in der OpenSSL Doku finden wird:
long size; FILE *f = fopen(argv[2], "rb"); BIO *bio, *b64; /* get file size */ fseek(f, 0, SEEK_END); size = ftell(f); fseek(f, 0, SEEK_SET); /* read in file */ char file[size+1]; fread(file, size, 1, f); /* base64 encode the file */ int enc_size = 4*ceil((double) (size+1)/ 3); b64_buffer = (char *) malloc (enc_size+1); FILE *s = fmemopen(b64_buffer, enc_size+1, "w"); b64 = BIO_new(BIO_f_base64()); bio = BIO_new_fp(s, BIO_NOCLOSE); bio = BIO_push(b64, bio); BIO_write(bio, file, size); BIO_flush(bio); BIO_free_all(bio); fclose(s);
Vielleicht vergesse ich irgendetwas und es kennt sich der ein oder andere genau mit dieser Problematik aus? Würde mich über jegliche Hilfe freuen. Gruß!
-
Hallo per,
die Länge der einzelnen Zeilen sollte keinen Unterschied machen, sofern die Inhalte gleich sind (s.a. Base64).
Passt denn das Ende des Base64-codierten Texts (einige Implementierungen haben Probleme mit der korrekten Umsetzung damit, d.h. Anhängen der '='-Zeichen).
-
Ok. Wenn es nicht an den Zeilendarstellungen liegen dürfte, schätze ich, dass ich eventuell an anderer Stelle nicht ganz Protokoll-konform arbeite. Ich werde mal ein wenig genauer nach anderen Ursachen Ausschau halten und zur Not einfach den Code ausführlicher zitieren.
EDIT: Und ja, das Ende stimmt mit dem funktionierenden Quelltext überein (bis auf den Zeilenumbruch, versteht sich).
Thunderbird
47VftYgTyAOPzouFhzW5OOMnPeoJbIMS5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VN b3e9vQAUFH//2Q== --------------050000040908070009030908--
Meins
MGMVUXDHg+lOkiV0BCknODQIz5LQxuVA47VftYgTyAOPzouFhzW5OOMnPeoJbIMS 5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VNb3e9vQAUFH//2Q== ---------------088970564400596--
-
So. Da ich weiterhin keinen Grund sehe, weshalb mein Anhang nicht korrekt entschlüsselt werden sollte, zitiere ich folgend einmal die wichtigen Infos aus meiner Mail. Da hieraus auch ersichtlich werden sollte, welche Informationen an den Server geschickt werden, dürften wir um den Quellcode in diesem Falle herumkommen. So spannend ist der schließlich nicht. Dort, wo Sternchen stehen, wurden sensible Daten unkenntlich gemacht, und eckige Klammern deuten eine Auslassung an. Offensichtliches.
[...] Date: Sat, 13 Apr 2013 14:22:13 +0000 From: *** <***> MIME-Version: 1.0 To: <***> Subject: fifth test Content-Type: multipart/mixed; boundary="---------------088970564400596" [...] This is a multi-part message in MIME format. ---------------088970564400596 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 8bit this is test. ---------------088970564400596 Content-Type: image/jpeg; name="***.JPG" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="***.JPG" /9j/4TP+RXhpZgAASUkqAAgAAAAKAA4BAgAgAAAAhgAAAA8BAgAGAAAApgAAABAB AgAUAAAArAAAABIBAwABAAAAAQAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgB [...] MGMVUXDHg+lOkiV0BCknODQIz5LQxuVA47VftYgTyAOPzouFhzW5OOMnPeoJbIMS 5bd7elAGQti24gcDvV5d0UeF4H1oAcJG8snOT7VNb3e9vQAUFH//2Q== ---------------088970564400596--
Vielleicht wird dem einen oder anderen hieraus ersichtlich, wo der Fehler liegen könnte! Danke schonmal für jede Hilfe!