La stéganographie est une technique permettant de cacher des informations (par exemple, des textes confidentiels) dans des fichiers, ou des images, à première vue anodines.
D'un point de vue historique, la stéganographie existe depuis l'antiquité, par exemple sous la forme de messages tatoués sur le crâne d'un esclave rasé, et envoyé comme messager après que ses cheveux aient repoussés. Mais depuis l'aire du numérique, il est plus simple et beaucoup plus rapide de transmettre des informations, qui peuvent aussi être facilement interceptées.
Le codage (par exemple, la machine Enigma, utilisée pendant la Seconde Guerre Mondiale), est une solution possible pour éviter que notre message confidentiel ne soit lu (ou du moins compris) par quelqu'un, même s'il est intercepté. Mais tout code à sa clé de décryptage, ce qui fait que le codage n'est pas un moyen sûr et durable pour transporter des informations : un code est inutilisable dès l'instant que quelqu'un d'autre que l’émetteur et le récepteur du message sait comment le décrypter.
La stéganographie, par ailleurs, est une seconde technique pour éviter que nos messages soient interceptés : Au lieu de coder notre message confidentiel, nous le faisons passer pour un message totalement anodin. Par exemple, un dessin envoyé par mail d'une petite fille à son papa, dans un pays en guerre, n'intéresserait pas le camp ennemi, qui aurait intercepté le mail, alors que ce dessin peut en fait être un plan de bataille envoyé par l'état-major.
C'est pourquoi, la stéganographie est un bon moyen de transporter des données confidentielles.
Comme vous pouvez le voir sur la page de Clément, une image BMP est codée en plusieurs parties, composées de bits. Les informations concernant l'image sont écrites dans la deuxième partie du fichier. C'est cette partie qui nous intéressera pour cacher notre message. Chaque pixel de l'image est codé sur un certain nombre de bits (suivant l'encodage du fichier BMP : 8 bits pour une image en niveaux de gris, 16 pour une image en 65536 couleurs, et 24 pour une image en 16 millions de couleurs), ayant chacun un poids.
On lit chaque octet de gauche à droite.
Si on modifie le bit n°0, on fait changer la valeur de l'octet de 127 valeurs, de même, si on change le bit n°7, on ne change la valeur de l'octet que de 1.
Dans tous les exemples que je vais faire, je vais utiliser des images BMP en 24 bits, donc chaque pixel sera codé sur 3 octets en BVR (Bleu, Vert, Rouge), c'est l'inverse du RVB, que vous connaissez déjà tous. Par exemple, un pixel ayant la valeur hexadécimale 0000ff est un pixel rouge, car traduit en binaire, il donne :
De même, un pixel blanc aurait pour valeur ffffff.
La technique est très simple : il suffit d'avoir deux images : une image de départ, qui aura l'apparence anodine, et nôtre image à cacher, qui contiendra nôtre message.
Il suffira de copier tous les bits de poids fort (bits n°0) de notre image à cacher, et de les mettre à la place des bits de poids faible de l'image de départ. On altérera ainsi très peu la valeur de chaque pixel, et donc on ne pourra pas remarquer un changement dans l'image de départ. La preuve :
Vous ne voyez rien ? Pourtant j'ai caché un message dans cette image. La couleur de fond est, en hexadécimal, 000000 (soit, du noir), et le message est écrit en 000001.
Le texte a donc une très fine teinte de gris, mais on ne la voit même pas à l’œil nu ! L'image est donc constituée intégralement de pixels ayant la valeur binaire « 00000000 00000000 00000000 », sauf aux endroits où il y a du texte, où ils ont la valeur « 00000000 00000000 00000001 ».
Juste pour vous, voici l'image avec un fond blanc (valeur hexadécimale : ffffff) C'est plus clair non ?
Remarque : Le principal défaut de la stéganographie est qu'elle altère la qualité des deux images : il n'est plus possible, après le codage, de récupérer les images d'origines dans leur meilleure qualité.
Rien de compliqué là dedans : il suffit de prendre tous les bits de poids faible de l'image que vous avez reçu, et de les mettre en tant que bits de poids fort d'une nouvelle image. On « remplira » ensuite les bits de poids plus faible avec des 0 afin de compléter nos octets, et le tour est joué !
exemple :
La grille ci dessous représente chaque pixel d'une image de 8 pixels par 8 pixels. Pour un soucis de lisibilité, je n'ai pas affiché tous les bits de chaque octet, mais seulement les 2 premiers et les deux derniers de ceux-ci.
On remarque que le dernier bit de chaque octet correspondant au bleu a pour valeur 1, soit une teinte très faible de bleu (1/128 de teinte bleue). note : j'ai accentué la teinte du bleu afin que vous puissiez distinguer facilement les pixels, mais en réalité, vous ne pourriez pas voir l'image du tout.
En déplaçant tous les bits de poids faible vers les bits de poids fort, on obtient l'image suivante :
On voit que la teinte est plus forte, car au lieu d'avoir 1/128 de bleu, on a 64/128, soit 1/2 teinte.
un dernier exemple : Par stéganographie, on peut retrouver l'image de droite, cachée dans celle de gauche !
Le principe de la stéganographie n'est pas difficile en soi, mais il est quasi impossible à détecter. Néanmoins, il n'est pas difficile, quand on sait que ce processus est utilisé, de décrypter l'image et de trouver le message caché. Une bonne solution serait d'envoyer des messages codés avec un codage classique“ dans des images en stéganographie.
Informatique et Sciences du Numérique chez Eyrolle Steganography explication du format bmp
toutes les images sont libres de droits