This is an experimental Rust port of my C++ steganography tool pdvrdt
pdvrdt-rs is a fast, easy-to-use steganography command-line tool for concealing and extracting any file type via a PNG cover image.
There is also a Web edition, which you can use immediately, as a convenient alternative to downloading and compiling the CLI source code. Web file uploads are limited to 20MB.

Image: "Wolf" / PIN: 7699785107511381336
Unlike the common steganography method of concealing data within the pixels of a cover image (LSB), pdvrdt-rs hides files within various chunks of a PNG image, such as iCCP and IDAT.
You can conceal any file type up to 2GB, although compatible hosting sites (listed below) have their own much smaller size limits and *other requirements.
For increased storage capacity and better security, your embedded data file is compressed with flate2/zlib — unless it's already a compressed file type over 10 MB — and encrypted with XChaCha20-Poly1305 using the libsodium cryptographic library (via the Rust alkali bindings).
$ sudo apt update
$ sudo apt install build-essential curl
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source "$HOME/.cargo/env"
$ cargo build --release --locked
$ sudo cp target/release/pdvrdt-rs /usr/bin
$ pdvrdt-rs
Usage: pdvrdt-rs conceal [-m] <cover_image> <secret_file>
pdvrdt-rs recover <cover_image>
pdvrdt-rs --info
$ pdvrdt-rs conceal your_cover_image.png your_secret_file.doc
Platform compatibility for output image:-
✓ X-Twitter
✓ ImgPile
✓ PostImage
✓ ImgBB
✓ Flickr
Saved "file-embedded" PNG image: prdt_151529.png (143029 bytes).
Recovery PIN: [***2166776980318349924***]
Important: Keep your PIN safe, so that you can extract the hidden file.
Complete!
$ pdvrdt-rs recover prdt_151529.png
PIN: *******************
Extracted hidden file: your_secret_file.doc (6165 bytes).
Complete! Please check your file.
Posting size limit measured by the combined size of the cover image + compressed data file:
- Flickr (200MB), ImgBB (32MB), PostImage (32MB), Mastodon (16MB | -m option),
- ImgPile (8MB), X-Twitter (5MB + *Dimension limits, see below)
X-Twitter image dimension size limits:
- *PNG-32/24 (Truecolor) 68x68 Min. - 900x900 Max.
- PNG-8 (Indexed-color) 68x68 Min. - 4096x4096 Max.
X_Twitter_CLI_PNG_TXT.mp4
Web_PNG_TXT.mp4
pdvrdt-rs mode arguments:
conceal - Compresses, encrypts and embeds your secret data file within a PNG cover image.
recover - Decrypts, uncompresses and extracts the concealed data file from a PNG cover image.
pdvrdt-rs conceal mode platform options:
"-m" - To create compatible "file-embedded" PNG images for posting on the Mastodon platform, you must use the -m option with conceal mode.
$ pdvrdt-rs conceal -m my_image.png hidden.docTo correctly download images from X-Twitter, click the image in the post to fully expand it, before saving.
This project uses or incorporates:
-
alkali — safe Rust bindings for libsodium.
- License: MIT OR Apache-2.0
-
libsodium-sys-stable — libsodium FFI and build integration.
- License: MIT OR Apache-2.0
-
libsodium — cryptographic random generation, Argon2id key derivation, and XChaCha20-Poly1305 secret streams.
- Bundled version: 1.0.22, compiled and statically linked by
libsodium-sys-stable - License: ISC License
- Copyright (c) 2013-2026 Frank Denis
- Bundled version: 1.0.22, compiled and statically linked by
-
png — PNG decoding and encoding.
- License: MIT OR Apache-2.0
-
flate2 — DEFLATE and zlib-format compression and decompression using its pure-Rust backend.
- License: MIT OR Apache-2.0
-
crc32fast — CRC-32 calculation.
- License: MIT OR Apache-2.0
-
zeroize — secure clearing of sensitive values from memory.
- License: MIT OR Apache-2.0
-
anyhow — application error handling.
- License: MIT OR Apache-2.0
-
libc — Linux/POSIX system-call and terminal interfaces.
- License: MIT OR Apache-2.0
-
Compact ICC Profiles — the Mastodon ICC carrier template is derived from
sRGB-v2-nano.icc.- License: [CC0 1.0 Universal](https://github.com/saucecontrol/Compact-ICC-Profiles/blob/master/ license)