A simple GUI for steganography: hide and reveal secret messages in images, with optional AES-256-GCM encryption and Argon2id key derivation.
Built as a replacement for Steganozorus © 2002 – Thomas Nerrant.
If you find this project useful, consider buying me a coffee.
- Hide and reveal messages in image files using LSB or EXIF steganography
- AES-256-GCM encryption with Argon2id key derivation from a shared secret
- Plain text mode to hide a message without encryption (useful for testing or low-risk payloads)
- Desktop GUI built with PyQt6
| Format | Technique |
|---|---|
| PNG, BMP | LSB (least significant bit) |
| JPEG, TIFF | EXIF header |
When hiding text, the output file is saved next to the source image with a _hidden suffix (for example, photo.png → photo_hidden.png).
First-time setup (creates a virtual environment with the Python version from .python-version):
just init
just installOr with uv directly:
uv syncjust runOr:
uv run -m app- Choose Hide or Reveal mode.
- Enter the text to hide, or leave the field empty in reveal mode.
- Enter a shared secret (at least 8 characters), or enable plain text mode to skip encryption.
- Select a cover image and run the action.
Common tasks via just:
just test # run pytest
just format # lint and format with ruff
just typing # type-check with pyright
just ci # full local CI pipelineList all recipes with just --list.
- Choose output file name
- Add support for more encryption algorithms
- Add support for keyfiles
- Audio and video support, drag & drop
- Deniability support
- More languages
- Binary release
- Design improvements