How to Hide Text in an Image: Two Ways, and When Each One Breaks
Classic steganography writes your encrypted text into the pixels — perfect offline, destroyed the moment a chat app recompresses the photo. A robust watermark survives WhatsApp but only carries a few bytes. Here is how both work, what each is good for, and how to choose.
(New to the vocabulary? Start with Steganography vs Cryptography.)
There are two fundamentally different ways to make a photo carry a message, and almost every disappointment people have with “hide text in image” apps comes from using one where they needed the other.
Way one: put the secret in the pixels
A digital photo is a grid of numbers. Change the last bit of a colour value — 182 becomes 183 — and no eye can tell. LSB steganography uses those last bits as storage: a 12-megapixel photo has room for a few megabytes of data that is invisible by construction.
Done properly, the text is encrypted first. Ciphertext looks like random noise, and random noise in the lowest bits looks like a camera sensor. Someone who suspects the photo finds nothing readable; someone who does not suspect it sees a harbour at dusk. That is what StegoSafe does, entirely on your device, with no server anywhere: AES-256-GCM, a key stretched from your passphrase, optionally split across several photos so that any three of five recover the secret. The long version is in What Happens When You Hide a Secret in a Photo.
What it is good for: keeping something for yourself, or handing it to someone in a way you control. A seed phrase in your camera roll. A recovery code in a family album. A file you AirDrop or put on a USB stick. Nothing to subpoena, nothing to breach, works offline forever.
Where it breaks: the moment anything rewrites the pixels.
| What you do with the photo | Hidden data |
|---|---|
| Keep it, copy it, AirDrop it, back it up | survives |
| Send it as a file / document / original | survives |
| Send it as a normal photo in WhatsApp, WeChat, Instagram, Messenger | destroyed — recompressed to JPEG |
| Screenshot it, crop it, apply a filter, convert PNG → JPEG | destroyed |
Chat apps shrink and re-encode images to save bandwidth, and lossy compression throws away exactly the fine detail where the data lives. This is not a bug in any one app; it is what JPEG is for. Two rules cover nearly everything: keep it PNG, send it as a file.
Way two: put a reference in the photo, and the secret somewhere else
A robust watermark works the other way round. Instead of touching single bits, it spreads a faint pattern across the whole image, designed to be recoverable after resizing, recompression and a trip through a social network. The price is capacity: a robust watermark carries a handful of bytes, not a message.
A handful of bytes is enough for an identifier. That is how WaxSeal sends a secret through a photo that will be recompressed:
- The sender types the secret. It is encrypted on their device for the devices of the chosen recipients, whose keys live in the Secure Enclave.
- The ciphertext goes to the organisation’s vault, which cannot read it.
- The photo receives an eight-byte watermark that names the seal. Eight bytes — the secret is not in the photo.
- The photo is sent as an ordinary photo, in whatever chat the recipient uses. It survives the compression because the watermark was built to.
- The recipient’s app reads the watermark, fetches the ciphertext, checks that this device is allowed, and decrypts with Face ID.
Because the content lives in a vault and not in the pixels, the sender keeps control after sending: burn after reading, read limits, expiry, a PIN, and revocation — the photo is still in the chat, and it simply stops opening. More on that trade in A Photo You Can Take Back.
What it is good for: organisations sending a credential or a confidential note to a specific person through public channels, and needing to take it back.
What it costs: there is a server in the picture (one that holds only ciphertext), and both sides need the app. It is not the tool for a secret you want nobody and nothing else to ever be involved in.
The third way that is not a way: metadata
You can type text into a photo’s EXIF description. Every photo viewer shows it, and most platforms strip it on upload. It is a label. Do not use it for anything you would mind seeing on a screen.
How to choose
| You want to… | Use |
|---|---|
| keep a secret for yourself, offline, with no account and no server | pixels — StegoSafe |
| survive losing a device, or split trust between people | pixels + Shamir splitting — StegoSafe, five photos, any three |
| send through WhatsApp / WeChat / Telegram as a normal photo | a reference in the photo — WaxSeal |
| let it be opened once, expire it, or revoke it after sending | a reference in the photo — WaxSeal |
| hand over a file in person or by AirDrop | either; pixels are simpler |
The two are not rivals. One keeps the whole secret in the image and trusts nobody; the other keeps only a name in the image so that the secret can be governed. The mistake is expecting pixel steganography to survive a messenger, or expecting a watermark to hold a paragraph.
If you want to try the second approach, WaxSeal’s personal demo runs on one iPhone, iPad or Mac with no account: hide a test message in a photo, send the photo to yourself through any chat, save it back, and open it.
Frequently asked questions
Can you really hide a message inside a photo?
Why did my hidden message disappear after I sent the photo in a chat?
Does metadata (EXIF) count as hiding text in an image?
What is the difference between steganography and a watermark?
StegoSafe hides AES-256-encrypted secrets inside ordinary photos — in a deniable format with no header or marker — and can split them across several photos with Shamir Secret Sharing. Runs fully offline on iPhone, iPad and Mac; one universal purchase. For organisations that must send a secret and control it afterwards, see WaxSeal
Get StegoSafe →