{"id":51247254,"url":"https://github.com/docxology/steganographer","last_synced_at":"2026-06-29T05:03:35.237Z","repository":{"id":363939334,"uuid":"1174669623","full_name":"docxology/steganographer","owner":"docxology","description":null,"archived":false,"fork":false,"pushed_at":"2026-03-08T21:05:50.000Z","size":4159,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-11T02:27:50.647Z","etag":null,"topics":["cryptography","media-verification","open-source","python","security","steganography","watermarking"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/docxology.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"docs/contributing.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.md","support":null,"governance":null,"roadmap":"docs/roadmap.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-03-06T17:51:21.000Z","updated_at":"2026-03-27T02:10:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/docxology/steganographer","commit_stats":null,"previous_names":["docxology/steganographer"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/docxology/steganographer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/docxology%2Fsteganographer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/docxology%2Fsteganographer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/docxology%2Fsteganographer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/docxology%2Fsteganographer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/docxology","download_url":"https://codeload.github.com/docxology/steganographer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/docxology%2Fsteganographer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34913587,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cryptography","media-verification","open-source","python","security","steganography","watermarking"],"created_at":"2026-06-29T05:03:34.568Z","updated_at":"2026-06-29T05:03:35.230Z","avatar_url":"https://github.com/docxology.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/images/dashboard-video-tab.png\" alt=\"Steganographer Dashboard\" width=\"800\"\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e🔒 Steganographer\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003eReal-time cryptographic watermarking for video \u0026 audio — built entirely in Rust\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"docs/getting-started.md\"\u003eGetting Started\u003c/a\u003e •\n  \u003ca href=\"docs/architecture.md\"\u003eArchitecture\u003c/a\u003e •\n  \u003ca href=\"docs/cryptography.md\"\u003eCryptography\u003c/a\u003e •\n  \u003ca href=\"docs/cli-reference.md\"\u003eCLI Reference\u003c/a\u003e •\n  \u003ca href=\"docs/faq.md\"\u003eFAQ\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/language-Rust-orange?style=flat-square\" alt=\"Rust\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/tests-132_passing-brightgreen?style=flat-square\" alt=\"Tests\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/license-MIT-blue?style=flat-square\" alt=\"MIT\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/crates-4-informational?style=flat-square\" alt=\"4 crates\"\u003e\n\u003c/p\u003e\n\n---\n\nSteganographer embeds **cryptographic signatures** (BLAKE3 + Ed25519) and **visible watermarks** into live media streams using LSB steganography, QR overlays, and GStreamer pipelines. Every video frame and audio chunk is hashed, signed, and verified in real time.\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e📹 Dashboard Demo\u003c/strong\u003e — click to expand\u003c/summary\u003e\n\u003cbr\u003e\n\u003cimg src=\"docs/images/dashboard-demo.webp\" alt=\"Dashboard Demo\" width=\"800\"\u003e\n\u003cbr\u003e\u003cem\u003eThe three-tab dashboard: Video encoding/verification, Audio steganography, and in-app Documentation viewer.\u003c/em\u003e\n\u003c/details\u003e\n\n---\n\n## ⚡ Quick Start\n\n```bash\ngit clone https://github.com/docxology/steganographer.git\ncd steganographer\ncargo build --workspace\ncargo test --workspace   # 132 tests, 0 failures\n./run.sh                 # Interactive terminal menu\n```\n\n\u003e 📖 Full setup guide: [**Getting Started**](docs/getting-started.md) — includes prerequisites, build instructions, and first-run tutorial.\n\n---\n\n## 🏗️ How It Works\n\n```text\n  Raw Frame/Audio → BLAKE3 Hash → Ed25519 Sign → LSB Embed → QR Overlay\n       ↓                                              ↓\n  Tamper-evident media                          Visible provenance\n```\n\nEvery frame goes through a **four-stage pipeline**:\n\n1. **Hash** — [BLAKE3](docs/cryptography.md#blake3-hashing) computes a 256-bit digest over `frame_index ∥ video_bytes ∥ audio_bytes`\n2. **Sign** — [Ed25519 or Ethereum/secp256k1](docs/cryptography.md#ed25519-signing) signs the hash for tamper detection\n3. **Embed** — [LSB steganography](docs/algorithms.md#lsb-video-protocol) hides the 104-byte payload in pixel/sample least-significant bits\n4. **Overlay** — [QR code + text watermark](docs/algorithms.md#qr--info-bar-overlay) burns visible provenance into the frame\n\n\u003e 🔐 Deep dive: [**Cryptography**](docs/cryptography.md) · [**Algorithms**](docs/algorithms.md) · [**Steganography Theory**](docs/steganography-theory.md) · [**Threat Model**](docs/threat-model.md)\n\n---\n\n## 🖥️ Live Dashboard\n\nA three-tab web GUI for real-time round-trip verification:\n\n| Tab | What it does |\n| ----- | ------------- |\n| **Video** | Webcam → LSB encode → decode → verify (live). Controls for opacity, LSB bits, sign rate, QR scale, resolution |\n| **Audio** | Microphone → PCM capture → LSB embed → extract → verify. Waveform + spectrum visualization, WAV recording |\n| **Docs** | Browse all 17 project docs in-dashboard with search and navigation |\n\n\u003cdetails\u003e\n\u003csummary\u003e🔽 \u003cstrong\u003eDashboard screenshots\u003c/strong\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/dashboard-video-tab.png\" alt=\"Video Tab\" width=\"400\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/dashboard-audio-tab.png\" alt=\"Audio Tab\" width=\"400\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003eVideo: encode + verify + config\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003eAudio: waveform + LSB verification\u003c/em\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/dashboard-docs-tab.png\" alt=\"Docs Tab\" width=\"400\"\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"docs/images/dashboard-qr-overlay.png\" alt=\"QR Overlay\" width=\"400\"\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003eDocs: in-dashboard documentation\u003c/em\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cem\u003eQR overlay with timestamp\u003c/em\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\u003c/details\u003e\n\n```bash\n# Launch the dashboard\n./run.sh    # select 'd' for dashboard, or 'a' for all\n# Or directly:\ncargo run -p steganographer-cli -- dashboard --port 8080 --backend ed25519\n```\n\n\u003e 📖 Full API reference: [**API Reference**](docs/api-reference.md) — all HTTP/WebSocket endpoints, JSON schemas, and configuration payloads.\n\n---\n\n## 🧩 Architecture\n\nFour Rust crates with strict dependency layering:\n\n```text\n┌──────────────────────────────────────────────┐\n│  steganographer-cli       (binary)           │  Clap CLI: 6 subcommands\n├──────────────────────────────────────────────┤\n│  steganographer-dashboard (web server)       │  Axum + WebSocket, 3 tabs\n│  steganographer-gst       (GStreamer plugin)  │  AppSink/AppSrc pipeline\n├──────────────────────────────────────────────┤\n│  steganographer-core      (algorithms)       │  Pure Rust, 0 system deps\n└──────────────────────────────────────────────┘\n```\n\n| Crate | Purpose | Tests | Docs |\n| ------- | --------- | ------- | ------ |\n| **[steganographer-core](steganographer-core/)** | Crypto, LSB, overlay, config | 114 | [Architecture](docs/architecture.md) |\n| **[steganographer-dashboard](steganographer-dashboard/)** | Live web GUI | 12 | [API Reference](docs/api-reference.md) |\n| **[steganographer-gst](steganographer-gst/)** | GStreamer integration | 1 | [GStreamer Guide](docs/gstreamer.md) |\n| **[steganographer-cli](steganographer-cli/)** | CLI binary | 1 | [CLI Reference](docs/cli-reference.md) |\n\n\u003e 📖 Full breakdown: [**Architecture**](docs/architecture.md) — crate hierarchy, module map, data flow diagrams.\n\n---\n\n## 🔑 Crypto Design\n\n| Component | Algorithm | Details |\n| ----------- | ----------- | --------- |\n| **Hashing** | BLAKE3 | Parallel 256-bit hash of `frame_index ∥ video_bytes ∥ audio_bytes` |\n| **Signing** | Ed25519 | 64-byte EUF-CMA secure signature over the BLAKE3 hash |\n| **Payload** | 104 bytes | `frame_index (8) + hash (32) + signature (64)` |\n| **Video embed** | Length-prefixed LSB | 1–4 bit replacement with 32-bit length header |\n| **Audio embed** | Keyed ChaCha8 PRNG | Pseudo-random sample permutation for scatter embedding |\n| **Alt signing** | Ethereum secp256k1 | EIP-191 personal_sign, MetaMask-compatible |\n\n\u003e 📖 Deep dives: [**Cryptography**](docs/cryptography.md) · [**Security Model**](docs/security.md) · [**Threat Model**](docs/threat-model.md)\n\n---\n\n## 🛠️ CLI Usage\n\n```bash\n# Generate a key pair\nsteganographer keygen --output mykey\n\n# Offline encode\nsteganographer encode --input frame.rgb --output signed.rgb --stego-type lsb_video --bits 1\n\n# Verify\nsteganographer verify --input signed.rgb --public-key \u003chex\u003e --stego-type lsb_video --format json\n\n# Live video (GStreamer)\nsteganographer video --config steganographer.toml\n\n# Live audio\nsteganographer audio --config steganographer.toml\n\n# Dashboard\nsteganographer dashboard --port 8080 --backend ed25519\n```\n\n\u003e 📖 All commands and options: [**CLI Reference**](docs/cli-reference.md)\n\n---\n\n## ⚙️ Configuration\n\nTwo config files, fully documented:\n\n- [`steganographer.toml`](steganographer.toml) — Master configuration (video/audio sources, signing keys, stego modules)\n- [`config/example.toml`](config/example.toml) — Minimal annotated example\n\n```toml\n[video]\nsource = \"avfvideosrc\"\nwidth = 1280\nheight = 720\n\n[signing]\nbackend = \"ed25519\"\n\n[[stego.modules]]\ntype = \"lsb_video\"\nbits = 2\n```\n\n\u003e 📖 Full TOML schema: [**Configuration**](docs/configuration.md) — all fields, template placeholders, module chains.\n\n---\n\n## ✅ Tests\n\n132 tests across 4 crates — all passing:\n\n| Category | Count | Location |\n| ---------- | ------- | ---------- |\n| Core unit tests | 56 | `steganographer-core/src/*.rs` |\n| Core integration tests | 58 | `steganographer-core/tests/integration_tests.rs` |\n| Dashboard tests | 12 | `steganographer-dashboard/tests/dashboard_tests.rs` |\n| GStreamer + Ethereum | 1 + 5 | Plugin skeleton + feature-gated |\n| **Total** | **132** | **0 failures** |\n\n```bash\ncargo test --workspace                # All 132 tests\ncargo test -p steganographer-core     # Core only (114 tests)\ncargo test -p steganographer-dashboard # Dashboard only (12 tests)\n```\n\n---\n\n## 🌍 Platform Support\n\n| Platform | Video Source | Audio Source | Docs |\n| ---------- | ------------- | ------------- | ------ |\n| **macOS** | `avfvideosrc` | `osxaudiosrc` | [Platforms](docs/platforms.md) |\n| **Linux** | `v4l2src` | `pulsesrc` / `pipewiresrc` | [Platforms](docs/platforms.md) |\n| **Docker** | Headless | Headless | [Platforms](docs/platforms.md) |\n\n\u003e ⚠️ GStreamer is optional. The core crate and offline encode/verify commands work without it.\n\n---\n\n## 📚 Documentation\n\n17 comprehensive guides in [`docs/`](docs/):\n\n| Guide | Description |\n| ------- | ------------- |\n| [**Getting Started**](docs/getting-started.md) | Prerequisites, build, first-run tutorial |\n| [**Architecture**](docs/architecture.md) | Crate hierarchy, module map, data flow |\n| [**Cryptography**](docs/cryptography.md) | BLAKE3, Ed25519, Ethereum signing |\n| [**Algorithms**](docs/algorithms.md) | LSB protocols, capacity math, QR overlay |\n| [**Steganography Theory**](docs/steganography-theory.md) | Information-theoretic security foundations |\n| [**Security**](docs/security.md) | Cachin's ε-security, deployment guidance |\n| [**Threat Model**](docs/threat-model.md) | Adversary model, attack catalog, mitigations |\n| [**CLI Reference**](docs/cli-reference.md) | All 6 commands with examples |\n| [**API Reference**](docs/api-reference.md) | HTTP + WebSocket endpoints, JSON schemas |\n| [**Configuration**](docs/configuration.md) | Full TOML schema, template variables |\n| [**GStreamer**](docs/gstreamer.md) | Pipeline integration, AppSink/AppSrc |\n| [**Platforms**](docs/platforms.md) | macOS, Linux, Docker setup |\n| [**Contributing**](docs/contributing.md) | Dev workflow, testing, PR checklist |\n| [**Roadmap**](docs/roadmap.md) | DCT-domain, ML-DSA, post-quantum plans |\n| [**FAQ**](docs/faq.md) | 30+ questions and answers |\n\n---\n\n## 📄 License\n\nMIT — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdocxology%2Fsteganographer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdocxology%2Fsteganographer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdocxology%2Fsteganographer/lists"}