Bibliothèque Python unifiée de stéganographie d'images et de stéganalyse, du LSB au deep learning.
Project description
secure-stegano
Bibliothèque Python unifiée de stéganographie d'images et de stéganalyse, du LSB historique au deep learning moderne.
Moteur algorithmique du projet TPI. Voir le cahier des charges pour le périmètre détaillé et l'état de l'art pour le cadrage théorique.
Vue d'ensemble
Le package implémente :
- Embedding / extraction — LSB, LSBMR, S-UNIWARD (spatial), F5 (JPEG), HiDDeN (deep).
- Stéganalyse — chi-square, RS analysis, SRNet (CNN pré-entraîné).
- Métriques — PSNR, SSIM, BER, capacité.
- Canaux réseaux sociaux — Facebook, Instagram, Twitter, WhatsApp (simulateurs).
- Signature de traçabilité — HMAC embarqué pour identification d'origine.
Conventions de nommage
| Aspect | Valeur | Pourquoi |
|---|---|---|
| Dossier | secure-stegano |
Convention PyPI (tiret). |
| Distribution | secure-stegano |
Idem, c'est ce qu'on installe via pip. |
| Nom d'import Python | secure_stegano |
Python interdit les tirets dans les modules. |
import secure_stegano
from secure_stegano.spatial import lsb # à venir en Phase A1
Installation
Prérequis : Python 3.11+.
cd algorithms/secure-stegano
pip install -e ".[dev]"
Avec les notebooks d'exploration :
pip install -e ".[dev,notebooks]"
Utilisation rapide (CLI)
# Aide
python -m secure_stegano --help
# Cacher un message (lsb, lsbmr, s-uniward)
python -m secure_stegano encode --algorithm lsb --cover cover.png --payload "hello" --out stego.png
# Extraire — sans --algorithm : décodage aveugle (algo lu dans l'en-tête)
python -m secure_stegano decode --stego stego.png
# Simuler le passage par Facebook
python -m secure_stegano channel --profile facebook --input stego.png --out stego_after_fb.jpg
Via la façade Python :
import secure_stegano
from secure_stegano.core import load_image, save_image
res = secure_stegano.embed(load_image("cover.png"), b"hello", "lsb")
save_image(res.stego, "stego.png")
assert secure_stegano.extract(load_image("stego.png")) == b"hello" # aveugle
État Phase A1 (+ A5/A6) :
encode/decode/channelopérationnels pour LSB, LSBMR (aller-retour réel) et S-UNIWARD (simulateur d'embedding, non extractible).analyze(stéganalyse), F5 et HiDDeN lèvent encoreNotImplementedError.
Tests et qualité
pytest # suite de tests (barrière bloquante)
ruff check src # lint (barrière bloquante)
mypy src # types — NON strict (cf. note Structure ci-dessous)
Structure
Structuration par rôle pipeline (regroupement codecs/ et evaluation/) :
src/ (mappé sur le paquet « secure_stegano » par setuptools)
├── __init__.py Re-export de la façade (embed/extract/sign/verify)
├── api.py FAÇADE centrale — seul point d'entrée à appeler
├── __main__.py CLI = fin appelant de api.py
├── core/ types, io, payload (conteneur auto-descriptif + permutation)
├── codecs/ chaque module = encode() + decode()
│ ├── spatial/ lsb.py, lsbmr.py, s_uniward.py
│ ├── jpeg/ f5 (stub — hors périmètre)
│ └── deep/ hidden (stub — hors périmètre)
├── analysis/ stéganalyse (stub — hors périmètre)
├── evaluation/ mesure & benchmark
│ ├── metrics/ psnr, ssim, ber, capacity
│ └── channels/ facebook, instagram, twitter, whatsapp, generic
└── signature/ hmac_sig — filigrane de traçabilité
Divergence assumée vs cahier §10. Le cahier prévoit une arborescence plate (un sous-paquet par concern). Nous regroupons plutôt par rôle :
codecs/(chaque codec faitencode+decode; « extraire » est la fonction inverse, pas un dossier),evaluation/(métriques + canaux), et une façadeapi.pyqui centralise le dispatch (« backend fin, package gras », cahier §3). Le décodage aveugle s'appuie sur l'en-tête auto-descriptif (MAGIC + algo_id + CRC32) écrit parcore/payload.py.
Layout
src/plat (choix assumé). Le contenu vit directement danssrc/(pas desrc/secure_stegano/).setuptoolsremappe le nom d'importsecure_steganosursrc/via[tool.setuptools] package-dir. Conséquence :mypyne peut pas résoudre le paquet par le système de fichiers (le remap n'existe qu'à l'install) → typage non strict assumé.pytestetruffrestent la barrière qualité bloquante. Le layout standardsrc/secure_stegano/rétabliraitmypy --strictsi besoin un jour.
Feuille de route Phase A
| Tâche | Périmètre | État |
|---|---|---|
| A0 | Scaffolding (ce commit) | ✅ fait |
| A1 | LSB, LSBMR, S-UNIWARD + tests + CLI branchée | ✅ fait |
| A2 | F5 JPEG | à venir |
| A3 | Stéganalyse (chi-square, RS, SRNet) | à venir |
| A4 | HiDDeN inférence | à venir |
| A5 | Module signature HMAC | ✅ fait |
| A6 | Canaux réseaux sociaux | ✅ fait |
| A7 | Métriques + benchmarks reproductibles | à venir |
| A8 | Doc et notebooks | à venir |
Détails dans le cahier des charges §11.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file secure_stegano-1.1.4.tar.gz.
File metadata
- Download URL: secure_stegano-1.1.4.tar.gz
- Upload date:
- Size: 31.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a7101a29457c26967dc8b45aef467804face50a7eb1652dce39c71afe68f91c
|
|
| MD5 |
86c7931d5ba3b839987d19e09ed9a2ed
|
|
| BLAKE2b-256 |
5d762850bf3670b03e31239daab82569c3ccc78efafac2fdff02b630a885b9cf
|
File details
Details for the file secure_stegano-1.1.4-py3-none-any.whl.
File metadata
- Download URL: secure_stegano-1.1.4-py3-none-any.whl
- Upload date:
- Size: 35.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a2fa674082e40fbaa395542d26b6c52a3746deab6abbcfb072e54cd964eeda10
|
|
| MD5 |
f430064c5100894994ffb7b759e6e076
|
|
| BLAKE2b-256 |
5f6a724412fc349a5f92ce9951832055cd3874dddd40d167e4b21f0dd13dc342
|