La stéganographie est l'art de cacher un message de telle sorte que personne ne soupçonne qu'il existe un message. Le chiffrement brouille un message pour qu'il ne puisse pas être lu ; la stéganographie le glisse dans quelque chose d'ordinaire, comme une photo de vacances ou un mémo vocal, pour que personne ne pense à regarder. Le mot vient du grec et signifie « écriture couverte ».

La stéganographie numérique concerne surtout les images, car une photo contient des millions de nombres que l'on peut légèrement modifier sans que personne ne voie de différence. Ce guide explique les méthodes qui existent réellement, de la modification du dernier bit d'un pixel au travail à l'intérieur de la compression JPEG, pourquoi la plupart des astuces de « fichier caché dans une image » sont quelque chose de plus simple que la vraie stéganographie, pourquoi envoyer une photo par une messagerie efface souvent la partie cachée, et ce que font ceux qui cherchent des données cachées, les stéganalystes.

Qu'est-ce que la stéganographie

Tout système stéganographique a les trois mêmes parties. La charge utile (payload) est le secret : un message, un fichier, un dossier. Le support (carrier), aussi appelé couverture, est le fichier innocent qui la contient : un PNG, un JPEG, un enregistrement WAV. Le résultat, le support avec la charge utile à l'intérieur, s'appelle le fichier stégo ou l'ensemble. L'article de Wikipédia sur le sujet ajoute un quatrième terme utile, la densité d'encodage : la part du support qui a été modifiée. Plus la densité est faible, plus le changement est difficile à remarquer, et moins il y tient de données.

L'avantage sur le chiffrement, selon les mots de Wikipédia, est que le secret « does not attract attention to itself as an object of scrutiny » (n'attire pas l'attention sur lui-même comme objet d'examen). Un fichier chiffré annonce que quelque chose est protégé. Une photo de chien n'annonce rien. C'est aussi la faiblesse : dès que quelqu'un soupçonne la photo, la stéganographie seule ne protège rien, raison pour laquelle les outils sérieux chiffrent d'abord la charge utile et la cachent ensuite. Le fait de cacher achète de l'obscurité. C'est le chiffrement qui garde le contenu en sécurité quand l'obscurité échoue.

L'idée a 2 500 ans de plus que l'ordinateur

Les plus anciennes histoires sont physiques. Hérodote décrit un message tatoué sur le crâne rasé d'un messager, envoyé une fois les cheveux repoussés. Les siècles suivants ont utilisé des encres invisibles qui apparaissent à la chaleur, et au XXe siècle les micropoints réduisaient une page de texte à la taille d'un point final imprimé. Le mot lui-même apparaît pour la première fois en 1499, dans la Steganographia de Johannes Trithemius, un traité de cryptographie et de stéganographie déguisé en livre de magie.

La version numérique garde la même logique et remplace le crâne par un format de fichier. Un support n'a besoin que de deux propriétés : une partie de lui peut changer sans qu'un humain le remarque, et un programme qui sait où regarder peut relire le changement. Les images ont les deux en abondance.

La stéganographie LSB modifie le dernier bit de chaque couleur

La méthode de référence des manuels est l'insertion dans le bit de poids faible (LSB, least significant bit). Un pixel d'une image typique stocke le rouge, le vert et le bleu sous forme de nombres de 0 à 255, chacun écrit sur huit bits. Le dernier bit vaut exactement un cran. Inversez-le et une valeur de rouge de 200 devient 201. Aucun écran et aucun œil ne peut montrer cette différence.

Un pixel avec rouge 200, vert 117 et bleu 54 en binaire. Remplacer le dernier bit de chaque valeur par les bits du message 1, 0, 1 donne 201, 116 et 55. Les deux échantillons de couleur paraissent identiques.
Trois bits de message stockés dans un pixel. Chaque valeur bouge d'un cran au plus sur 255.

Répétez cela sur chaque valeur de l'image et la capacité s'additionne. Une photo de 12 mégapixels a 36 millions de valeurs de couleur : un bit chacune fait 36 millions de bits, environ 4,5 Mo en théorie. Les vrais outils en utilisent bien moins, à la fois pour rester discrets et parce qu'ils dispersent les bits dans un ordre pseudo-aléatoire dérivé d'un mot de passe, de sorte que la charge utile n'est pas un bloc net en haut de l'image.

Le LSB ne fonctionne que sur les formats sans perte comme PNG et BMP, où chaque valeur de pixel est stockée exactement. Enregistrez la même image en JPEG et le compresseur arrondit les valeurs, brouillant les derniers bits et le message avec eux.

C'est aussi la méthode que les stéganalystes comprennent le mieux. Les photos naturelles ont un motif de bruit caractéristique dans leurs bits de poids faible, et les écraser avec des données chiffrées, qui paraissent parfaitement aléatoires, change ce motif. Westfeld et Pfitzmann ont publié une attaque statistique contre l'insertion LSB en 2000, et Fridrich, Goljan et Du ont montré en 2001 que, dans les images en couleur, l'insertion augmente le nombre de paires de couleurs « très proches ». Wikipédia rapporte que les modifications LSB seules peuvent être détectées « in some cases detecting encoding densities as low as 1% with reasonable reliability » (dans certains cas, en détectant des densités d'encodage aussi basses que 1 % avec une fiabilité raisonnable), bien que ce chiffre n'y soit pas référencé. Sur Hacker News, un commentateur l'a dit plus crûment : le bruit introduit par le remplacement LSB naïf est « VERY easy to detect » (TRÈS facile à détecter).

La stéganographie JPEG travaille à l'intérieur de la compression

La plupart des photos sur les téléphones et sur le web sont des JPEG : les outils ont donc dû trouver un moyen de survivre à l'arrondi du JPEG. La réponse est de cacher les données après l'arrondi plutôt qu'avant.

Un encodeur JPEG découpe l'image en blocs de 8 par 8 pixels et convertit chaque bloc en 64 coefficients de fréquence avec une transformée appelée transformée en cosinus discrète (DCT) : un nombre pour la luminosité moyenne du bloc, d'autres pour le détail grossier et fin. Il divise ensuite ces coefficients par une table de qualité et les arrondit, ce qui est le moment où la perte se produit. La stéganographie JPEG modifie les coefficients arrondis eux-mêmes : rien de ce que fait ensuite l'encodeur n'arrondit donc le message.

Les premiers outils le faisaient naïvement. JSteg et JPHide, deux des programmes que Provos et Honeyman ont testés en 2001, modifient les bits de poids faible des coefficients d'une façon qui déplace leur histogramme global, ce que les tests statistiques détectent. OutGuess, écrit par Niels Provos en 1999, insère des bits dans des coefficients pseudo-aléatoires puis ajuste d'autres coefficients pour que l'histogramme global corresponde à l'original, précisément pour déjouer l'attaque du khi-deux.

Cela n'a pas duré : une attaque de 2002 par Fridrich, Goljan et Hogea a mesuré la « blockiness » (effet de blocs) aux bords des blocs JPEG et a cassé OutGuess, en estimant même la longueur du message caché. steghide, l'outil en ligne de commande le plus connu, emprunte une autre voie pour le JPEG et l'audio : il échange des paires de valeurs choisies avec la phrase de passe, de sorte que le nombre de chaque couleur ou échantillon reste le même, ce que ses auteurs décrivent comme résistant aux « first-order statistical tests » (tests statistiques du premier ordre).

Cette course aux armements reste la forme du domaine. Fridrich, Pevny et Kodovsky ont qualifié en 2007 la stéganographie JPEG statistiquement indétectable de problème de recherche plein d'« impasses » (dead ends), et en 2012 la stéganalyse était passée à des classificateurs d'apprentissage automatique entraînés sur des milliers de caractéristiques d'image. Les deux affirmations que l'on trouve en ligne, que la stéganographie est « facile à détecter » et qu'elle est « difficile à détecter », sont vraies. La ligne de partage est l'algorithme, pas l'idée.

La plupart des « fichiers cachés dans une image » sont des données ajoutées, pas de la vraie stéganographie

Cherchez sur YouTube comment cacher un fichier dans une image : la démonstration la plus courante n'est pas du tout du LSB. C'est une commande d'une ligne sous Windows :

  1. Mettez une photo et une archive zip dans le même dossier.
  2. Exécutez copy /b photo.jpg + archive.zip combined.jpg dans l'Invite de commandes. Sous macOS ou Linux, cat photo.jpg archive.zip > combined.jpg fait la même chose.
  3. Ouvrez combined.jpg : il affiche la photo. Renommez-le en .zip et beaucoup d'outils d'archivage ouvrent les fichiers.

Cela fonctionne à cause de la façon dont les formats se terminent. Un JPEG se termine par un marqueur de fin d'image et un PNG par un bloc appelé IEND, que la spécification PNG définit comme « the last chunk in a PNG datastream » (le dernier bloc d'un flux de données PNG). Les visionneuses d'images s'arrêtent là et ignorent tout ce qui suit. Les lecteurs de zip, à l'inverse, cherchent le répertoire de l'archive à la fin du fichier et remontent. Un fichier que deux programmes différents lisent chacun comme valide s'appelle un polyglotte (polyglot), et la « old RAR trick » (vieille astuce RAR), comme l'a appelée un utilisateur de Reddit sur r/Steganography, en est l'exemple le plus courant.

Schéma de trois façons de cacher des données dans un fichier : modifier les bits de poids faible des pixels dans les données de l'image, ajouter des octets après le marqueur de fin, et ajouter des enregistrements supplémentaires que le format autorise avant le marqueur de fin.
Trois endroits où des données cachées peuvent vivre. Seul le premier modifie l'image elle-même.

Une troisième famille se situe entre les deux. La plupart des formats sont des conteneurs de blocs étiquetés et définissent un moyen d'en ajouter de personnalisés : PNG a des blocs auxiliaires, JPEG a des segments d'application, MP4 a des boîtes définies par l'utilisateur, PDF autorise les commentaires. Une visionneuse qui ne reconnaît pas un bloc le saute : le fichier reste donc entièrement valide et s'ouvre normalement partout. La capacité est grande, des gigaoctets dans une vidéo, et rien ne change dans l'image.

Aucune de ces deux dernières n'est de la stéganographie au sens strict, car aucune ne touche aux pixels ni ne cherche à paraître statistiquement normale. Le fichier transporte simplement plus que ce que son image exige. Le message le plus plébiscité dans un échantillon récent de r/Steganography cachait des données dans les octets de remplissage des lignes de balayage d'un BMP, et ses propres commentateurs ont repéré les indices : l'un a fait le calcul de la capacité, un autre a dit qu'il serait « immediately suspicious if someone sent me an image that's not png or jpg » (immédiatement méfiant si quelqu'un m'envoyait une image qui n'est ni png ni jpg). Des données ajoutées ou insérées se cachent d'une personne qui regarde l'image. Elles ne se cachent pas d'un programme qui lit tout le fichier, et le fichier est visiblement plus gros qu'une photo ordinaire de la même taille.

Partager une photo détruit souvent la charge utile

Les données cachées ne survivent que si les octets exacts survivent, et beaucoup de façons de partager des photos ne les conservent pas.

Quand une messagerie, un réseau social ou un hébergeur d'images reçoit une photo, il ne stocke souvent pas le fichier que vous avez envoyé. Il décode l'image en pixels, la redimensionne fréquemment, et écrit un tout nouveau fichier compressé pour économiser de la bande passante. Les bits LSB dans les pixels sont brouillés par la nouvelle compression. Les charges utiles au niveau des coefficients JPEG sont arrondies quand la qualité change. Les octets ajoutés et les enregistrements de format supplémentaires ne sont en général pas copiés, car l'app écrit le nouveau fichier à partir des seuls pixels.

Schéma de flux : une image avec des données cachées copiée comme fichier par clé USB, disque cloud, pièce jointe d'e-mail ou envoi en tant que document arrive inchangée et les données survivent. Envoyée comme photo, l'app décode, redimensionne et écrit un nouveau fichier : les bits des pixels sont brouillés et les octets et enregistrements supplémentaires ne sont jamais écrits.
La partie cachée ne voyage que si le fichier est copié octet pour octet.

Il n'existe pas de test public solide pour savoir quelles apps font cela aujourd'hui, et le comportement change selon les versions et entre les modes d'envoi « photo » et « document » : considérez donc tout partage comme avec perte jusqu'à preuve du contraire. Les anecdotes vont toutes dans le même sens. Un utilisateur de Reddit sur r/Steganography a constaté que la charge utile d'un outil ne survivait que dans le téléchargement PNG depuis Reddit, pas dans la version WebP que Reddit sert. Un commentateur de Hacker News se souvenait d'une tentative antérieure où « most image hosts were smart enough to detect the sub-optimal encoding and 'helpfully' fix it » (la plupart des hébergeurs d'images étaient assez malins pour détecter l'encodage sous-optimal et le « corriger » obligeamment). Le bon réflexe est simple : envoyez le fichier comme un fichier, puis vérifiez que la copie arrivée s'ouvre toujours avant de supprimer l'original.

La stéganalyse est l'art de trouver des données cachées

Wikipédia définit la stéganalyse comme « the study of detecting messages hidden using steganography » (l'étude de la détection de messages cachés par stéganographie), le pendant de la cryptanalyse. Ses objectifs viennent en trois étapes : repérer les fichiers suspects, décider s'ils portent une charge utile, et la récupérer si possible. Les deux premières relèvent des statistiques et de l'inspection de fichiers. La troisième demande généralement le mot de passe, raison pour laquelle le chiffrement compte même après que le masquage a été percé à jour.

L'étude de terrain la plus connue montre combien la troisième étape est difficile en pratique. En 2001, Niels Provos et Peter Honeyman ont analysé deux millions d'images provenant d'enchères eBay. Leur détecteur en a signalé environ 17 000, et une attaque par dictionnaire sur celles-ci n'a trouvé aucun message caché. L'article de Wikipédia avertit qu'agir sur la seule stéganalyse est « a very dicey proposition unless a payload has been completely recovered and decrypted » (une proposition très risquée à moins qu'une charge utile n'ait été entièrement récupérée et déchiffrée), car sinon l'analyste n'a que « a statistic indicating that a file may have been modified » (une statistique indiquant qu'un fichier a pu être modifié). L'histoire complète de ce à quoi ressemble la détection, et de ses limites, se trouve dans les photos cachées peuvent-elles être détectées ?. Les outils des deux camps, avec leur âge et leurs points faibles, sont comparés dans les outils de stéganographie.

Comment HideFile peut vous aider

La plupart des gens qui cherchent « stéganographie » n'ont pas besoin d'un canal secret. Ils veulent que quelques photos ou fichiers privés cessent d'être évidents sur un téléphone ou un ordinateur portable que d'autres personnes prennent en main. Pour cela, les outils classiques sont malcommodes : steghide contient de petites charges utiles dans du JPEG et du WAV, les outils LSB exigent du PNG, et aucun ne vous donne une galerie que vous pouvez parcourir.

HideFile adopte la troisième approche du schéma ci-dessus. Sur hidefile.app, dans n'importe quel navigateur récent, vous choisissez une photo, une vidéo ou un PDF ordinaire comme couverture, ajoutez vos fichiers privés et définissez un mot de passe. HideFile chiffre les fichiers dans le navigateur et les stocke sous forme d'enregistrements que le format de fichier autorise, de sorte que la couverture s'ouvre toujours comme une image, une vidéo ou un document normal partout ailleurs. Ouvrez-la sur hidefile.app avec le mot de passe et les fichiers apparaissent. Rien n'est envoyé à un serveur HideFile, et il n'y a rien à installer.

C'est de la dissimulation plus du chiffrement, et il est honnête sur la partie qui fait le travail. HideFile ne modifie pas les pixels et n'essaie pas de tromper les tests statistiques. Un outil spécialisé peut constater que des données ont été ajoutées à la couverture ; ce qu'il ne peut pas faire, c'est lire le contenu sans le mot de passe. C'est donc adapté pour tenir des choses à l'écart des personnes qui parcourent vos appareils, et ce n'est pas le bon outil face à un examinateur formé, à une fouille à la frontière ou à une pression juridique.

Il n'y a pas de récupération de mot de passe, et les apps qui réencodent les photos peuvent supprimer la partie cachée : gardez et partagez donc la couverture comme un fichier. Pour le tableau complet de ce que trompent les différentes astuces pour cacher, voir comment cacher des fichiers à la vue de tous, et pour la comparaison des applications coffre-fort pour photos, une application coffre-fort pour photos est-elle sûre ?.

Sources