Stéganographie & Bit Plane

Salut les z'amis !

Aujourd'hui j'aimerais dans le cadre d'une présentation en amphi de la sécu (sorte de petite sauterie qu'on organise avec mon équipe une fois par mois où chacun est libre de présenter un sujet sur le thème de la sécu), un petit article sur de la "stéganographie".

Certes c'est un domaine assez peu prisé par la communauté des "hackers", mais qui n'est pas dénué de charme pour toute personne qui aime  résoudre des casses têtes.

C'est également un outil qui peut s'avérer utile pour protéger des contenus ou encore pour tracer des fichiers !
Alors si vous avez envie d'en savoir plus, c'est parti !!!!

La Stéganographie 

C'est l'art de "dissimuler" une information.
Contrairement à de la cryptographie, ici on ne cherche pas à fournir une information "chiffrée", mais on va essayer de la dissimuler.
Cela peut-être par exemple dans les pixels d'une image, dans le spectre de fichiers audios par le biais de fréquences non perceptible par l'oreille, ...
On peut l'utiliser pour stocker ou communiquer discrètement des informations sans que cela n'éveil de soupçon.

Imaginez que vous accédez à l'ordinateur d'une personne "suspectée" d'être un pédo criminel, un terroriste, ou un mafieux ....
Si vous tombez sur des fichiers chiffrés, des mails chiffrés ...
Dans ce cas, pas de doute, vous allez directement sentir quelque chose de suspect et vous allez 
tenter toutes sortes de techniques de déchiffrement.
Mais ... si vous tombez sur un ordinateur avec seulement quelques images de "chat", quelques compilations de musiques, et 2/3 échanges innocents de messages ...
ça vous paraitra beaucoup moins suspect, et vous aurez alors moins l'envie de vous engager dans la quête longue de recherche de données cachées potentiellement inexistantes.

Le Binaire dans tout ça

Reprenons un peu le concept de "donnée binaire".
Ce qui est sous entendu par binaire, c'est l'utilisation de 0 et de 1 pour traduire une donnée.

En effet, l'histoire de la communication "longue distance" (en dehors du pigeon voyageur), repose sur 2 états.

Communication par la lumière : allumée / éteinte
Communication par le son       : bruit / silence 
Communication par la fumée   : fumée /  Pas de fumée

A partir de cette information que nous pourrions traduire par des 0 ou des 1 nous sommes en mesure de recréer une information.

Par exemple le morse, qui s'appuie sur des signaux court (1) et des signaux long (111)  que l'on espace par des pauses (0).
Ces signaux sont ensuite traduits à l'aide d'une table de correspondance établie de façon universelle, afin que tout le monde puisse comprendre ce qui est transmis.

Et nous dans tout ça ?

En informatique, comme en morse, nous disposons également d'une table de correspondance (même de plusieurs), notamment la fameuse table ASCII.

Cette convention ASCII repose sur des valeurs décimales "1, 2, 3, 4.....255" auxquelles sont associées des "symboles" (chiffres, lettres, ponctuations, caractères spéciaux ...)
Comme dit précédemment nous ne disposons que de 0 et de 1 ...
Il faudra donc définir une règle mathématique, pour convertir nos 0 et nos 1 en une valeur décimale.
C'est le base "2", plus d'infos ici : https://pixees.fr/informatiquelycee/n_site/isn_base_2.html

Si j'ai un "a" .... je sais que la valeur décimale est 97 ...
Je vais donc passer 97 en base 2 et obtenir   la valeur  1100001

Le binaire s'obtient de manière incrémentale

0: 00
1: 01
2: 10
3: 11

4: 100
5: 101
6: 110
7: 111
...

Bon je vous rassure, il existe des façons mathématiques de l'obtenir sans avoir à recompter depuis 0, cependant ce n'est pas l'objectif de cet article.

Il est également intéressant de noter que nous pouvons traduire cette information en base "16" pour de l'hexadécimale.
On compte de la même façon, mais en utilisons non pas des 0 et des 1 mais plutôt une fourchette de caractère contenant 10 chiffres et 6 lettres dans l'ordre suivant : 0123456789ABCDEF

Savoir ce qu'est le binaire et comprendre le fait qu'il existe une valeur décimale est une information très importante pour la suite de l'article.

Utilisons un peu de Stéganographie à présent

Désormais vous avez compris que lorsque vous saisissez un caractère, ce n'est pas réellement celui-ci qui est stocké, mais plutôt son information décimale ... à moins que ça ne soit directement sa valeur binaire ? 

 J'évoquais précédemment la table ASCII, celle-ci est une vieille convention contenant le minimum syndicale de données utiles.
Mais ils existent aujourd'hui de très nombreux caractères / symboles qui sont venus s'ajouter à cette liste pour vous permettre par exemple de profiter d'emoji dans vos messages. 
Ces caractères font parties d'une autre convention / "table" (si l'on peut parler de table).
Cette convention c'est l'UNICODE ... contrairement à l'ASCII qui contient 255 symboles (car l'ascii repose sur le principe qu'un caractère doit pouvoir loger au maximum dans un octet (8bit)), l'UNICODE en compte des milliers !
Certains ont vocation d'enrichir votre texte, mais d'autres ont un rôle plutôt utiles.

Il existe par exemple des caractères de ponctuation "non visibles" et "magiques" qui permettent de faire un retournement / flip horizontale à votre texte.
je vous invite à jeter un œil ici : https://unicode-explorer.com/b/2000

D'ailleurs, si vous utilisez le bloc note de Windows, vous pouvez en utiliser quelques un avec un simple clic droit.

Les caractères LRE / RLE et RLO / LRO vont changer l'orientation du texte, mais ont aussi la particularité de ne pas être visible.
Vous pouvez en insérer 1, 10, 20, 50 .... 10000 entre 2 lettres, que la personne qui lira, ne verra que les 2 lettre sans présence visible de tous ces caractères non visibles.
Il devient alors parfaitement possible de créer notre propre "convention"  en s'appuyant sur le "binaire" ^^
Au lieu d'utiliser des 0 ou des 1 ... nous utiliserions ces caractères afin de dissimuler des messages cachés au sein de messages visibles.

Par exemple, ci-dessous j'écris un message complétement innocent : 

Salut Toi

Si je souhaite cacher le mot "Stéganographie" ...
D'abord, je converti chaque caractère dans sa valeur décimale.

Ensuite, pour chacune des valeurs décimale ... je produis sa valeur "binaire".

J'obtiens du mot "Stéganographie", pour chaque lettre des suites de 0 et de 1.
Si j'insère tout ça entre dans le mot "Toi" ça donne ça.
Salut T1010011 1110100 1100101 1100111 1100001 1101110 1101111 1100111 1110010 1100001 1110000 1101000 1101001 1100101oi

Mon message "binaire" n'est pas vraiment invisible ici.
Puis en remplaçant le binaires et les espacements de celui-ci, par des caractères invisibles (les fameux caractères unicodes évoqués un peu plus tôt), j'obtiens ceci : 

"Salut T‍‎‍‎‎‍‍‌‍‍‍‎‍‎‎‌‍‍‎‎‍‎‍‌‍‍‎‎‍‍‍‌‍‍‎‎‎‎‍‌‍‍‎‍‍‍‎‌‍‍‎‍‍‍‍‌‍‍‎‎‍‍‍‌‍‍‍‎‎‍‎‌‍‍‎‎‎‎‍‌‍‍‍‎‎‎‎‌‍‍‎‍‎‎‎‌‍‍‎‍‎‎‍‌‍‍‎‎‍‎‍oi"

Le mot injecté en binaire est à présent INVISIBLE (à l'œil nu) !

Mais lorsque je le colle dans un endroit capable de révéler tous les caractères ..
Je comprends que ce message n'est pas ce qu'il semble être.

Bien entendu, il est possible d'aller encore plus loin, en "chiffrant" le texte que vous souhaitez dissimuler. Mais là ce n'est plus de la stéganographie, mais plutôt de la cryptographie.

Il convient de noter qu'il y aura toujours une incidence sur le poids final du fichier.
En effet, ici, vous allez ajouter un grand nombre de caractères ...
Plus le texte visible sera court, plus il y a un risque que l'on remarque que le fichier dans lequel celui-ci est stocké est anormalement gros ;)

Dissimuler un message dans les pixels d'une image.

Le chapitre précédent nous a permis de comprendre comment dissimuler du texte .... dans du texte.
Maintenant nous allons tenter de voir comment dissimuler du texte .... dans ... une image.
Mais soyons encore plus précis ... dans les "pixels" ... soyons encore ... encore ... plus précis ... dans les bits de l'image.

Une image est composé de pixel .... une sorte de grille de couleurs

Chaque pixel, correspond à une couleur.
Chaque couleur correspond à 3 ou 4 octets qui sont associés à un code RGBA (Red, Green, Blue, Alpha).
Je dis "3" ou "4", car la une 4ème information qui est "l'alpha", est selon le format du fichier, absente ou non. Celle-ci correspond au niveau de l'opacité ou la transparence du pixel.

Bref, revenons à nos pinceaux.

Nous avons donc des pixels.
Chacun des octets (R, G, B et A) contient une valeur décimale comprise entre 0 et 255.
Plus la valeur est élevée, plus la couleur est claire et intense, plus elle est faible.
Inversement, plus la valeur est basse, plus la couleur est foncée et sombre.

L'alpha (A) ne nous intéresse pas car le modifier se verrait trop facilement.
Mais nous pouvons modifier les valeurs R, G, B (Red, Green, Blue) de façon infime (pour éviter d'altérer trop le rendu de l'image).

Afin d'éviter de créer une variation trop flagrante visuellement nous devons créer de faibles variations.
Ajouter ou soustraire de 1 ou 2 ... l'une de ces 3 valeurs.
Cela permettra de conserver une couleur de pixel presque identique.

R : 1011111
G : 10011110
B : 10100000

Nous avons donc 3 combinaisons de 0 et de 1.
En lisant de gauche à droite nous obtenons le "poids" de ces valeurs.
Si je prends la couleur rouge ayant une valeur décimal de 95, son code binaire  est 1011111
Voici une formule permettant de comprendre s'opère ce calcul avec une nouvelle notion "l'ordre d'importance des bits" ...

Bit n° 1 ayant pour valeur  1   vaut  1 x 2^6 :  64
Bit n° 2 ayant pour valeur  0   vaut  0 x 2^5 :  0
Bit n° 3 ayant pour valeur  1   vaut  1 x 2^4 :  16
Bit n° 4 ayant pour valeur  1   vaut  1 x 2^3 :  8
Bit n° 5 ayant pour valeur  1   vaut  1 x 2^2 :  4
Bit n° 6 ayant pour valeur  1   vaut  1 x 2^1 :   2
Bit n° 7 ayant pour valeur  1   vaut  1 x 2^0 :  1

En additionnant le résultat obtenu du calcul opéré sur chaque bit ( 64 + 0 + 16 + 8 + 4 + 2 + 1 ) j'obtiens 95.

On se rends compte que les premiers bits e commençant par la gauche sont les plus "forts", et que les derniers sont les plus faible.
Ainsi, si l'on décidais d'altérer le dernier, ou bien l'avant dernier en le basculant de 1 à 0 ou de 0 à 1 ... nous n'occasionnerions pas pas une diminution énorme de la valeur finale ....

Ce ou ces derniers bits, sont désormais un moyen discret de dissimuler un message "caché" au format binaire ;)

Ci-dessous une image innocente : 

Je vais tenter de dissimuler un texte que j'aurais préalablement converti en binaire.

"'Dyrk est un super blog.'"

Ce qui nous donne :

En utilisant le dernier bit de l'octet correspondant au rouge (R) de chaque pixel.
Cela afin d'y inscrire l'information que je souhaite dissimuler.
Je vais donc parcourir chaque pixel de l'image.
Pixel par pixel, je vais extraire les octets R, G, B et A.
Je ne vais modifier que le R (Red).
D'abord en convertissant sa valeur décimale en binaire.
Puis en stockant progressivement les 1 et les 0 du message binaire dans le dernier bit de celui-ci.
Enfin, lorsque tout mon message est stocké ... je n'ai plus qu'à mettre des 0 à la place de ce dernier bit.

Ci-dessous l'image obtenue ...

 Bit Plane .... ou ... survole de bit

Le "bit plane" en Stéganographie, consiste à visionner une image en mettant en évidence de façon dissociée les différents bits des octets RGB de chaque pixel :


Par exemple nous pouvons décider de cibler uniquement le premier bit de l'octet bleu de chaque pixel, ou bien le 3ème bit vert, etc ...
Bref, c'est une analyse un peu "spectrale" permettant de voir si l'image ne dissimule pas en elle un motif non visible...

Reprenons donc les 2 images générées précédemment ...

En apparence ces 2 images sont innocentes.
Mais si vous analysez les pixels ...
(soit en scriptant vous même cette analyse, soit en utilisant des outils comme https://georgeom.net/StegOnline/image)

Cela mettra en évidence dans le cas présent, à l'aide de filtres, les pixels dont la valeur du 7ème bit  de l'octet rouge vaudra 1 ...

A gauche on a l'image non altérée , ne contenant rien de caché.
Puis à droite, celle contenant le texte caché, nous constatons bien un petit quelque chose de suspect, non ?

(Je précise que les images de droite et de gauche sont générés aléatoirement, les couleurs et l'emplacement des cercles n'est absolument pas altéré par le ce changement, je n'ai juste pas dissimulé le texte dans la même image).

Voici le script que j'ai utilisé pour parvenir à générer l'image avec mon texte caché.


Voici une autre version du script un peu plus "travaillée".
J'y ai ajouté la partie permettant de "récupérer" le message caché.
Le premier pixel de l'image, contient dans l'octet lié à l'alpha (opacité), la taille du message.
S'agissant du premier pixel ... cela ne se remarquera pas ... toutefois, il convient de noter que le message ne pourra dépasser dans ce contexte ci, les 255 caractères.
Une fois cette taille récupérée ou stockée, selon si l'on encode ou décode, il va balayer ou stocker, le message en code binaire dans les pixels suivants, en utilisant le dernier bit de la couleur rouge.

Image dans une image ... et Intelligence Artificielle

Plus amusant à présent on va générer une image SUR une image...
Bien évidemment il y a un intérêt côté Stégano ... mais également dans le domaine de l'IA ...
L'IA analyse l'image non pas comme nous avec des yeux ... mais de manière logique 
en analysant les pixels et en effectuant des reconnaissances de pattern / forme.

Ainsi, l'image suivante ....

lorsque l'on fait une analyse sur les bits, dissimule une autre image .... ne contenant non pas des "ronds", mais des "carrés"

C'est ... au petit bonheur la chance ...
En visionnant cette image, l'IA verra probablement soit le motif de cercle, soit celui du carré :)

Mais l'œil humain, quant à lui, ne verra que des cercles.

Watermark & Utilisation en entreprise

Côté Malveillant vous l'aurez compris, cette technique permet de stocker et / ou transmettre de la données de façon cachée.

Côté IA générative, c'est un excellent moyen pour les artistes de protéger leurs œuvres

Mais côté entreprise ?

Je vous invite, pour celles et ceux qui utilisent des plateformes de téléchargement "illégales" à vous questionner sur le rôle que peut avoir la sténographie dans ce type de contexte ....
Vous l'avez ?

Entreprise de Streaming
En effet, il est possible pour les entreprises de streaming (Netflix, Amazon Prime, ...) de glisser dans le contenu vidéo qu'elle propose des informations sur l'utilisateur ...
Ainsi si un client d'une de ces plateformes payantes avait la bonne idée de "ripper" le contenu vidéo pour ensuite le partager sur des plateformes illégales.
Alors ces mêmes plateformes illégales n'auraient qu'à consulter le contenu partagé par celui-ci ... pour savoir qui est le vilain client qui se permet de "voler" leurs contenus.

Entreprises partageant des données sensibles avec des partenaires.

Vous n'êtes pas sans savoir qu'il y a quotidiennement dans le monde, des plateformes qui se font pirater, entrainant par conséquent des fuites massives de documents.

Si vous êtes l'un des malheureux concernés par l'une de ces fuites, alors vous aurez envie de comprendre ce qu'il s'est passé, mais surtout comment des documents sur vous, se sont retrouvés publiés sur Internet.

Il peut être donc utile pour une entreprise qui partage des fichiers vous concernant (avec votre consentement), de mettre une sorte de Watermark invisible sur ses documents ...
Cela afin de pouvoir identifier rapidement l'origine d'une fuite de données :
Est-ce l'entreprise qui est à l'origine de la fuite ? Est-ce l'un de ses fournisseurs ?

Amateurs de Scripts ?

Vous le savez j'aime bien vous "scripter" des petits choses en Javascript, car c'est un langage que tout le monde peut utiliser sans aucun prérequis en ouvrant simplement depuis son navigateur une console (touche F12 ou clic droit sur la page > Inspecter l'élément), depuis l'onglet "console" de cette "console".

Bref, via cette dernière (console du navigateur), vous pouvez vous amuser avec les 2 scripts que je vous ai précédemment transmis.
Et en voici 2 autres.

Analyser une image avec la technique du Bit Plane

Ce script vous permettra, si vous l'exécuter sur une page Web, de parcourir le bit de chaque octet de chaque couleur .... et ce ... pour chaque image présente sur la page.
Ce qui vous donnera 8 x 3 possibilités pour chaque image.

Cacher une image dans une autre image

Contrairement à l'une des rubriques de cet article ou je "génère des images avec des ronds et des carrés, ici, je dissimule une image dans une autre image.

Conclusion

J'espère que vous aurez passé un bon moment sur la lecture de cet article, mais surtout que vous y aurez appris plein de choses.
Pas simple de transmettre des explications simples sur des sujets nécessitants un prérequis technique, mais j'espère tout de même vous avoir données des éléments faciliter votre compression.
Que ça soit sur l'aspect binaire, sur la révision de ce qu'est un octet, un bit ... ou bien de ce qu'est la Stéganographie.
Autant de sujets riches qui feront de cet article, je l'espère un bon article.

En attendant, je vous souhaite une excellente année 2025 !!!

PS : Je tiens à remercier tout particulièrement GeoOw un hacker éthique qui m'a mis le pied à l'étrier il y a désormais 20 ans de ça !!! Et qui m'a motivé malgré lui, par un concours de circonstance, dans l'écriture de cet article.
Merci à toi !!!!

Laisser une réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site est protégé par reCAPTCHA et Google Politique de confidentialité et Conditions d'utilisation appliquer.