Qu'est-ce que la DCT ?
La Transformée en Cosinus Discrète (DCT) est une opération mathématique qui convertit un bloc de pixels du domaine spatial (valeurs de couleur) vers le domaine fréquentiel (amplitudes de fréquences).
JPEG découpe l'image en blocs de 8×8 pixels et applique la DCT à chacun. Le résultat est une matrice 8×8 de 64 coefficients DCT : le coefficient DC (énergie globale du bloc) et 63 coefficients AC (variations de fréquence). Les hautes fréquences (coins bas-droite) sont imperceptibles à l'œil et sont fortement compressées par JPEG.
Bloc 8×8 pixels (domaine spatial) Coefficients DCT (domaine fréquentiel)
┌────────────────────────┐ ┌────────────────────────────────────┐
│ 149 145 141 138 ... │ DCT │ DC:1024 AC: -8 -24 10 ... │
│ 147 143 140 137 ... │ ──────► │ 12 -6 4 -2 ... │
│ 146 142 139 136 ... │ │ -4 3 -1 0 ... │
│ ... │ │ 2 -1 0 0 ... │
└────────────────────────┘ └────────────────────────────────────┘
↑ ↑
basses fréq. hautes fréq.
(visibles) (invisibles)Comment JPEG utilise la DCT
Après la DCT, JPEG quantise les coefficients : il divise chaque valeur par un facteur de quantisation et arrondit. Les hautes fréquences sont divisées par de grands facteurs → elles tendent vers 0 (elles sont "perdues"). C'est là la compression avec perte. À la décompression, les coefficients quantisés sont multipliés en sens inverse (IDCT), ce qui donne une approximation du bloc original.
IMAGE PNG IMAGE JPEG
(domaine spatial) (compressé)
Pixels → DCT → Quantisation → Zig-zag → Huffman → Fichier .jpg
↑
divise par table de quantisation
(haute fréq. → tend vers 0)
Décompression :
Fichier .jpg → Huffman → Dé-quantisation → IDCT → Pixels approx.
↑
multiplie par table de quantisation
(les valeurs exactes sont perdues)Cacher un message dans les coefficients
On modifie les coefficients AC non nuls — ceux de fréquences moyennes, suffisamment grands pour survivre à la quantisation mais pas trop importants visuellement. Le LSB du coefficient encode un bit du message.
Astuce cruciale : on évite les coefficients qui valent 0 (ils passeraient à ±1 après modification, créant de la haute fréquence visible) et on évite le coefficient DC (trop visible).
Coefficient AC sélectionné : 42 (binaire : 00101010) Bit du message à cacher : 1 Modification LSB : 42 → 43 (00101010 → 00101011) Variation : ±1 sur un coefficient fréquentiel Impact visuel : imperceptible sur le bloc 8×8 Stratégie de sélection des coefficients : ✓ Coefficients AC non nuls (survivent à la quantisation) ✓ Amplitude modérée (5 < |coeff| < 60) ✗ Coefficient DC (trop visible) ✗ Coefficients nuls (créeraient des artefacts)
L'algorithme F5
F5 (Westfeld, 2001) est l'algorithme DCT le plus utilisé. Il améliore la stéganographie DCT naïve via le matrix encoding : au lieu de modifier 1 coefficient pour cacher 1 bit, il modifie au plus 1 coefficient pour en cacher plusieurs (typiquement 1 modif = 3 bits cachés).
F5 réduit ainsi le nombre de modifications et les traces statistiques. Outguess va plus loin en redistribuant les coefficients non utilisés pour maintenir les statistiques globales intactes.
F3/F4
Modifiction directe du LSB des coefficients AC. Simple mais détectable.
Détection : FacileF5
Matrix encoding : moins de modifications pour plus de bits cachés. Plus robuste.
Détection : ModéréOutguess
Préserve la distribution globale des coefficients DCT. Résiste à la calibration.
Détection : DifficileDétection & robustesse
La calibration attack est la méthode la plus efficace contre DCT : on re-compresse légèrement l'image suspecte (qui efface une partie des modifications DCT), puis on compare les histogrammes de coefficients avant/après. Une image stégo présente une asymétrie caractéristique. Outils : stegdetect, JSteg detector.
Test de robustesse : Image stégo JPEG qualité 90 → re-compressée à qualité 90 → compare histogramme coefficients DCT avant/après → si asymétrie : stéganographie probable Résistance selon la technique : LSB image PNG → ne résiste pas à la recompression JPEG F3/F4 JPEG → détectable par chi-carré sur coefficients F5 → résiste mieux, détectable par calibration Outguess → résistance élevée, détection difficile Commande stegdetect : stegdetect -t jopi image.jpg (j=JSteg, o=Outguess, p=F5, i=Invisible)
DCT vs LSB
| Critère | LSB (PNG) | DCT (JPEG) |
|---|---|---|
| Format requis | PNG | JPEG |
| Capacité (~1MP) | ~375 000 chars | ~10 000 chars |
| Recompression | ✗ Détruit le message | ✓ Survit (même qualité) |
| Implémentation | Très simple | Complexe (JPEG encoder) |
| Détection visuelle | Imperceptible | Imperceptible |
| Détection statistique | Facile (chi-carré) | Difficile (calibration) |
| Outils connus | zsteg, stegsolve | steghide, F5, outguess |
Questions fréquentes
Quelle est la différence entre DCT et LSB pour cacher un message ?
LSB modifie directement les bits des pixels dans l'image originale — simple mais détruit à la moindre recompression JPEG. DCT opère dans le domaine fréquentiel de JPEG : elle modifie des coefficients mathématiques, ce qui lui permet de survivre à une nouvelle compression JPEG (même qualité). En contrepartie, la capacité est 30× plus faible.
Est-ce que mon image va visuellement changer après DCT ?
Non, la modification est visuellement imperceptible. On ne touche qu'aux coefficients AC de fréquences moyennes — ceux que JPEG compresse déjà partiellement et que l'œil humain perçoit très peu. La différence PSNR entre l'originale et la stégo est typiquement supérieure à 45 dB.
Mon image DCT va-t-elle survivre si je la poste sur les réseaux sociaux ?
Probablement pas. Instagram, Twitter/X et WhatsApp re-compriment les images à leur propre qualité JPEG (souvent 75-85%), ce qui peut altérer les coefficients modifiés. DCT survit à une recompression au même niveau de qualité, mais pas nécessairement à un changement de qualité. Préférez un canal d'envoi direct (email en pièce jointe, partage de fichier brut).
Quels outils utilise-t-on pour DCT en pratique ?
Les plus connus : Steghide (le plus utilisé, F5-like), F5 (l'algorithme académique de référence, Westfeld 2001) et Outguess (résiste mieux à la calibration). En CTF, stegdetect permet de détecter leur présence : `stegdetect -t jopi image.jpg`.
Est-ce que DCT seul est suffisant pour cacher un message de façon sécurisée ?
Non. DCT améliore la robustesse statistique, mais ne protège pas le contenu. Si quelqu'un sait que l'image contient un message et utilise Steghide ou F5 sans mot de passe, il peut le lire. Associez toujours une technique DCT à un chiffrement AES-256 du message avant de l'encoder.
Essayer un outil LSB
L'outil DCT JPEG est en cours de développement. En attendant, testez la stéganographie LSB sur image PNG.