Hide a payload

Embed a file inside an image, audio, video, document or executable. The payload is encrypted with AES-256-GCM before it is embedded.

How it works
  1. Your passphrase is stretched with Argon2id and the payload is sealed with AES-256-GCM.
  2. The encrypted bytes are written into the carrier: low-order bits of pixels or samples, or a structure the format ignores.
  3. Without the passphrase the embedded bytes look random, but statistics can still show that a carrier was modified. Run Detect on your own output to see what an analyst would see.
Drop the carrier here,
or browse
Drop the file to hide,
or browse
Subtle Capacity
Depth 1: stealth-first.
Auto, hybrid
Image
Video
Audio
Document
Executable
Picks a method from the carrier type.
Choose a carrier to see how much each method can hold.
Survive a platformRecompression-aware method and error correction
Decoy payloadTwo payloads, two keys

Embeds a second payload next to the real one. Each key opens only its own slot. Both slots are the same size and look like random data, so nothing in the file says which is which, or that a second one exists. This protects against someone who has only the file. It does not help against someone who can compel both keys, or who has the original carrier to compare against.

Drop an innocuous file,
or browse

Extract a payload

Choose the stego file and enter the passphrase it was embedded with.

What you need

The file produced by Encode, unchanged, and the exact passphrase. A wrong passphrase, a damaged file and a file with nothing hidden in it all fail the same way, on purpose: the message does not reveal which one it was.

Lossy re-compression (re-saving a JPEG, uploading to a social network, converting audio to MP3) destroys most embeds. Use the Survive tab before relying on a platform.

Drop the stego file,
or browse

Detect hidden data

Run statistical and forensic detectors on a file. Results are indicators, not proof: read each detector's note before drawing a conclusion.

What each detector does
  • Chi-square tests whether pairs of pixel values look artificially equal, as they do after LSB embedding. It says "uninformative" for noise-like images, where clean files look equalised too.
  • RS analysis estimates what fraction of pixels had their low bits rewritten.
  • Metadata reads EXIF, XMP, PNG chunks and PDF or Office properties for anomalies.
  • Blind extractor tries the common parameter combinations and looks for a StegoForge header. A hit extracts the payload; a miss proves nothing.
  • ML runs a bundled ONNX model. Treat it as a hint, never a verdict.
  • Camera fingerprint looks for broken sensor-noise (PRNU) consistency in photographs.
  • Binary checks zero-filled padding in ELF and PE files for data that should not be there.
Drop any file,
or browse
Detectors

CTF analysis

Run every detector and extraction attempt on a challenge file and get one report, ranked by confidence. Payloads the blind extractor finds are offered for download.

Drop the challenge file,
or browse

Platform survival check

Simulate a platform's image recompression on your own machine and check whether the payload can still be extracted afterwards.

Drop an image or video,
or browse
Drop the payload,
or browse

Capacity check

See how much data a carrier can hold with each method before you encode.

Why check first

Capacity depends on the carrier's size, the method and the bit depth. The encrypted payload is about 50 bytes larger than the original, and encoding stops with a size error if it does not fit.

Drop a carrier file,
or browse
Drop a payload,
or browse
Choose a carrier to compare methods.

Diff

Compare an original carrier with its stego version. Images get a heatmap of the changed pixels; other files get a byte comparison.

Drop the clean file,
or browse
Drop the stego file,
or browse

Help

What each part does, and where the limits are.

Steganography and encryption

Encryption makes data unreadable. Steganography hides that the data exists. StegoForge does both: the payload is sealed with AES-256-GCM first, then embedded, so a payload that is found still cannot be read without the passphrase.

Hiding is statistical, not magic. A careful analyst with the right tests can often tell that a carrier was modified, which is why Detect exists: test your own output.

Passphrase and keys

  • The passphrase goes through Argon2id to derive the AES key. Use a long one; the key derivation slows guessing but cannot save a short passphrase.
  • A wrong passphrase fails with one generic error. It is the same message for a damaged file.
  • The passphrase also sets the order in which carrier samples are visited. That is obfuscation, not a second layer of encryption.
  • Decoy payload stores two payloads under two keys in one carrier.

Image methods

  • LSB rewrites the lowest bits of pixels. Best for PNG and BMP; lost by lossy re-compression.
  • Adaptive LSB prefers busy, textured pixels, which disturbs statistics less.
  • DCT works in JPEG frequency coefficients and keeps the output a JPEG.
  • Alpha uses the transparency channel; Palette reorders a GIF's colour table (tiny capacity).

Audio and video

  • Audio LSB rewrites sample low bits and outputs WAV. Phase shifts segment phases and needs sound in every segment.
  • Spectrogram draws a visual watermark in the spectrum; it does not carry payload bytes.
  • Video DCT and Video motion embed in luma samples and write lossless H.264. The files are large, play in ffmpeg-based players (VLC, mpv) rather than most browsers, and any later re-encode destroys the payload. Audio tracks are kept.

Documents and executables

  • Unicode inserts zero-width characters in text files.
  • PDF and DOCX / XLSX add data the viewer ignores.
  • PE and ELF use slack space, and the program still runs.

Detection

  • Chi-square and RS look for rewritten low bits. They are weak against small or adaptive payloads, and chi-square reports "uninformative" on noise-like images.
  • The blind extractor can only find embeds in StegoForge's own layout and with common parameters.
  • The ML detector is a bundled generic model: a hint, not a verdict.
  • Above about 70% confidence a result deserves a closer look; a clean result never proves a file is clean.

Command line

Everything here is also available from the terminal. Add --json for machine-readable output; warnings go to stderr, so stdout stays clean.

# hide, then extract
stegoforge encode -c photo.png -p secret.txt -k "a long passphrase"
stegoforge decode -f photo_stego.png -k "a long passphrase"

# analyse an unknown file
stegoforge ctf -f challenge.png
stegoforge ctf -f challenge.png --json > report.json

# check this installation
stegoforge doctor