Comment ça fonctionne
Chaque pixel d'une image est représenté par trois canaux de couleur : Rouge (R), Vert (G) et Bleu (B), chacun codé sur 8 bits (valeur de 0 à 255). Le bit le plus à droite — le bit de poids faible (LSB) — ne contribue qu'à une variation de ±1 sur 255, soit 0,4 % de la valeur totale. Cette variation est imperceptible à l'œil humain.
En remplaçant ce bit par un bit de notre message, on peut cacher 3 bits par pixel (un par canal R, G, B) sans altération visible de l'image.
MESSAGE : "Hi" → "H" = 01001000 "i" = 01101001
H : 0 1 0 0 1 0 0 0
│ │ │ │ │ │ │ │
PIXEL 1 R: 1100101[0]─┘ │ │ │ │ │ │ │ bit 0 de "H"
G: 1011010[1]───┘ │ │ │ │ │ │ bit 1 de "H"
B: 1100110[0]─────┘ │ │ │ │ │ bit 2 de "H"
PIXEL 2 R: 1001101[0]───────┘ │ │ │ │ bit 3 de "H"
G: 1110010[1]─────────┘ │ │ │ bit 4 de "H"
B: 1001011[0]───────────┘ │ │ bit 5 de "H"
PIXEL 3 R: 1100101[0]─────────────┘ │ bit 6 de "H"
G: 0110100[0]───────────────┘ bit 7 de "H"
B: 1010011[↑]── début de "i" ...
→ chaque caractère = 8 bits = 2⅔ pixels utilisés
→ variation max sur chaque canal : ±1 (ex: 202 → 203)Pourquoi PNG et pas JPEG
Le JPEG utilise une compression avec perte (lossy) basée sur la DCT (Discrete Cosine Transform). Cette compression arrondit et modifie les valeurs des pixels lors de la sauvegarde — ce qui écrase irrémédiablement les bits cachés en LSB.
Le PNG utilise une compression sans perte (lossless) : les valeurs exactes de chaque pixel sont préservées. Un bit modifié en LSB restera intact après sauvegarde, chargement et re-sauvegarde.
PNG (lossless) JPEG (lossy)
───────────────────── ─────────────────────
Pixel original R:202 G:117 B:204 R:202 G:117 B:204
│ │
compression compression DCT
SANS perte AVEC perte
│ │
Pixel sauvegardé R:202 G:117 B:204 R:198 G:120 B:207
│ │
LSB du rouge [0] ← intact [0]→[0] ← modifié !
│ │
Message LSB ✓ préservé ✗ corrompu⚠ Attention : même une image PNG peut être corrompue si elle transite par un service qui la recompresse automatiquement (WhatsApp, Facebook, Instagram, screenshots macOS/Windows par défaut...). Toujours transmettre le fichier PNG original, jamais via un réseau social.
Capacité de stockage
La capacité maximale d'une image dépend uniquement de sa résolution. Chaque pixel offre 3 bits (canaux R, G, B) — soit 3/8 d'un caractère par pixel.
| Résolution | Pixels | Capacité | Équiv. |
|---|---|---|---|
| 320 × 240 | 76 800 | 28 800 | ~29 Ko |
| 800 × 600 | 480 000 | 180 000 | ~180 Ko |
| 1920 × 1080 | 2 073 600 | 777 600 | ~760 Ko |
| 3840 × 2160 | 8 294 400 | 3 110 400 | ~3 Mo |
Variantes LSB
La variante standard cache 1 bit par canal. Il existe des variantes multi-bit qui augmentent la capacité au prix d'une dégradation visuelle croissante. Il existe également des variantes qui randomisent l'ordre d'injection via une clé secrète, rendant l'extraction impossible sans la clé.
Variante Bits/canal Capacité Détection visuelle
───────── ────────── ──────── ──────────────────
LSB-1 1 bit ×1 imperceptible ████░░░░░░
LSB-2 2 bits ×2 légère ███████░░░
LSB-4 4 bits ×4 visible ██████████
Exemple sur un octet :
Original : 1 1 0 0 1 0 1 0
↑
LSB-1 : 1 1 0 0 1 0 1 [X] cache 1 bit
LSB-2 : 1 1 0 0 1 0 [X X] cache 2 bits
LSB-4 : 1 1 0 0 [X X X X] cache 4 bits
Variante aléatoire (avec clé) :
clé "secret" → PRNG → ordre d'injection aléatoire
→ sans la clé, impossible de reconstruire le messageLSB séquentiel
StandardLes bits sont injectés dans l'ordre, pixel par pixel depuis le coin supérieur gauche. Simple mais détectable par stéganalyse statistique.
LSB aléatoire
RenforcéUne clé secrète génère un ordre d'injection pseudo-aléatoire. Bien plus résistant à l'analyse, mais la clé doit être partagée avec le destinataire.
Détection & stéganalyse
Le LSB séquentiel est vulnérable à plusieurs méthodes d'analyse statistique. Une image naturelle présente un bruit aléatoire dans ses bits de poids faible, tandis qu'une image stéganographiée présente des patterns structurés.
1. Analyse du bit-plane LSB
Image naturelle Image LSB-stégo
░▓░░▓▓░▓░░▓░▓ ▓▓▓░░░▓▓▓░░░▓▓
▓░░▓░░▓░▓▓░░▓ ░░░▓▓▓░░░▓▓▓░░
░▓▓░▓░░▓░▓░▓░ ▓░▓░▓░▓░▓░▓░▓░
→ bruit aléatoire → pattern structuré
2. Test chi-carré (Chi-square attack)
Compare la distribution des paires de valeurs adjacentes.
Ex: (200, 201) devraient avoir la même fréquence si LSB est aléatoire.
Un écart significatif trahit un message.
3. RS Analysis (Regular / Singular)
Mesure la régularité des groupes de pixels.
Détecte même les messages courts ou épars.
4. StegExpose (outil)
Combine chi-carré, RS et sample pairs analysis.
Commande : stegexpose image.png→ Pour résister à la stéganalyse : utiliser le LSB aléatoire avec clé, ne remplir qu'une faible fraction de la capacité (<15 %), et choisir des images à texture complexe (photographies plutôt qu'images lisses ou dégradés).
Limites & précautions
Recompression
Toute recompression JPEG (réseaux sociaux, email, screenshot) détruit le message. Transmettre le fichier PNG directement.
Transformations
Redimensionner, recadrer, faire pivoter ou filtrer l'image efface les données LSB. L'image doit rester intacte.
Metadata EXIF
Les métadonnées EXIF peuvent révéler le logiciel utilisé. Nettoyer les EXIF avec exiftool avant transmission.
Stéganalyse
Le LSB séquentiel est facilement détectable par chi-carré ou RS analysis. Préférer une variante aléatoire pour un usage sensible.
Questions fréquentes
C'est quoi concrètement 'cacher un bit' dans un pixel ?
Un pixel est composé de 3 valeurs de couleur (rouge, vert, bleu), chacune entre 0 et 255. Le bit de poids faible représente une variation de ±1 — imperceptible à l'œil humain. En remplaçant ce bit par un bit de votre message, l'image semble strictement identique à l'original.
Est-ce que le LSB est sécurisé pour cacher des informations sensibles ?
Non, pas seul. Le LSB est facilement détectable par des outils automatiques (StegExpose, zsteg). Pour un usage sensible, chiffrez toujours votre message avec AES-256 AVANT de l'injecter, et utilisez une variante aléatoire avec clé secrète. La stéganographie cache l'existence du message, le chiffrement protège son contenu.
Quels sont les cas d'usage concrets du LSB ?
CTF (Capture The Flag) : c'est la technique la plus testée dans les challenges. Communication discrète : deux personnes partageant la même clé échangent des images banales contenant des messages. Tatouage numérique léger pour prouver la paternité d'une image. Forensics : les enquêteurs cherchent des messages LSB dans les images saisies.
Quelle image choisir pour maximiser la discrétion ?
Choisissez une photographie complexe avec beaucoup de texture (paysage, foule, végétation) plutôt qu'un fond uni ou un dégradé. Plus l'image est 'bruitée' naturellement, mieux les modifications LSB se fondent dans ce bruit. Évitez les images synthétiques (logos, captures d'écran de texte) qui n'ont pas de bruit naturel.
N'importe quel outil peut-il encoder et décoder un message LSB ?
Non. L'encodeur et le décodeur doivent utiliser le même protocole (ordre d'injection, délimiteur de fin). Les outils compatibles entre eux : Steghide, OpenStego, zsteg (lecture seulement). Pour les CTF, essayez toujours zsteg et stegsolve en premier.
Tester la technique
Encodez et décodez un message dans une image PNG directement dans votre navigateur. Aucune installation, aucun serveur.