ImageSteg · Hide Data Inside an Image or an Audio File

A browser port of steghide 0.5.1 covering both of its methods: pixel/LSB for BMP and PNG, and DCT coefficients for JPEG — plus PCM WAV and MP3 audio carriers. Hide a file or a message, then reveal it again with the passphrase.

100% local

Your file and your secret never leave this device. Decoding, embedding, encryption and extraction all run inside this browser tab. Nothing is ever uploaded to a server — so there is nothing to leak.

1 · Cover image or audio

Drop an image or an audio file JPEG, PNG, WebP, GIF, BMP, PCM WAV or MP3 · decoded locally, never uploaded

Bigger containers hold more: images give about one byte per eight pixels, a PCM WAV one byte per sixteen samples, and an MP3 whatever its audio frames leave unused.

2 · Data to hide

No file chosen

3 · Passphrase & options

Three simple steps

How to Hide a File Inside an Image or an Audio File

No installation and no upload: pick an image, a WAV or an MP3, add your secret, save the result.

1

Choose a cover image or audio file

Upload, drop or paste the image, WAV or MP3 that will carry the data. Larger files hold more, and busy photos or music hide changes best.

2

Add the secret and a passphrase

Attach any file or type a message, then choose a passphrase. The passphrase decides where the data is scattered and optionally encrypts it.

3

Download and share

Save the result as BMP for steghide compatibility or as PNG for a smaller file. Anyone with the image and the passphrase can reveal the data.

Steghide's algorithms plus audio carriers, in your browser

Graph Matching on Pixels, on DCT Coefficients and on Audio Samples

ImageSteg is a TypeScript port of steghide 0.5.1 and covers both of its branches: the pixel/LSB method for BMP and PNG, and the DCT method for JPEG. On top of that it carries data in PCM WAV audio the same way, and in the unused tail of MP3 frames. None of them simply march through the file.

Graph based embedding

Samples are grouped into vertices and a minimum-weight matching decides what to change, so only about one sample per hidden value is touched.

Real JPEG DCT steganography

A built-in JPEG entropy codec reads the quantised DCT coefficients, hides the data in their parity and re-encodes them — the same point in the pipeline where steghide's libjpeg stops. Baseline and progressive files both work.

Passphrase driven scattering

An MD5 seeded permutation spreads the data across the whole image, so the hidden payload is not stored in a predictable order.

Compression and checksum

zlib shrinks the payload before embedding and an optional CRC32 checksum tells you immediately whether the extraction is trustworthy.

Optional AES-256 encryption

Rijndael in CBC mode with the same key derivation as libmcrypt keeps the payload confidential even if someone suspects an image.

What to expect

Capacity, Speed and Compatibility

Practical limits of hiding data inside the pixels of an image.

BMP · PNGpixel / LSB branch
JPEGDCT coefficient branch
0.2 %typical share of samples touched
0 uploadeverything stays in your browser

Compatibility: the bit layout, the sample permutation and the Rijndael/CBC encryption follow steghide 0.5.1, so BMP and JPEG outputs can be read with steghide extract -sf image.bmp -p passphrase or -sf image.jpg, and files produced by the steghide command line tool can be read here. The output format always matches the cover: a JPEG cover produces a JPEG, because the payload lives in coefficients that only a JPEG can carry. PNG is offered alongside BMP for pixel covers; the steghide CLI does not read PNG.

The JPEG branch in detail

steghide's JPEG support calls libjpeg's jpeg_read_coefficients(), which halts the decode pipeline right after Huffman decoding — before dequantisation and the IDCT. What is left are the raw quantised DCT coefficients. Browsers expose no API for those, so this page ships its own JPEG entropy codec instead of using the native decoder. It covers both baseline files and progressive ones, including their successive-approximation refinement scans.

Applying the same algorithm to PNG

The embedder never sees a file format — it only works on the decoded pixel array, so steghide's BMP/LSB method carries over to PNG unchanged. Four details matter in practice:

Questions and answers

ImageSteg FAQ

Is ImageSteg free to use?

Yes. Hiding and revealing data is free, with no signup, no watermark and no artificial file size limit.

Is my image or secret file uploaded?

No. Decoding, embedding, compression and encryption run locally in your browser with JavaScript and WebCrypto. Nothing is sent to the 73hi server.

Which image formats are supported?

Any image your browser can decode can be a pixel cover, and baseline or progressive JPEG files go through steghide's DCT branch. The output format follows the cover: JPEG in, JPEG out; a pixel cover gives a BMP plus a PNG copy. The steghide command line tool reads the BMP and JPEG outputs, but not PNG.

How does the JPEG mode hide data?

In the quantised DCT coefficients, exactly like the steghide command line tool. The page includes a JPEG entropy codec that decodes the scan as far as the coefficients, modifies their parity and re-encodes them.

Can I use a progressive JPEG?

Yes. Progressive files are decoded through their whole scan sequence — spectral selection and successive-approximation refinement — and are written back the same way, so the result is still a progressive JPEG carrying the original coefficients.

What about arithmetic-coded JPEGs?

Supported for reading. Files using QM (binary arithmetic) coding instead of Huffman — SOF9 for sequential, SOF10 for progressive — are decoded through the same arithmetic decoder libjpeg itself uses, so the coefficients come out identical. The result is written back with Huffman coding, the way steghide does.

How much data can I hide?

Roughly one byte of payload for every eight pixels, minus room for the header, the stored file name and the optional encryption overhead. The tool shows the usable capacity once you pick an image.

Can the steghide command line tool read the result?

Yes, if you download the BMP. The bit layout, the passphrase based sample permutation and the Rijndael/CBC encryption follow steghide 0.5.1.

Why does extraction fail after editing the image?

The payload is stored in individual pixel values. Re-compressing, resizing, filtering or converting to a lossy format such as JPEG destroys it. Keep the original BMP or a lossless PNG copy.

Can I hide two secrets in the same image?

Not by embedding twice into one file. A second pass picks its own random positions across the whole cover and overwrites part of the first payload, and because the data is compressed before it is encrypted, a handful of flipped bits makes the whole message unreadable — you lose it completely, not partially. The original steghide command line tool behaves the same way. Reusing the same passphrase is no better: it rewrites the same positions from the start, so only the newest message survives. For real layers, nest files instead — hide the first secret in a small image, download that result, then hide that whole file inside a larger image under a second passphrase. Each layer stays byte-for-byte intact because it travels as protected data rather than as modified pixels.

Does opening an image that already holds hidden data destroy it?

No. Loading a file only reads its bytes: JPEG covers go straight to the quantised DCT coefficients with no inverse transform or re-quantisation, and pixel covers are decoded losslessly, so the hidden data survives untouched. A JPEG may be saved at a slightly different file size because the entropy coding is rewritten, but that does not affect the payload. You can safely open a file prepared by someone else and reveal what is inside.

Can ImageSteg help protect my copyright?

Yes. Embed your copyright notice or ownership proof directly into the photo. The data lives in the pixels (or JPEG coefficients) and stays invisible during normal viewing, so you can share the image publicly without anyone noticing. If someone reuses it without permission, the hidden mark is still inside the file — and when you publish the same image on a third-party platform to document the infringement, that posted copy carries your proof too, giving you solid evidence to support a takedown or a claim.

Can I hide a message I am too shy to say in person?

Absolutely. Hide a message like "I love you" — or anything hard to say face to face — inside an ordinary photo from your daily life, and set the passphrase to the recipient's birthday. Send them the photo and ask them to open it on ImageSteg (or visit 73hi.com/image-steg.html) to unlock it. Only someone who knows the passphrase can reveal the words, so you can express yourself without the awkwardness of saying it out loud.