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.
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.
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.
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.
steghide command line tool — the PNG output keeps the same raw pixel array but the steghide CLI cannot read PNG.
To reveal the secret hidden in this image, cast the spell with me: trace three full circles around the image with your pointer — clockwise or counter-clockwise — and the hidden data reveals itself.
Your trail glows as you draw, and one moon lights up per closed circle. Lift the pointer or leave the image and the spell fades. No pointer? Focus the image and press Enter.
The recovered file name, size and checksum status appear here. Text is shown as text, pictures are shown as pictures, audio gets a player — anything else can only be downloaded.
No installation and no upload: pick an image, a WAV or an MP3, add your secret, save the result.
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.
Attach any file or type a message, then choose a passphrase. The passphrase decides where the data is scattered and optionally encrypts it.
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.
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.
Samples are grouped into vertices and a minimum-weight matching decides what to change, so only about one sample per hidden value is touched.
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.
An MD5 seeded permutation spreads the data across the whole image, so the hidden payload is not stored in a predictable order.
zlib shrinks the payload before embedding and an optional CRC32 checksum tells you immediately whether the extraction is trustworthy.
Rijndael in CBC mode with the same key derivation as libmcrypt keeps the payload confidential even if someone suspects an image.
Practical limits of hiding data inside the pixels of an image.
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.
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.
jpeg_write_coefficients() does it, so an arithmetic source is relabelled as baseline (or progressive) on the way out.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:
Yes. Hiding and revealing data is free, with no signup, no watermark and no artificial file size limit.
No. Decoding, embedding, compression and encryption run locally in your browser with JavaScript and WebCrypto. Nothing is sent to the 73hi server.
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.
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.
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.
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.
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.
Yes, if you download the BMP. The bit layout, the passphrase based sample permutation and the Rijndael/CBC encryption follow steghide 0.5.1.
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.
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.
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.
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.
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.