Skip to main content

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 de stéganographie, de watermarking et de détection d'images IA, organisée par familles d'algorithmes, du LSB historique au deep learning.

Moteur algorithmique du projet TPI. Voir l'état de l'art pour le cadrage théorique (familles §4/§5, formats → famille §3.4) et le cahier des charges pour le périmètre.

Vue d'ensemble

Trois familles stéganographiques + une famille watermarking + une partie IA. Tous les codecs partagent la même interface : encode(cover, payload, *, key=...) et decode(stego, *, key=...), avec un message borné à 8 octets.

Famille (dossier) Formats visés Algorithmes Robustesse
codecs/spatial lossless : PNG, BMP, TIFF LSB, PVD, S-UNIWARD Reed-Solomon
codecs/frequency lossy/JPEG : JPEG, WebP nsF5, J-UNIWARD, UERD Reed-Solomon
codecs/watermarking robustesse / 100 % QIM, Spread-Spectrum intrinsèque (sans RS)
codecs/ia toutes (réseau appris) HiDDeN + identify() Reed-Solomon

Robustesse : Reed-Solomon (≤ 8 octets)

Les familles stéganographiques (spatial, fréquentiel, IA) protègent le message par un code correcteur Reed-Solomon avant insertion (voir common/payload.py). Le plafond de 8 octets maximise la redondance par octet utile et rend les métriques comparables entre familles. Le conteneur — algo_id | length | data(8) + parité — porte l'algo_id dans le bloc protégé, ce qui permet le décodage aveugle des codecs spatiaux LSB (l'algorithme est relu après correction RS).

Pourquoi pas de RS pour le watermarking ? QIM et Spread-Spectrum portent leur robustesse nativement (marge de quantification, gain d'étalement) et visent une récupération à 100 % sur canal propre. Y ajouter RS serait redondant.

Installation

Prérequis : Python 3.11+.

cd algorithms/secure-stegano
pip install -e ".[dev]"            # + ".[dev,notebooks]" pour les notebooks

Utilisation — CLI (--famille --algo)

python -m secure_stegano --help

# Cacher / extraire (spatial, frequency, watermarking)
python -m secure_stegano encode --famille spatial --algo pvd \
    --cover cover.png --payload "hi" --out stego.png
python -m secure_stegano decode --famille spatial --algo pvd --stego stego.png

# decode sans --algo : décodage aveugle (spatial LSB, algo lu dans l'en-tête RS)
python -m secure_stegano decode --stego stego.png

# Codecs JPEG : --quality doit être identique à l'encode et au decode
python -m secure_stegano encode --famille frequency --algo j-uniward \
    --cover photo.png --payload "secret" --out stego.png --quality 80
python -m secure_stegano decode --famille frequency --algo j-uniward \
    --stego stego.png --quality 80

# Watermarking : récupération 100 %
python -m secure_stegano encode --famille watermarking --algo qim \
    --cover cover.png --payload "owner123" --out wm.png
python -m secure_stegano decode --famille watermarking --algo qim --stego wm.png

# Détecteur d'image IA (booléen : "ai" / "real")
python -m secure_stegano identify --input photo.png

Utilisation — façade Python

from secure_stegano import embed, extract, api
from secure_stegano.common import load_image, save_image

res = embed(load_image("cover.png"), b"hi", "pvd")   # ≤ 8 octets
save_image(res.stego, "stego.png")
print(res.algorithm, res.metrics)                    # psnr, ssim, capacity_bpp

assert extract(load_image("stego.png"), algorithm="pvd") == b"hi"
assert extract(load_image("stego.png")) == b"hi"     # décodage aveugle (spatial LSB)

api.list_algorithms()          # algos groupés par famille
api.algorithms_in_family("frequency")   # ['nsf5', 'j-uniward', 'uerd']

# Détecteur d'image IA
from secure_stegano.codecs.ia.detector import identify
identify(load_image("photo.png"))        # True si générée par IA

Partie IA

  • HiDDeN (codecs/ia/hidden.py) — stéganographie apprise robuste à la recompression. Poids TorchScript téléchargés depuis le Hugging Face Hub (Cr2do/secure-stegano-hidden) à la première utilisation. Message ≤ 7 octets (budget réseau 96 bits), protégé Reed-Solomon. Entraîné dans notebooks/ai_strong_codec.
  • Détecteur (codecs/ia/detector.py) — identify(image) -> bool : Vision Transformer fine-tuné (delpot/steganograph-ia-detector, classes real/ai), entraîné dans notebooks/ai_detection. Renvoie True si l'image est jugée IA.

Structure

src/                 (mappé sur le paquet « secure_stegano » par setuptools)
├── api.py           FAÇADE : embed / extract / familles
├── __main__.py      CLI (--famille --algo, identify)
├── common/          types, io, payload (conteneur Reed-Solomon + permutation)
├── codecs/
│   ├── spatial/     lsb, pvd, s_uniward
│   ├── frequency/   nsf5, j_uniward, uerd (+ _dct_cost : moteur commun)
│   ├── watermarking/ qim, spread_spectrum (+ _frame : cadre sans RS)
│   └── ia/          hidden (stégano apprise) + detector (identify)
└── metrics/         psnr, ssim, ber, capacity

Chaque codec suit le même squelette (constantes → helpers → classe CodecINSTANCE → wrappers module) pour qu'un algo lu = tous les autres lisibles.

Notes d'implémentation (choix assumés)

  • Codes adaptatifs (S-UNIWARD, J-UNIWARD, UERD). La fonction de coût ρ(x) est implémentée fidèlement, mais couplée à un placement par coût décodable plutôt qu'un STC complet : à 8 octets (~0,0005 bpp) le gain de codage d'un STC est négligeable. Côté JPEG, ρ ne dépend que de la fréquence (table de quantification) pour garantir la convergence déterministe de l'aller-retour DCT ; l'adaptativité de contenu vient des porteurs (coefficients AC non nuls = zones texturées).
  • Stabilisation JPEG. nsF5 / J-UNIWARD / UERD insèrent dans le domaine DCT puis reconstruisent une image spatiale ; un aller-retour itératif garantit un round-trip exact. Pour de rares couples (cover, qualité) il n'atteint pas de point fixe et lève une erreur claire — changer de --quality résout le cas.

Tests et qualité

ruff check src      # lint (barrière bloquante) — passe

La suite tests/ est en cours de réécriture (roundtrips, métriques par famille) ; elle sera réintroduite dans une passe dédiée.

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

secure_stegano-1.1.6.tar.gz (29.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

secure_stegano-1.1.6-py3-none-any.whl (42.9 kB view details)

Uploaded Python 3

File details

Details for the file secure_stegano-1.1.6.tar.gz.

File metadata

  • Download URL: secure_stegano-1.1.6.tar.gz
  • Upload date:
  • Size: 29.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for secure_stegano-1.1.6.tar.gz
Algorithm Hash digest
SHA256 fe7833f8b9a8b633149d96a5d1407b57cbefd57c02c40f4fc5cad62f48299a8a
MD5 77ce425f7adb19fcb34c45bd6aaa3b6f
BLAKE2b-256 3a1670939d5a92bf370d964a358f53b3f29fb7e3d251f9cd46519aa9ead4beba

See more details on using hashes here.

File details

Details for the file secure_stegano-1.1.6-py3-none-any.whl.

File metadata

  • Download URL: secure_stegano-1.1.6-py3-none-any.whl
  • Upload date:
  • Size: 42.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for secure_stegano-1.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0b7d2a5b16178c50be9113df9e426171cdd78dca4158793ef234b9cd90447ef2
MD5 593fda2fbe16013054f1b7b7a52b78aa
BLAKE2b-256 5d98b57db2ea336ebb8ec062621d4f10bd76f712f5915356ec9f819ee2e51fe9

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page