Zim Steganography Toolkit (zimhide)
A Rust CLI for embedding and extracting encrypted text and audio in WAV files. Part of the Zim tool family.
Installation
The binary will be at target/release/zimhide.
Quick Start
# Embed a message
# Extract the message
Commands
encode / decode
Embed and extract text from WAV files.
# Basic text embedding
# From a file
# Symmetric encryption (passphrase)
# Asymmetric encryption (public key)
# Multi-recipient encryption
# Signed message
# Metadata method (stores in RIFF chunk, not hidden but preserves audio)
# LSB options
play
Extract and play embedded audio.
# Play embedded audio
# Extract to file instead
# With decryption
keygen
Generate a keypair for encryption and signing.
# Save to files
# Creates: mykey.pub and mykey.priv
# Output to stdout
inspect
Show embedded content metadata without decrypting.
# Example output:
# Zimhide Embedded Data
# =================
#
# Method: LSB (Least Significant Bit)
# Content: text
# Payload size: 83 bytes (encrypted)
# Encryption: symmetric (passphrase)
# Signed: no
#
# Total embedded: 93 bytes
# Capacity used: 0.8%
# Available: 11018 bytes
Steganography Methods
LSB (Least Significant Bit)
Default method. Modifies the least significant bits of audio samples to embed data. With 1 bit per sample (default), the modification is inaudible (-96dB for 16-bit audio).
Options:
--bits 1-4- Bits per sample (higher = more capacity, more audible)--channels left|right|both- Which channels to use
Metadata
Stores data in a custom RIFF chunk (zimH). Does not modify audio samples at all, but the chunk is visible to tools like ffprobe. Useful when audio fidelity is critical.
Cryptography
- Symmetric: Argon2id key derivation + ChaCha20-Poly1305
- Asymmetric: X25519 key exchange + XChaCha20-Poly1305
- Signatures: Ed25519
Key files use a PEM-like format:
-----BEGIN ZIMHIDE PUBLIC KEY-----
<base64 encoded key>
-----END ZIMHIDE PUBLIC KEY-----
Embedded Data Format
[4 bytes] Magic: "ZIMH"
[1 byte] Flags (text, audio, signed, symmetric, asymmetric)
[1 byte] Method (0=LSB, 1=metadata, 2=spread)
[4 bytes] Payload length
[N bytes] Payload (encrypted if applicable)
[64 bytes] Signature (if signed)
Shell Completions
Generate shell completions for your shell:
# Bash
# Zsh (add to fpath)
# Fish
# PowerShell
For zsh, ensure ~/.zfunc is in your fpath. Add to ~/.zshrc:
fpath=(/.zfunc )
&&
License
MIT