I. Principes — Aveugle vs Ciblée
La stéganalyse se divise en deux grandes familles selon la connaissance disponible sur l'algorithme utilisé pour cacher le message.
Stéganalyse spécifique (targeted)
On connaît l'outil ou l'algorithme utilisé. On cherche ses signatures caractéristiques.
- ▸ Chi-square sur LSB séquentiel
- ▸ Détection de l'en-tête Steghide
- ▸ Analyse des coefficients JFIF pour F5
- ▸ Pattern matching des outils connus
Stéganalyse aveugle (blind)
On ne sait pas quelle technique a été utilisée. On cherche des anomalies statistiques génériques.
- ▸ RS Analysis (distribution des LSB)
- ▸ Sample Pair Analysis
- ▸ Machine learning / réseaux de neurones
- ▸ Analyse des moments statistiques
Principe fondamental
La stéganographie introduit inévitablement des anomalies statistiques dans le fichier porteur. Une image naturelle a des propriétés statistiques prévisibles — distribution des pixels, corrélations entre canaux, régularité des bits de poids faible. L'insertion d'un message brise ces propriétés de façon mesurable, même si imperceptible visuellement.
II. Chi-square Attack
Développée par Andreas Westfeld et Andreas Pfitzmann (1999), la chi-square attack est la méthode statistique la plus connue pour détecter le LSB séquentiel.
Mécanisme
Dans une image naturelle, les valeurs de pixels paires (0, 2, 4...) et leurs valeurs impaires voisines (1, 3, 5...) ont des fréquences d'apparition naturellement différentes.
Quand on encode un message en LSB séquentiel, on remplace le bit de poids faible de chaque pixel par un bit du message. Le LSB d'une valeur paire et celui de la valeur impaire suivante deviennent statistiquement équiprobables — leurs fréquences convergent.
Distribution avant / après encodage LSB
Image naturelle
χ² élevé → distribution non-uniforme ✓
Image stéganographiée
χ² faible → distribution quasi-uniforme ⚠
import numpy as np
from PIL import Image
def chi_square_attack(image_path):
img = np.array(Image.open(image_path).convert('RGB'))
lsb = img.flatten() & 1 # Extraire les LSB
# Compter les 0 et 1 dans les LSB
n_zeros = np.sum(lsb == 0)
n_ones = np.sum(lsb == 1)
n_total = len(lsb)
# Chi-square : on s'attend à 50/50 si stéganographié
expected = n_total / 2
chi2 = ((n_zeros - expected)**2 + (n_ones - expected)**2) / expected
# p-value approximative (ddl=1)
# chi2 > 3.84 → p < 0.05 → suspect
print(f"χ² = {chi2:.4f}")
print(f"Suspect : {'OUI' if chi2 < 3.84 else 'NON'}")
chi_square_attack("photo.png")Limites
La chi-square attack ne fonctionne que contre le LSB séquentiel. Un encodage pseudo-aléatoire (clé de dispersion) ou une insertion partielle (moins de 30% de capacité) la rend inefficace. Elle génère aussi ~5% de faux positifs sur des images naturelles à fort bruit.
III. RS Analysis (Regular-Singular)
Proposée par Fridrich, Goljan et Du (2001), la RS analysis est plus robuste que le chi-square. Elle fonctionne même contre les encodages pseudo-aléatoires et permet d'estimer le taux de remplissage (quelle fraction de la capacité est utilisée).
Principe
On divise l'image en groupes de pixels et on applique une fonction de bruit local ƒ.
Chaque groupe est classifié :
- R (Regular) — ƒ augmente après flipping
- S (Singular) — ƒ diminue après flipping
- U (Unusable) — ƒ inchangée
Dans une image naturelle : |R| ≈ |R̄| et |S| ≈ |S̄|
Après LSB embedding : |R| > |R̄|, |S| < |S̄|
Avantages vs chi-square
# Installer stegdetect (Debian/Ubuntu)
apt install stegdetect
# Analyser une image
stegdetect photo.jpg
# Sortie typique :
# photo.jpg : jsteg(**) [score 0.8]
# photo.jpg : outguess(*) [score 0.4]
# photo.jpg : jphide(**) [score 0.7]
# Analyser en masse
stegdetect -t o *.jpg # teste OutGuess uniquement
stegdetect -s 10 *.jpg # sensibilité ×10IV. Stéganalyse par Machine Learning
Les méthodes classiques (chi-square, RS) deviennent inefficaces face aux algorithmes stéganographiques modernes qui minimisent leur empreinte statistique. Le machine learning apporte une approche différente : apprendre à distinguer les images normales des images stéganographiées sans modèle a priori.
SRM — Spatial Rich Model
Jessica Fridrich & Jan Kodovský. Extrait des milliers de features statistiques (co-occurrences de résidus de bruit) puis entraîne un classifier Ensemble. Reste la référence pour les images non-JPEG.
XuNet — Premier CNN stéganalyse
Guanshuo Xu et al. Réseau convolutif avec couche de prétraitement HPF (High-Pass Filter) spécifique stéganalyse. Premier réseau à dépasser SRM sur certains algorithmes.
SRNet — État de l'art
Architecture résiduelle profonde sans pooling max. Préserve les résidus de bruit stéganographique. Précision ≥99% sur BOSS v1.01 avec WOW/S-UNIWARD.
Adversarial Steganalysis
Course armements : les encodeurs (SteganoGAN, HiDDeN) sont entraînés explicitement pour tromper les détecteurs. La stéganalyse doit s'adapter en continu.
Comparaison des méthodes de stéganalyse
| Méthode | Type | LSB seq. | LSB aléat. | JPEG DCT | Stégano IA |
|---|---|---|---|---|---|
| Chi-square | Statistique | ★★★★★ | ☆☆☆☆☆ | ☆☆☆☆☆ | ☆☆☆☆☆ |
| RS Analysis | Statistique | ★★★★☆ | ★★★☆☆ | ★★☆☆☆ | ★☆☆☆☆ |
| stegdetect | Signature | ★★★☆☆ | ★★☆☆☆ | ★★★★☆ | ☆☆☆☆☆ |
| zsteg | Signature+stat | ★★★★★ | ★★★☆☆ | ★☆☆☆☆ | ☆☆☆☆☆ |
| SRM + Ensemble | ML classique | ★★★★☆ | ★★★★☆ | ★★★★☆ | ★★☆☆☆ |
| SRNet / CNN | Deep Learning | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★☆☆ |
V. Outils de stéganalyse
zsteg
RubyDétection automatique LSB pour PNG et BMP. Teste les combinaisons de canaux et de profondeurs de bits. Affiche le contenu textuel trouvé.
zsteg photo.pngzsteg -c rgb photo.pngzsteg -e "b1,rgb,lsb,xy" photo.png > output.binstegdetect
CDétecte JSteg, JPHide, OutGuess, F5 dans les JPEG. Basé sur des signatures et analyses statistiques spécifiques à chaque outil.
stegdetect photo.jpgstegdetect -s 10 photo.jpgstegdetect *.jpg | grep -v "negative"StegExpose
JavaCombine chi-square, RS analysis, Sample Pair et Primary Sets. Produit un score de suspicion entre 0 et 1. Conçu pour l'analyse en masse.
java -jar StegExpose.jar /images/java -jar StegExpose.jar /images/ 0.2java -jar StegExpose.jar /images/ default output.csvbinwalk + foremost
Python / Cbinwalk détecte les fichiers embarqués (steganographie par concaténation). foremost extrait les fichiers cachés après un fichier légitime.
binwalk photo.jpgbinwalk -e photo.jpgforemost -i photo.jpg -o ./output/Workflow CTF — Analyse d'un fichier suspect
file photo.jpgVérifier que le type MIME est cohérent (pas un PNG renommé en .jpg)
exiftool photo.jpgLire les métadonnées — indices dans les champs Comment, Artist, GPS...
binwalk photo.jpgDétecter les fichiers embarqués (ZIP, PNG, PDF dans l'image)
strings photo.jpg | grep -i flagChercher des chaînes lisibles dans le binaire
zsteg photo.pngLSB automatique sur PNG/BMP (remplacer par stegdetect pour JPEG)
stegsolve photo.pngVisualisation manuelle des bit planes — indispensable pour les images cachées dans les LSB
steghide extract -sf photo.jpgTenter sans passphrase, puis avec mots courants (rockyou.txt)
foremost -i photo.jpg -o ./out/Extraire tout fichier caché après les données JPEG
FAQ — Stéganalyse
La stéganalyse peut-elle toujours détecter un message caché ?▾
Non. Les algorithmes modernes basés sur les GANs produisent des images statistiquement indiscernables d'images naturelles. La détection dépend aussi du taux de remplissage : une image avec 1% de sa capacité utilisée est pratiquement indétectable même par RS analysis. La stéganalyse fonctionne bien en pratique contre les outils courants (Steghide, LSB basique, OpenStego).
Quelle est la différence entre stéganalyse et forensics d'image ?▾
La forensics d'image cherche des altérations (falsification, montage, JPEG ghosting). La stéganalyse cherche spécifiquement la présence d'informations cachées. Les outils se chevauchent (ExifTool, binwalk) mais les méthodes statistiques (chi-square, RS) sont propres à la stéganalyse.
Le chiffrement du message rend-il la détection impossible ?▾
Non. Le chiffrement AES préalable (comme le fait Steghide) rend le contenu inaccessible mais n'empêche pas la détection de la présence d'un message. Les outils comme stegdetect détectent Steghide par sa signature de header, indépendamment du chiffrement.
Comment éviter la détection stéganalytique ?▾
Plusieurs stratégies : (1) utiliser un taux de remplissage faible (< 5%), (2) utiliser un encodage pseudo-aléatoire avec clé, (3) choisir des supports à fort bruit naturel (photos de nature, textures), (4) utiliser des algorithmes adaptatifs (WOW, S-UNIWARD) qui évitent les zones lisses. Les réseaux adversariaux (SteganoGAN) automatisent cette optimisation.
La stéganalyse fonctionne-t-elle sur l'audio et la vidéo ?▾
Oui, avec des outils adaptés. Pour l'audio WAV : analyse des LSB et de la distribution spectrale. Pour MP3 : analyse des coefficients MDCT. Pour la vidéo : analyse frame par frame. Les outils généralistes comme binwalk fonctionnent aussi sur ces formats pour détecter les fichiers embarqués.