Skip to content

twiks228/ShadowHide

Repository files navigation

███████╗██╗ ██╗ █████╗ ██████╗ ██████╗ ██╗ ██╗██╗ ██╗██╗██████╗ ███████╗ ██╔════╝██║ ██║██╔══██╗██╔══██╗██╔═══██╗██║ ██║██║ ██║██║██╔══██╗██╔════╝ ███████╗███████║███████║██║ ██║██║ ██║██║ █╗ ██║███████║██║██║ ██║█████╗ ╚════██║██╔══██║██╔══██║██║ ██║██║ ██║██║███╗██║██╔══██║██║██║ ██║██╔══╝ ███████║██║ ██║██║ ██║██████╔╝╚██████╔╝╚███╔███╔╝██║ ██║██║██████╔╝███████╗ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═════╝ ╚══╝╚══╝╚═╝ ╚═╝╚═╝╚═════╝ ╚══════╝

A professional steganography & cryptography tool for Android and Windows

Flutter Dart Platform License Offline Encryption

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.


What is ShadowHide?

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.


Features

🔒 Steganography Methods

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

🔐 Cryptography

  • 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

🎨 Features by Tab

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

📱 Platform Support

Feature Android Windows
LSB/DCT/Metadata embed
File manager pick (no gallery duplicates)
Drag & Drop
Save to Downloads/ShadowHide/
Save dialog

Screenshots

{391DB45A-CA19-4633-ACA8-4F9DF4E671BA} {82F78C93-D84A-4E1D-B099-415707FE19E0} {E40FD19C-936F-4AB6-872C-A55B319ED0D4} {1297D313-DBA4-4E74-A731-05BCBBDA6BCC}


Installation & Build

Prerequisites

# 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.x

Clone the repository

git clone https://github.com/twiks228/ShadowHide/ShadowHide.git
cd shadowhide/shadow_hide

Install dependencies

flutter pub get

Build & 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.apk

Install directly to connected device

flutter 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 directly (development)

# 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 Structure
shadow_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            # Dependencies

How It Works

LSB 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.

AES-256-GCM Encryption

Password + Salt(16B)  →  PBKDF2  →  Key(32B)
Key + IV(12B) + Plaintext  →  AES-GCM  →  Ciphertext + Tag(16B)

Stored: [Salt:16][IV:12][Ciphertext][Tag:16]

Header Format in Image

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 bytes

Dependencies

pointycastle: ^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

Security Notes

✅ 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 file

License

MIT License — see LICENSE file.

About

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.

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors