PHP » Wasserzeichen in Bilder einbetten

Diese Klasse ist für PHP4 ausgelegt und läuft bei E_ALL ohne Fehlermeldungen — mit E_STRICT unter PHP5 hingegen gibt's Probleme. Sie arbeitet unperformant und macht mit sehr großen oder nicht-PNG-Bildern Probleme (Farben aller Pixel in ein Array laden etc). Sie ist auch mehr als Programmierbeispiel als als perfekte Praxislösung gedacht.

Die PHP-Klasse steg enthält drei relevante Funktionen: img_encode, img_decode und img_clear. img_encode dient dazu, einen Text in einem Bild zu verstecken. img_decode soll diesen Text wieder herauslesen können, und img_clear ein Bild mit sinnlosen Informationen beschreiben, und somit jeglichen Text daraus entfernen.

Die Theorie

Die Theorie habe ich von http://www.kuno-kohn.de/crypto/stegano.htm geklaut. Sie basiert darauf, dass die Farben in einem Bild in dem RGB-Format angegeben werden, also dem Rot-, Grün- und Blauanteil, in Werten zwischen 0 und 255. Es soll in diesen Farbwerten ein beliebiger Text versteckt werden. Zunächst wird der Text in ein binäres Format verwandelt, damit er nur noch aus 0- bzw. 1-Bits besteht, 8 Bits ergeben ein Zeichen (1 Byte). Um jetzt diese Bits in den Farbanteilen zu verstecken, geht man wie folgt vor: man verändert den Wert eines Farbanteils auf einen ungeraden Wert, wenn ein 0-Bit gespeichert werden soll, und auf einen geraden, wenn ein 1-Bit gespeichert werden soll. Beim Auslesen muss nurnoch ein MOD 2 ausgeführt werden, und man hat das ursprüngliche Bit. MOD ist der Rest bei einer Teilung, d. h. 57 MOD 2 = 1, 56 MOD 2 = 0.

Texte so zu verstecken, dass der Feind nicht einmal mitbekommt das diese vorhanden sind, heißt Steganografie. Steganografie ist aber kein alleiniger Schutz — in unserem Fall könnte der Feind ja das gleiche Programm einsetzen und ein Bild überprüfen. Deswegen sollte Steganografie mit Kryptografie, also Verschlüsselung kombiniert werden. Das hat auch den Vorteil, dass der Angreifer nicht einmal sicher sein kann, ob die Daten verschlüsselt sind, er sie falsch ausgelesen hat, oder garkeine Daten da sind. Wenn aber Klartext-Daten im Bild sind, merkt er sofort dass da etwas steht. Andernfalls kommt Zeichenwirrwarr raus. Eine wirksame Verschlüsselung ist z. B. RSA, implementiert in PGP und GnuPG.

Einsatzzwecke

Steganografie kann für Wasserzeichen verwendet werden: Wenn eine unsichtbare Nachricht in einem Bild versteckt ist, kann später überprüft werden, von wem das Bild stammt. Theoretisch kann man natürlich auch versteckt kommunizieren.

PHP-Beispiele

Diese drei Beispiele zeigen das En- und Dekodieren sowie «säubern» von PNG-Bildern. Die GD-Library ist zur Ausführung notwendig, und es muss natürlich die steg.php im gleichen Verzeichnis wie der Beispiel-Code liegen. Bitte beachte, dass der Code ziemlich einfach gehalten ist, und sich sicher auch mehr Daten in ein Bild packen liesen, in dem man z. B. statt einem Bit gleich zwei pro Farbwert speichert (mit MOD 3 und MOD 4).

Verwendungsbeispiel
Quellcode ansehen | Herunterladen
Die Klasse
Quellcode ansehen | Herunterladen

© 2009 Julian von Mendel (http://derjulian.net) | Datum: 21.11.2017