
Letztes Jahr bin ich bei einem CTF auf eine Steganographie-Aufgabe gestossen, bei der ich zwei Stunden lang ein Katzenfoto angestarrt habe. Das Bild sah voellig normal aus; 800x600 Pixel einer orangefarbenen Tigerkatze, die auf einer Tastatur sass. Keine Metadaten-Anomalien, keine angehaengten ZIP-Dateien, keine offensichtlichen Artefakte. Die Flagge versteckte sich in den niederwertigsten Bits des Blaukanals. Nach der Extraktion war die Nachricht 43 Zeichen lang. Die Katze hatte sich kein bisschen veraendert.
Diese Erfahrung hat mich in einen Kaninchenbau gefuehrt. Steganographie ist eines dieser Themen, die nach Hacker-Fiktion aus Filmen klingen, bis man es tatsaechlich ausprobiert. Dann merkt man, dass es einfach Mathematik ist; und ueberraschend einfache Mathematik dazu.
Was Steganographie wirklich ist
Steganographie ist die Praxis, Daten in anderen Daten zu verbergen, sodass niemand von der Existenz der versteckten Daten weiss. Das unterscheidet sich grundlegend von Kryptographie. Verschluesselung macht eine Nachricht unlesbar; Steganographie verbirgt die Nachricht so, dass niemand ueberhaupt danach sucht.
Dieser Unterschied ist entscheidend. Eine verschluesselte Datei schreit foermlich "Ich habe Geheimnisse!". Ein Stego-Bild sagt nichts. Es ist ein Foto einer Katze. Oder eines Sonnenuntergangs. Oder Ihres Firmenlogos. Die beste Steganographie erzeugt Traegerdateien, die statistisch nicht von unveraenderten Originalen zu unterscheiden sind.
Das Wort selbst stammt aus dem Griechischen: steganos (bedeckt) + graphein (schreiben). Die Technik gibt es seit dem antiken Griechenland; Herodot berichtete von einem Mann, der den Kopf eines Sklaven rasierte, eine Nachricht auf die Kopfhaut taetowierte, wartete bis die Haare nachgewachsen waren, und den Sklaven dann als Boten schickte. Seitdem sind wir zu Pixeln uebergegangen.
Wie LSB-Kodierung funktioniert
Die gaengigste Technik der Bildsteganographie ist die Least Significant Bit (LSB)-Kodierung. Hier ist der Grund, warum sie funktioniert.
Ein Pixel in einem 24-Bit-RGB-Bild hat drei Farbkanaele, die jeweils als 8-Bit-Wert (0-255) gespeichert werden. Das letzte Bit jedes Bytes; das niederwertigste Bit; traegt die kleinstmoegliche Aenderung zum Farbwert bei. Sein Umschalten aendert den Kanalwert um genau 1. Der Unterschied zwischen RGB(142, 87, 203) und RGB(143, 87, 202) ist fuer das menschliche Auge unsichtbar.
Man nimmt also seine geheime Nachricht, wandelt sie in Binaercode um und ersetzt die LSBs der Bildpixel durch die Nachrichtenbits. Jedes Pixel liefert 3 Bits Speicherplatz (eines pro Kanal). Ein 1920x1080-Bild hat 2.073.600 Pixel; das sind 6.220.800 Bits Speicherplatz, also rund 760 KB an versteckten Daten. In der Praxis wuerde man deutlich weniger nutzen, um einer Erkennung zu entgehen, aber die theoretische Kapazitaet ist enorm.
Hier ist eine minimale Python-Implementierung zur Veranschaulichung:
from PIL import Image
import numpy as np
def text_to_bits(text):
"""Convert text to a binary string with a null terminator."""
bits = ''.join(format(ord(c), '08b') for c in text)
bits += '00000000' # null terminator to mark end of message
return bits
def hide_message(image_path, message, output_path):
"""Hide a message in the LSBs of an image."""
img = Image.open(image_path).convert('RGB')
pixels = np.array(img)
flat = pixels.flatten()
bits = text_to_bits(message)
if len(bits) > len(flat):
raise ValueError(f"Message too long: need {len(bits)} bits, have {len(flat)}")
for i, bit in enumerate(bits):
# Clear the LSB, then set it to our message bit
flat[i] = (flat[i] & 0xFE) | int(bit)
stego = flat.reshape(pixels.shape)
Image.fromarray(stego.astype('uint8')).save(output_path, 'PNG')
print(f"Hidden {len(message)} chars in {len(bits)} bits ({len(bits)/len(flat)*100:.4f}% of capacity)")
def extract_message(image_path):
"""Extract a hidden message from the LSBs of an image."""
img = Image.open(image_path).convert('RGB')
flat = np.array(img).flatten()
bits = ''.join(str(b & 1) for b in flat)
chars = []
for i in range(0, len(bits), 8):
byte = bits[i:i+8]
if byte == '00000000':
break
chars.append(chr(int(byte, 2)))
return ''.join(chars)
# Usage
hide_message('cat.png', 'The flag is CTF{hidden_in_plain_sight}', 'stego_cat.png')
print(extract_message('stego_cat.png'))
Die entscheidende Operation steht in Zeile 18: (flat[i] & 0xFE) | int(bit). Das bitweise UND mit 0xFE (11111110 im Binaersystem) loescht das LSB, und das ODER setzt es auf das jeweilige Bit unserer Nachricht. Das ist der gesamte Trick. Alles andere ist nur die Umwandlung von Text in Bits und das Iterieren ueber Pixel.
Eine Nachricht Schritt fuer Schritt verstecken
Falls Sie kein Python schreiben moechten; oder an einem Rechner sitzen, auf dem PIL nicht installiert werden kann; erledigt das Steganographie-Tool auf Kitmul dasselbe direkt im Browser. Kein Hochladen, keine Serververarbeitung. Das Bild verlaesst niemals Ihr Geraet.
So funktioniert der Ablauf:
- Laden Sie ein Traegerbild hoch. PNG eignet sich am besten, da es verlustfrei ist. JPEG-Komprimierung zerstoert Ihre versteckten Bits; dazu spaeter mehr.
- Geben Sie Ihre geheime Nachricht ein. Das Tool zeigt Ihnen die verfuegbare Kapazitaet basierend auf den Bildabmessungen an.
- Laden Sie das Stego-Bild herunter. Es sieht identisch mit dem Original aus. Pixel fuer Pixel sind die Unterschiede nicht wahrnehmbar.
Zum Extrahieren wechseln Sie in den Aufdecken-Modus, laden das Stego-Bild hoch, und der versteckte Text erscheint.

Die gesamte Operation laeuft clientseitig ueber die Canvas-API und Typed Arrays. Ihre geheime Nachricht beruehrt nie eine Netzwerkverbindung. Das ist wichtig; wenn Sie sensible Informationen verbergen, wuerde das Senden an einen Drittanbieter-Server den Zweck zunichtemachen.
Erkennung und Steganalyse; wie man NICHT auffliegt
Steganalyse ist die Kunst, Steganographie zu erkennen, und sie ist ausgefeilter als man vielleicht denkt.
Visuelle Inspektion erkennt keine LSB-Kodierung. Aber statistische Analyse schon. Der einfachste Test ist eine Chi-Quadrat-Analyse der Pixelwertverteilungen. In einem natuerlichen Bild haben Pixelwerte eine charakteristische Verteilung. LSB-Einbettung glaettet Wertepaare (z.B. werden 142 und 143 gleich wahrscheinlich), was als Anomalie im Histogramm sichtbar wird.
Tools wie StegExpose und OpenStego enthalten Erkennungsmodule. In CTF-Wettbewerben sind zsteg und steghide die bevorzugten Extraktionswerkzeuge.
Hier sind praktische Tipps, damit Ihr Stego-Bild einer Pruefung standhaelt:
- Nutzen Sie weniger Kapazitaet. Wenn Sie Daten nur in 10-20% der verfuegbaren Pixel einbetten, wird die statistische Erkennung deutlich schwieriger. 100% Kapazitaetsauslastung ist ein forensisches Warnsignal.
- Randomisieren Sie die Pixelauswahl. Statt sequentiell ab Pixel 0 zu schreiben, verwenden Sie eine pseudozufaellige Sequenz mit einem Passwort als Seed, um festzulegen, welche Pixel Daten tragen. So werden die Modifikationen gleichmaessig verteilt.
- Waehlen Sie unruhige Bilder. Fotos mit viel Textur, Rauschen und Farbvariation verbergen LSB-Aenderungen besser als glatte Farbverlaeufe oder einfarbige Flaechen. Ein Foto eines Waldbodens schlaegt ein Foto einer weissen Wand.
- Verwenden Sie niemals JPEG als Traeger. JPEGs verlustbehaftete Komprimierung veraendert Pixelwerte waehrend der Kodierung. Ihre versteckten Bits werden beim Speichern des Bildes zerstoert. Verwenden Sie fuer LSB-Steganographie immer PNG, BMP oder TIFF.
- Entfernen Sie Metadaten vor dem Teilen. EXIF-Daten, die zeigen, dass das Bild mit einem Steganographie-Tool bearbeitet wurde, sind ein offensichtlicher Hinweis.
Wann man Steganographie mit Verschluesselung kombinieren sollte
Steganographie und Verschluesselung loesen unterschiedliche Probleme, und der staerkste Ansatz nutzt beides. Hier ist der Grund.
Wenn ein Angreifer vermutet, dass Ihr Bild versteckte Daten enthaelt, und die LSBs erfolgreich extrahiert, sieht er Ihre Klartextnachricht. Spiel vorbei. Aber wenn Sie die Nachricht vorher verschluesseln; zum Beispiel mit AES-256; sehen die extrahierten Bits wie zufaelliges Rauschen aus. Der Angreifer kann nicht unterscheiden, ob er eine Nachricht gefunden hat oder nur normale Bilddaten.
Der praktische Ablauf:
- Verschluesseln Sie Ihre Nachricht mit einer starken symmetrischen Chiffre.
- Verstecken Sie den Chiffretext im Bild mittels LSB-Kodierung.
- Teilen Sie das Stego-Bild oeffentlich.
- Teilen Sie den Entschluesselungsschluessel ueber einen separaten Kanal.
Das ergibt zwei Schutzschichten: Die Nachricht ist sowohl verborgen (Steganographie) als auch unlesbar (Verschluesselung). Ein Angreifer muesste sowohl die versteckten Daten erkennen als auch die Verschluesselung knacken; ein deutlich schwierigeres Problem als jedes fuer sich allein.
Kitmuls Sicherheits- und Kryptographie-Tools umfassen AES-Verschluesselung, Hash-Generatoren und weitere Werkzeuge, die das Steganographie-Tool fuer genau diesen Workflow ergaenzen.
Praxisbeispiele aus der realen Welt
Steganographie ist nicht nur ein CTF-Partytrick. Sie hat legitime und wichtige Anwendungen.
Digitale Wasserzeichen. Verlage, Fotografen und Medienunternehmen betten unsichtbare Wasserzeichen in Bilder ein, um unautorisierte Verbreitung nachzuverfolgen. Wenn ein geleaktes Bild auftaucht, identifiziert das eingebettete Wasserzeichen, welcher Empfaenger es weitergegeben hat. So verfolgen mehrere grosse Filmstudios ihre Screener-Kopien.
Whistleblowing und Zensurresistenz. In Laendern mit starker Internetueberwachung ermoeglicht Steganographie Aktivisten, Informationen ueber unschuldig wirkende Bilder in sozialen Medien zu teilen. Das Bild passiert die Pruefung durch automatisierte Inhaltsfilter; die versteckte Nachricht erreicht ihr Zielpublikum.
Verdeckte Kommunikation. Geheimdienste setzen Steganographie mindestens seit den fruehen 2000er-Jahren ein. Die FBI-Verhaftung russischer Spione im Jahr 2010 (das "Illegals Program") offenbarte, dass diese verschluesselte Nachrichten in Bildern auf oeffentlichen Websites eingebettet hatten.
CTF-Aufgaben. Capture-The-Flag-Wettbewerbe lieben Steganographie, weil sie ein anderes Kompetenzspektrum testet als Standard-Kryptoaufgaben. Man muss zunaechst erkennen, dass Steganographie ueberhaupt eingesetzt wurde, bevor man mit der Extraktion beginnen kann. Gaengige CTF-Stego-Techniken umfassen LSB-Kodierung, angehaengte Daten, Palettenmanipulation in GIF-Dateien und Verbergen im Audiospektrum.
Eigentumsnachweis. Kuenstler und Content-Ersteller koennen Urheberrechtsinformationen oder Eigentumsnachweise direkt in ihre Werke einbetten. Im Gegensatz zu sichtbaren Wasserzeichen beeintraechtigen diese nicht die visuelle Qualitaet des Werks.

Die Grenzen der Pixelkodierung
LSB-Steganographie hat reale Einschraenkungen, die man verstehen sollte. Das Traegerbild muss verlustfrei sein; jeder verlustbehaftete Komprimierungsschritt (JPEG, verlustbehaftetes WebP) wird eingebettete Daten beschaedigen. Die Nachrichtenkapazitaet skaliert mit den Bildabmessungen, aber die Nutzung von mehr als etwa 15-20% der Kapazitaet macht das Bild anfaellig fuer statistische Erkennung. Und die Technik verbirgt nur Daten; sie schuetzt sie nicht vor der Extraktion durch jemanden, der weiss, wonach er suchen muss.
Fuer die meisten praktischen Zwecke funktioniert Bildsteganographie am besten als eine Schicht in einer Defense-in-Depth-Strategie. Verbergen Sie die Nachricht, verschluesseln Sie den Inhalt und nutzen Sie einen sicheren Kanal, um den Schluessel zu teilen. Keine einzelne Technik ist kugelsicher, aber die Kombination erhoet die Huerde erheblich.
Probieren Sie es selbst aus
Das Steganographie-Tool auf Kitmul ermoeglicht es Ihnen, Nachrichten in PNG-Bildern direkt im Browser zu verstecken und aufzudecken. Alles laeuft clientseitig; keine Daten werden hochgeladen, keine Konten erforderlich, keine Limits. Laden Sie ein Bild hoch, geben Sie eine Nachricht ein, laden Sie das Ergebnis herunter. Versuchen Sie dann, es zu extrahieren, um den Roundtrip zu ueberpruefen.
Wenn Sie sich fuer Sicherheits- und Datenschutz-Tools interessieren, umfasst die Sicherheits- und Kryptographie-Sammlung Hash-Generatoren, Verschluesselungs-Tools, Passwortgeneratoren und mehr; alles laeuft lokal in Ihrem Browser.
Die gesamte Verarbeitung laeuft lokal in Ihrem Browser. Keine Bilder oder Nachrichten werden an einen Server gesendet. Das Tool ist kostenlos, offen und erfordert keine Konten oder Limits.