Cacher un texte dans une image

Chapitre: XVI. Images numériques Prérequis: Système RVB, bases

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é.

Description informatique d'une image couleur

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.

Représentation binaire du texte

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).

Intégration du texte dans l'image

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.

Récupération du texte

La récupération se fait en cinq étapes:

  1. Récupérer la matrice décrivant l'image.
  2. Remplacer un nombre pair par 0, un nombre impair par 1.
  3. Grouper les bits par groupes de 8.
  4. Convertir chaque octet en nombre décimal.
  5. Écrire les caractères correspondant aux codes ASCII obtenus.

Exemple
Nous allons cacher une fable de la Fontaine dans l'image d'un perroquet:

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.»
Image originale Image modifiée Pixels modifiés


Références


Didier Müller, 4.10.02