A blazing-fast, lightweight steganography tool for concealing data inside normal-looking files. Lupin can be used as a CLI tool for quick operations or as a Rust library for integration into your applications.
In an era of increasing digital surveillance and diminishing privacy, steganography offers an extra layer of protection by hiding the very existence of sensitive communications. Unlike encryption, which makes data unreadable but obvious, steganography makes data invisible.
Lupin makes this powerful technique accessible through clean, modern tooling. It is named after Arsène Lupin, the fictional gentleman thief due to the art of hiding data in plain sight.
- PDF: Appends data after the
%%EOFmarker (unlimited capacity, easily detectable) - PNG: Custom ancillary chunks (unlimited capacity, zero visual artifacts, somewhat easily detectable)
# Install
cargo install lupin
# Or build from source: git clone && cargo build --release
# Hide data in PDF
lupin embed document.pdf secret.txt output.pdf
# Extract data
lupin extract output.pdf recovered.txt
# More options
lupin --helpMore info in the CLI Guide.
# Cargo.toml
[dependencies]
lupin = "1.0"use lupin::operations::{embed, extract};
// Read files
let source = std::fs::read("document.pdf")?;
let payload = std::fs::read("secret.txt")?;
// Embed with metadata
let (embedded_data, metadata) = embed(&source, &payload)?;
println!("Used {} engine", metadata.engine);
// Extract
let (extracted, info) = extract(&embedded_data)?;More info in the Library Guide.
- CLI Guide - Command-line usage, logging, examples
- Library Guide - Rust API, integration examples
- Architecture - How it works, adding new formats
Contributions welcome! Please read the architecture docs to understand the codebase structure.
Apache License 2.0 — see LICENSE for details.
Disclaimer: For educational and legitimate use only. Users are responsible for complying with applicable laws.