A professional steganography & cryptography tool for Android and Windows
Hide your secrets in plain sight. ShadowHide is an offline-first steganography tool that lets you conceal encrypted data inside ordinary images — invisible to the naked eye.
ShadowHide is a cyberpunk-styled steganography workstation built with Flutter. It allows you to hide text, files, and drawings inside PNG/BMP images using military-grade encryption and multiple embedding algorithms. Everything runs 100% locally — no internet connection, no servers, no telemetry.
| Method | Description | Capacity | Visibility |
|---|---|---|---|
| LSB | Replaces bit 0 of R,G,B channels | High | Imperceptible |
| DCT | Embeds in mid-frequency coefficients | Medium | Very low |
| Metadata | Hides in PNG tEXt chunk | Low | Zero pixel change |
- AES-256-GCM — authenticated encryption (confidentiality + integrity)
- PBKDF2-HMAC-SHA256 — key derivation (100,000 iterations, 128-bit salt)
- No password mode — embed without encryption
- Password strength indicator with secure password generator
| Tab | Features |
|---|---|
| HIDE | Embed text/file/drawing, 3 methods, noise masking, drag & drop |
| REVEAL | Auto-detect method (LSB→Meta→DCT), hex viewer, drawing preview |
| DRAW | Freehand canvas, undo/redo (50 levels), eraser, 8 colors |
| ANALYZE | Chi-square test, RS analysis, anomaly detection |
| VISUALIZE | Bit plane viewer (0-7), instant update, before/after slider |
| QR CODE | Generate encrypted QR codes, export as PNG |
| TEXT STEG | Zero-width Unicode characters steganography |
| WATERMARK | Invisible watermark embed & correlation verification |
| COMPARE | Side-by-side slider comparison of original vs stego |
| SETTINGS | EN/RU language, auto device locale detection |
| Feature | Android | Windows |
|---|---|---|
| LSB/DCT/Metadata embed | ✅ | ✅ |
| File manager pick (no gallery duplicates) | ✅ | ✅ |
| Drag & Drop | ❌ | ✅ |
| Save to Downloads/ShadowHide/ | ✅ | ✅ |
| Save dialog | ❌ | ✅ |
# Install Flutter SDK (3.x or higher)
# https://docs.flutter.dev/get-started/install
flutter --version # Should show Flutter 3.x
dart --version # Should show Dart 3.xClone the repository
git clone https://github.com/twiks228/ShadowHide/ShadowHide.git
cd shadowhide/shadow_hideInstall dependencies
flutter pub getBuild & Run 🤖 Android APK
# Debug APK (for testing)
flutter build apk --debug
# Output: build/app/outputs/flutter-apk/app-debug.apk
# Release APK (optimized, smaller)
flutter build apk --release
# Output: build/app/outputs/flutter-apk/app-release.apkflutter install 🪟 Windows EXE
# Debug build
flutter build windows --debug
# Output: build/windows/x64/runner/Debug/shadow_hide.exe
# Release build (optimized)
flutter build windows --release
# Output: build/windows/x64/runner/Release/shadow_hide.exe# Run on connected Android device
flutter run -d android
# Run on Windows
flutter run -d windows
# List available devices
flutter devices📦 Install APK manually
# Via ADB
adb install build/app/outputs/flutter-apk/app-release.apk
# Or copy APK to phone and install from Files app
Project Structureshadow_hide/
├── lib/
│ ├── core/
│ │ ├── theme/ # Dark cyberpunk theme
│ │ └── constants/ # App-wide constants
│ ├── l10n/ # EN/RU localization (manual, no codegen)
│ ├── models/ # Data models
│ ├── painters/ # CustomPainter implementations
│ ├── screens/ # All UI screens
│ │ ├── hide/ # Embed data
│ │ ├── reveal/ # Extract data
│ │ ├── draw/ # Drawing canvas
│ │ ├── analyze/ # Steganalysis
│ │ ├── visualize/ # Bit plane viewer
│ │ ├── qr/ # QR code generator
│ │ ├── text_steg/ # Text steganography
│ │ ├── watermark/ # Watermark tools
│ │ ├── compare/ # Image comparison
│ │ ├── settings/ # App settings
│ │ └── splash/ # ASCII art splash
│ ├── services/ # Business logic
│ │ ├── steganography_service.dart # LSB embed/extract
│ │ ├── dct_steganography_service.dart # DCT embed/extract
│ │ ├── metadata_service.dart # PNG chunk steganography
│ │ ├── crypto_service.dart # AES-256-GCM
│ │ ├── steganalysis_service.dart # Chi-square + RS
│ │ ├── anomaly_detector_service.dart # Pattern detection
│ │ ├── watermark_service.dart # Watermarking
│ │ ├── text_steganography_service.dart # Zero-width chars
│ │ ├── qr_service.dart # QR data prep
│ │ ├── image_service.dart # Image utilities
│ │ ├── locale_service.dart # Language settings
│ │ └── terminal_log_service.dart # In-app log
│ ├── utils/
│ │ ├── isolate_utils.dart # Heavy ops in isolates
│ │ ├── byte_utils.dart # Byte/string helpers
│ │ ├── file_picker_utils.dart # Cross-platform file pick
│ │ └── save_utils.dart # Cross-platform file save
│ └── widgets/ # Reusable UI components
├── android/ # Android configuration
├── windows/ # Windows configuration
└── pubspec.yaml # DependenciesLSB Algorithm Each pixel has R, G, B channels (8 bits = 0-255). The Least Significant Bit (bit 0) contributes only ±1/256 to color — imperceptible.
Original pixel: R=11010110 (214) G=10110001 (177) B=01101100 (108)
Secret bits: 1 0 1
Modified pixel: R=11010111 (215) G=10110000 (176) B=01101101 (109)
↑ ↑ ↑
+1 (0.4%) -1 (0.4%) +1 (0.4%)
Capacity: width × height × 3 ÷ 8 − 7 bytes per image.
A 1920×1080 image holds ~777 KB of hidden data.Password + Salt(16B) → PBKDF2 → Key(32B)
Key + IV(12B) + Plaintext → AES-GCM → Ciphertext + Tag(16B)
Stored: [Salt:16][IV:12][Ciphertext][Tag:16]Bits 0-15: Magic = 0x5348 ("SH")
Bits 16-23: Flags (bit0=encrypted, bit1=file, bit2=drawing)
Bits 24-55: Payload length (uint32 big-endian)
Bits 56+: Payload bytespointycastle: ^3.9.1 # AES-256-GCM, PBKDF2
file_picker: ^8.0.0+1 # Cross-platform file selection
path_provider: ^2.1.3 # App directories
image: ^4.2.0 # PNG/BMP decode/encode
provider: ^6.1.2 # State management
google_fonts: ^6.2.1 # Fira Code terminal font
fl_chart: ^0.68.0 # Analysis charts
shared_preferences: ^2.3.2 # Language preference storage
qr_flutter: ^4.1.0 # QR code rendering
desktop_drop: ^0.4.4 # Drag & Drop on Windows
flutter_localizations # EN/RU localization✅ Offline-first — zero network requests
✅ No analytics — no tracking, no telemetry
✅ AES-256-GCM — authenticated encryption (detects tampering)
✅ PBKDF2 × 100,000 — brute-force resistant key derivation
✅ GCM tag verification — wrong password = immediate error
⚠️ LSB is detectable — chi-square analysis can reveal embedding
⚠️ JPEG is lossy — use PNG/BMP for reliable embedding
⚠️ Screenshot/re-encode destroys LSB data — share original PNG fileMIT License — see LICENSE file.



