On peut cacher un texte dans une image numérique et cela de manière parfaitement invisible à l'oeil nu. Cette technique s'appelle le tatouage (watermarking en anglais). Elle est utilisée notamment pour protéger des images par copyright, mais on peut évidemment aussi transmettre des messages cachés. C'est en fait de la stéganographie pure et simple. Nous proposons ici une méthode simple, mais qui fonctionne seulement avec certains formats d'images, notamment le format TIFF. En effet, beaucoup de formats compressent les données et donc modifient les bits de l'image, ce qui a pour effet de détruire le message caché.
Une image couleur peut être décrite informatiquement comme un tableau (une matrice) de triplets. Chaque triplet donne la couleur d'un pixel dans le système RVB. En Mathematica, on aura, par exemple, pour une image large de 3 pixels et haute de 2:
{{{255, 255, 255}, {153, 219, 5}, {102, 0, 0}},
{{32, 32, 54}, {0, 203, 7}, {250, 37, 2}}}
Remarque: Mathematica décrit les images de bas en haut et de gauche à droite. Ainsi, la première ligne de la matrice décrit la dernière ligne de l'image.
Chaque caractère du texte à cacher sera représenté par son code ASCII étendu, écrit en base 2. Par exemple, le code ASCII de «A» est 65, ce qui donne en binaire, sur un octet (8 bits): 01000001. Le texte complet sera donc une suite de 0 et de 1, chaque caractère utilisant 8 bits.
Remarque: Si l'on n'utilise que les 26 lettres majuscules, 5 bits suffisent (25 = 32).
Si l'on enlève les accolades, on peut imaginer l'image comme une suite de nombres compris entre 0 et 255. La technique de camouflage que nous proposons ici reprend l'idée du chiffre bilitère de Francis Bacon: on va dire qu'un nombre pair correspond à un 0 du texte et qu'un nombre impair correspond à un 1. Il faudra donc modifier certains pixels de l'image, mais ces altérations seront invisibles à l'oeil.
On va procéder ainsi: si le nombre du tableau de l'image a la parité que l'on
veut, on le laisse inchangé. Si ce n'est pas le cas, on lui ajoute 1. Cette
méthode nécessite un pré-traiement de tableau de l'image: tous les nombres 255
seront ramenés à 254 pour éviter les débordements.
Reprenons le tableau donné en exemple ci-dessus et camouflons-y la lettre A:
Matrice originale | 255 | 255 | 255 | 153 | 219 | 5 | 102 | 0 | ... |
Après pré-traitement | 254 | 254 | 254 | 153 | 219 | 5 | 102 | 0 | ... |
Texte à cacher (A) | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | ... |
Matrice modifiée | 254 | 255 | 254 | 154 | 220 | 6 | 102 | 1 | ... |
Il n'y aura plus ensuite qu'à reformer l'image en remettant les accolades et envoyer l'image contenant le message caché au destinataire. Il est conseillé d'utiliser le format TIFF (Tagged Image File Format) pour éviter que les pixels soient modifiés.
La récupération se fait en cinq étapes:
Le lion, terreur des forêts, Chargé d'ans et pleurant son antique prouesse, Fut enfin attaqué par ses propres sujets, Devenus forts par sa faiblesse. Le cheval s'approchant lui donne un coup de pied; Le loup, un coup de dent; le boeuf, un coup de corne. Le malheureux lion, languissant, triste, et morne, Peut à peine rugir, par l'âge estropié. Il attend son destin, sans faire aucunes plaintes, Quand voyant l'âne même à son antre accourir: «Ah! c'est trop, lui dit-il; je voulais bien mourir; Mais c'est mourir deux fois que souffrir tes atteintes.» |
|
Ecrivez
un programme Python qui cache un texte dans une image au format png. Utilisez
la librairie PIL. Solution.
Ecrivez
un programme Python qui retrouve un texte caché par le programme ci-dessus.
Solution.
Retrouvez le texte caché dans cette image :
![]() |
![]() ![]() |