Dateien verschlüsseln mit openssl_pkcs7_encrypt

Um Dateien mit der OpenSSL Funktion openssl_pkcs7_encrypt verschlüsseln zu können müssen vorher privater und öffentlicher Schlüssel erzeugt und signiert im System vorliegen. Zumindest benötigt man ein öffentliches Zertifikat mit dem man die Datei verschlüsseln kann. Für die Entschlüsselung der Dateien benötigt man aber immer den privaten Schlüssel, um den vollständigen Durchlauf (Ver- und Entschlüsselung) machtn zu können, benötigt man daher sowieso beide Schlüssel.

/* encrypt the in file */
try{
	$enc = openssl_pkcs7_encrypt ($inFile, $outFile, $certout, $header);
}catch(Exception $e){
	while ($msg = openssl_error_string()){
			echo $msg . "<br />\n";
		}
}

Schauen wir uns mal die Eingabeparameter genauer an:

$inFile
Die Variable muss den Pfad und den Dateinamen der zuverschlüsselnden Datei enthalten.

$outFile
Diese Variable muss den Ausgabepfad mit Dateinamen enthalten in den der verschlüsselte Inhalt gespeichert werden soll.

$certout
In dieser Variable muss der öffentliche Schlüssel enthalten sein. Wenn ihr den Schlüssel als Datei auf der Lokalen Festplatte gespeichert habt, müsst ihr diesen vor dem Aufruf in die Variable einlesen und übergeben.

$header
Das Ausgabeformat der Verschlüsselten Datei ist SMIME. Das ist ein Standard der aus der SMTP Kommunikation stammt. MIME ist quasi der Standard für die Formatierung von Emails und das S vor dem MIME ist quasi der Secure Zusatz zur Email. In diesen Header werden quasi Adressierungsinformationen geschrieben. Macht ja sinn, da man der verschlüsselten Nachricht ja nicht unbeding ansieht was drinnen steckt, von wem sie ursprünglich kommt und für wen die Nachricht verschlüsselt wurde.
Der Header ist simpel aufgebaut und wird als array an die Funktion openssl_pkcs7_encrypt übergeben:

$header = array("FROM" =&gt; "Me", "TO" =&gt; "You", "SUBJECT" =&gt; "SUBJECT");

Wenn die Datei erfolgreich verschlüsselt wurde, enthält die Variable $enc den boolischen Wert TRUE. Wenn beim Verschlüsselungsvorgang etwas schiefgegangen ist, wird der Wert FALSE zurückgegeben.

Die verschlüsselte Datei im Texteditor sieht nach erfolgreichem Aufruf der Funktions so aus:

FROM: Me
TO: You
SUBJECT: SUBJECT
MIME-Version: 1.0
Content-Disposition: attachment; filename=“smime.p7m“
Content-Type: application/x-pkcs7-mime; smime-type=enveloped-data; name=“smime.p7m“
Content-Transfer-Encoding: base64

MIIDjgYJKoZIhvcNAQcDoIIDfzCCA3sCAQAxggFFMIIBQQIBADCBqTCBozELMAkG
A1UEBhMCREUxDzANBgNVBAgTBkhFU1NFTjEaMBgGA1UEBxMRT2ZmZW5iYWNoIGFt
IE1haW4xDDAKBgNVBAoTA0dBQzEMMAoGA1UECxMDR0FDMRswGQYDVQQDExJBbmRy
ZWFzIEJhc3Nlcm1hbm4xLjAsBgkqhkiG9w0BCQEWH2EuYmFzc2VybWFubkBuZXR6
d2Vyay1kZXNpZ24uZGUCAQAwDQYJKoZIhvcNAQEBBQAEgYDQoorxgH2w1JTbx/hc
G2EXjeRmqEithdwfqoFdjseem2IMiWqW/JGZSk6esu3oElNcpuz1G4u9GpPuSUAJ
mo0K7M1RQPvJU2zwGTkc0tIcCvU7fpbhHDy2gaA9ewN8ED7wcX0QO3QJHD4RXBub
KKhBO3qq4cQOyCuGibdXj9SsfjCCAisGCSqGSIb3DQEHATAaBggqhkiG9w0DAjAO
AgIAoAQIn1mhFh33T+eAggIAEttKez1kKOVkKLKZZTATh0R9cLs+hYXq0HR6I2K9
48Sq8qDpFm9TjliTMDuTwX9Be3ImauUwyqfnYdiDpUfQ/YtE1U/or6Qj+4lOOa1D
/TGJspz5mzaL/s3qRBZNBHpDvtFAmTEe2+SSkY02iHRcGsuP2cZVJCzqHX8ne2Gn
J+wRmXVYSMeBvr9XWs/2MLk7KnQf5ERb1F/Fv0AGRS/iCSieyWgGj23pWeQ7qfc/
PBOYb1E0zS3eoPOc4LXstkPoO6Dk/XDO9TgfV5tpRs1U81ouZQck097aNDF7/+mU
UHG+MWG7HkKiuIZ9TXckuAQa/oHnw1191cbgwyYfEZTmWG3I9PYvFq7FqZDaRifs
ROOLFQmeP9BUZvSjcQ3vnNmywPwffjs29ZYTft2D1j4K9JGxaPR4Oa+V9tz3tRha
nxXdq6dvjHyfOxaSK+KrITmpfAxbrF8RSBKr1U36ebRWlNKJ2mUjcSAHOu8q/+yS
AydoKk70dgfUvWcJZaDjk7Nnpokkkv7CkWvhSG8MeSbSHhsDoE6ieFzVqoRGwMKp
YHVS0Aal5U582OVKhjLb18oPt2qSqwSFITHJz8Ai5bYjYWu5aZih+ToiIbRwtj+U
sW5OIo9KAPuNIcUqRB6MKHDbMNF3Dz4w65J1IBwZnFNdMEa0wbXd7WYCEUFUvhiz
b1U=

Man kann recht klar die Elemente des Headers und den verschlüsselten Inhalt erkennen. Man könnte diese Datei jetzt auch einfach über das SMTP Protokoll versenden (wenn in den From und To richtige Emailadressen drinnen stehen!!) und das würde von vielen Emailprogrammen und Emailprovidern erkannt werden.

http://www.agile-coding.net/dateien-verschluesseln-mit-openssl_pkcs7_encrypt/