Retour au Blog
security||10 min de lecture

J'ai cache un message secret dans la photo d'un chat et personne ne l'a remarque pendant six mois

AR
Aral Roca

Créateur de Kitmul

Un chat regardant directement l'objectif ; cette image contient un message caché intégré par stéganographie LSB
Un chat regardant directement l'objectif ; cette image contient un message caché intégré par stéganographie LSB

J'ai trouvé un défi de stéganographie dans un CTF l'année dernière qui m'a fait fixer une photo de chat pendant deux heures. L'image semblait tout à fait normale ; 800x600 pixels d'un chat roux assis sur un clavier. Aucune anomalie dans les métadonnées, aucun fichier ZIP ajouté, aucun artefact visible. Le flag se cachait dans les bits de poids faible du canal bleu. Une fois extrait, le message faisait 43 caractères. Le chat, lui, n'avait pas changé du tout.

Cette expérience m'a entraîné dans une longue exploration. La stéganographie fait partie de ces sujets qui semblent relever de la fiction hollywoodienne jusqu'à ce qu'on essaie vraiment. On réalise alors que ce ne sont que des mathématiques ; et des mathématiques étonnamment simples.

Ce qu'est réellement la stéganographie

La stéganographie est la pratique consistant à dissimuler des données à l'intérieur d'autres données, de sorte que personne ne soupçonne l'existence des données cachées. C'est fondamentalement différent de la cryptographie. Le chiffrement brouille un message pour le rendre illisible ; la stéganographie cache le message pour que personne ne le cherche.

La distinction est importante. Un fichier chiffré crie "j'ai des secrets". Une image stéganographique ne dit rien. C'est une photo de chat. Ou un coucher de soleil. Ou le logo de votre entreprise. La meilleure stéganographie produit des fichiers porteurs statistiquement indiscernables des originaux non modifiés.

Le mot lui-même vient du grec : steganos (couvert) + graphein (écriture). La technique existe depuis la Grèce antique ; Hérodote raconte l'histoire d'un homme qui rasa la tête d'un esclave, tatoua un message sur son crâne, attendit que les cheveux repoussent, puis envoya l'esclave livrer le message. Depuis, on est passé aux pixels.

Comment fonctionne l'encodage LSB

La technique de stéganographie d'image la plus courante est l'encodage par bit de poids faible (LSB). Voici pourquoi cela fonctionne.

Un pixel dans une image RGB 24 bits possède trois canaux de couleur, chacun stocké sous forme de valeur 8 bits (0-255). Le dernier bit de chaque octet ; le bit de poids faible ; apporte la plus petite modification possible à la valeur de couleur. Le modifier change la valeur du canal d'exactement 1. La différence entre RGB(142, 87, 203) et RGB(143, 87, 202) est invisible à l'oeil nu.

On prend donc son message secret, on le convertit en binaire, et on remplace les LSB des pixels de l'image par les bits du message. Chaque pixel offre 3 bits de stockage (un par canal). Une image de 1920x1080 contient 2 073 600 pixels ; cela représente 6 220 800 bits de stockage, soit environ 760 Ko de données cachées. En pratique, on en utiliserait bien moins pour éviter la détection, mais la capacité théorique est énorme.

Voici une implémentation minimale en Python pour illustrer concrètement le principe :

from PIL import Image
import numpy as np

def text_to_bits(text):
    """Convert text to a binary string with a null terminator."""
    bits = ''.join(format(ord(c), '08b') for c in text)
    bits += '00000000'  # null terminator to mark end of message
    return bits

def hide_message(image_path, message, output_path):
    """Hide a message in the LSBs of an image."""
    img = Image.open(image_path).convert('RGB')
    pixels = np.array(img)
    flat = pixels.flatten()

    bits = text_to_bits(message)
    if len(bits) > len(flat):
        raise ValueError(f"Message too long: need {len(bits)} bits, have {len(flat)}")

    for i, bit in enumerate(bits):
        # Clear the LSB, then set it to our message bit
        flat[i] = (flat[i] & 0xFE) | int(bit)

    stego = flat.reshape(pixels.shape)
    Image.fromarray(stego.astype('uint8')).save(output_path, 'PNG')
    print(f"Hidden {len(message)} chars in {len(bits)} bits ({len(bits)/len(flat)*100:.4f}% of capacity)")

def extract_message(image_path):
    """Extract a hidden message from the LSBs of an image."""
    img = Image.open(image_path).convert('RGB')
    flat = np.array(img).flatten()

    bits = ''.join(str(b & 1) for b in flat)
    chars = []
    for i in range(0, len(bits), 8):
        byte = bits[i:i+8]
        if byte == '00000000':
            break
        chars.append(chr(int(byte, 2)))
    return ''.join(chars)

# Usage
hide_message('cat.png', 'The flag is CTF{hidden_in_plain_sight}', 'stego_cat.png')
print(extract_message('stego_cat.png'))

L'opération clé se trouve à la ligne 18 : (flat[i] & 0xFE) | int(bit). Le ET binaire avec 0xFE (11111110 en binaire) efface le LSB, et le OU le fixe à la valeur de notre bit de message. C'est toute l'astuce. Le reste n'est que conversion de texte en bits et itération sur les pixels.

Cacher un message étape par étape

Si vous ne souhaitez pas écrire de Python ; ou si vous êtes sur une machine où vous ne pouvez pas installer PIL ; l'outil de stéganographie sur Kitmul fait la même chose directement dans votre navigateur. Aucun envoi de fichier, aucun traitement serveur. L'image ne quitte jamais votre appareil.

Voici le processus :

  1. Chargez une image porteuse. Le format PNG fonctionne le mieux car il est sans perte. La compression JPEG détruira vos bits cachés ; nous y reviendrons plus loin.
  2. Saisissez votre message secret. L'outil vous indique la capacité disponible en fonction des dimensions de votre image.
  3. Téléchargez l'image stéganographiée. Elle est visuellement identique à l'originale. Pixel par pixel, les différences sont imperceptibles.

Pour extraire le message, passez en mode Révélation, chargez l'image stéganographiée, et le texte caché apparaît.

L'outil de stéganographie en mode Cacher avec la zone de chargement, le champ de saisie du message secret et le bouton de téléchargement
L'outil de stéganographie en mode Cacher avec la zone de chargement, le champ de saisie du message secret et le bouton de téléchargement

Toute l'opération s'exécute côté client grâce à l'API Canvas et aux tableaux typés. Votre message secret ne transite jamais par une connexion réseau. C'est un point essentiel ; si vous cachez des informations sensibles, les envoyer à un serveur tiers va à l'encontre du but recherché.

Détection et stéganalyse ; comment NE PAS se faire repérer

La stéganalyse est l'art de détecter la stéganographie, et c'est plus sophistiqué qu'on pourrait le penser.

L'inspection visuelle ne détectera pas l'encodage LSB. Mais l'analyse statistique, si. Le test le plus simple est une analyse du chi carré des distributions de valeurs de pixels. Dans une image naturelle, les valeurs de pixels suivent une distribution caractéristique. L'insertion LSB aplatit les paires de valeurs (par exemple, 142 et 143 deviennent également probables), ce qui crée une anomalie dans l'histogramme.

Des outils comme StegExpose et OpenStego intègrent des modules de détection. Dans les compétitions CTF, zsteg et steghide sont les outils d'extraction de référence.

Voici des conseils pratiques pour que votre image stéganographiée résiste à l'examen :

  • Utilisez moins de capacité. N'intégrer des données que dans 10 à 20 % des pixels disponibles rend la détection statistique bien plus difficile. Utiliser 100 % de la capacité est un signal d'alerte en analyse forensique.
  • Randomisez la sélection des pixels. Au lieu d'écrire séquentiellement à partir du pixel 0, utilisez une séquence pseudo-aléatoire initialisée par un mot de passe pour choisir les pixels porteurs de données. Cela répartit les modifications de manière uniforme.
  • Choisissez des images chargées. Les photos avec beaucoup de texture, de bruit et de variation de couleurs dissimulent mieux les modifications LSB que les dégradés lisses ou les aplats. Une photo de sous-bois est préférable à une photo de mur blanc.
  • N'utilisez jamais le JPEG comme format porteur. La compression avec perte du JPEG modifie les valeurs des pixels lors de l'encodage. Vos bits cachés seront détruits à l'enregistrement de l'image. Utilisez toujours le PNG, le BMP ou le TIFF pour la stéganographie LSB.
  • Supprimez les métadonnées avant le partage. Des données EXIF indiquant que l'image a été traitée par un outil de stéganographie constituent un indice évident.

Quand combiner stéganographie et chiffrement

La stéganographie et le chiffrement résolvent des problèmes différents, et l'approche la plus robuste utilise les deux. Voici pourquoi.

Si un attaquant soupçonne que votre image contient des données cachées et parvient à extraire les LSB, il verra votre message en clair. Partie terminée. Mais si vous chiffrez d'abord le message ; en utilisant AES-256, par exemple ; les bits extraits ressembleront à du bruit aléatoire. L'attaquant ne pourra pas déterminer s'il a trouvé un message ou simplement des données d'image normales.

Le processus pratique :

  1. Chiffrez votre message avec un algorithme symétrique robuste.
  2. Cachez le texte chiffré dans l'image par encodage LSB.
  3. Partagez l'image stéganographiée publiquement.
  4. Transmettez la clé de déchiffrement par un canal séparé.

Cela vous offre deux couches de protection : le message est à la fois caché (stéganographie) et illisible (chiffrement). Un attaquant devrait à la fois détecter les données cachées et casser le chiffrement ; un problème nettement plus complexe que l'un ou l'autre pris séparément.

Les outils de sécurité et de cryptographie de Kitmul incluent le chiffrement AES, des générateurs de hash et d'autres utilitaires qui complètent l'outil de stéganographie pour ce type de processus.

Cas d'utilisation concrets

La stéganographie n'est pas qu'un gadget de CTF. Elle a des applications légitimes et importantes.

Tatouage numérique. Les éditeurs, photographes et entreprises médias intègrent des filigranes invisibles dans les images pour tracer les distributions non autorisées. Si une image fuitée refait surface, le filigrane intégré identifie le destinataire responsable de la fuite. C'est ainsi que plusieurs grands studios de cinéma tracent les copies de visionnage.

Lanceurs d'alerte et résistance à la censure. Dans les pays soumis à une surveillance internet intense, la stéganographie permet aux activistes de partager des informations via des images d'apparence anodine publiées sur les réseaux sociaux. L'image passe l'inspection des filtres de contenu automatisés ; le message caché atteint son destinataire.

Communication clandestine. Les agences de renseignement utilisent la stéganographie depuis au moins le début des années 2000. L'arrestation par le FBI en 2010 d'espions russes (le programme "Illegals") a révélé qu'ils intégraient des messages chiffrés dans des images publiées sur des sites web publics.

Défis CTF. Les compétitions Capture The Flag adorent la stéganographie car elle teste un ensemble de compétences différent des défis crypto classiques. Il faut d'abord identifier que la stéganographie a été utilisée avant de pouvoir commencer l'extraction. Les techniques stéganographiques courantes en CTF incluent l'encodage LSB, les données ajoutées en fin de fichier, la manipulation de palette dans les fichiers GIF et la dissimulation dans le spectre audio.

Preuve de propriété. Les artistes et créateurs de contenu peuvent intégrer des informations de droits d'auteur ou des preuves de propriété directement dans leurs oeuvres. Contrairement aux filigranes visibles, ceux-ci ne dégradent pas la qualité visuelle de la pièce.

Un système d'équations linéaires sur papier ; les mathématiques derrière la stéganographie sont plus simples qu'il n'y paraît
Un système d'équations linéaires sur papier ; les mathématiques derrière la stéganographie sont plus simples qu'il n'y paraît

Les limites de l'encodage par pixels

La stéganographie LSB comporte des contraintes réelles qu'il convient de comprendre. L'image porteuse doit être sans perte ; toute étape de compression avec perte (JPEG, WebP lossy) corrompra les données intégrées. La capacité du message évolue avec les dimensions de l'image, mais utiliser plus de 15 à 20 % de la capacité rend l'image vulnérable à la détection statistique. Et la technique ne fait que cacher les données ; elle ne les protège pas contre l'extraction par quelqu'un qui sait quoi chercher.

Pour la plupart des usages pratiques, la stéganographie d'image fonctionne au mieux comme une couche dans une stratégie de défense en profondeur. Cachez le message, chiffrez le contenu, et utilisez un canal sécurisé pour partager la clé. Aucune technique n'est infaillible à elle seule, mais leur combinaison élève considérablement la barre.

Essayez par vous-même

L'outil de stéganographie sur Kitmul vous permet de cacher et révéler des messages dans des images PNG directement depuis votre navigateur. Tout s'exécute côté client ; aucune donnée n'est envoyée, aucun compte requis, aucune limite. Chargez une image, saisissez un message, téléchargez le résultat. Puis essayez l'extraction pour vérifier l'aller-retour.

Si les outils de sécurité et de confidentialité vous intéressent, la collection Sécurité et Cryptographie comprend des générateurs de hash, des outils de chiffrement, des générateurs de mots de passe et bien plus ; le tout fonctionnant localement dans votre navigateur.


L'ensemble du traitement s'exécute localement dans votre navigateur. Aucune image ni message n'est envoyé à un serveur. L'outil est gratuit, ouvert, et ne nécessite ni compte ni inscription.

Partager cet article

Newsletter

Recevez des Conseils Productivité et les Nouveaux Outils en Premier

Rejoignez les créateurs et développeurs qui valorisent la confidentialité. Chaque édition : nouveaux outils, astuces productivité et mises à jour — sans spam.

Accès prioritaire aux nouveaux outils
Désabonnez-vous à tout moment, sans questions