Cacher plutôt que brouiller

La méthode du bit de poids faible (LSB)

Comment cacher un message dans une image sans que l'œil s'en aperçoive ? La technique la plus répandue exploite la façon dont les couleurs sont codées : la méthode du bit de poids faible, ou LSB (Least Significant Bit).

Comment une image stocke ses couleurs

Une image numérique est une grille de pixels. Chaque pixel possède trois composantes de couleur : R (rouge), V (vert) et B (bleu). Chaque composante est un octet, c'est-à-dire un nombre codé sur 8 bits, de 0 à 255.

Dans un octet, tous les bits n'ont pas le même poids :

  • le bit de poids fort (à gauche) vaut 128 ;
  • le bit de poids faible (à droite) vaut seulement 1.
 bit de poids fort              bit de poids faible
        |                              |
        v                              v
      [ 1  1  0  0  1  0  1  ? ]
       128 64 32 16  8  4  2  1

L'idée clé

Modifier le bit de poids faible d'une composante ne change sa valeur que de 1 sur 255 au maximum. Par exemple, une composante rouge de valeur 200 devient 200 ou 201 : deux nuances de rouge impossibles à distinguer à l'œil nu.

On peut donc remplacer ce dernier bit par un bit du message secret, sans que l'image paraisse modifiée.

Un exemple concret

Cachons les bits 1 0 1 dans trois composantes successives :

Composante  Octet original    bit secret   Octet modifié
   R        1100101|0            1          1100101|1   (202 -> 203)
   V        0110110|1            0          0110110|0   (109 -> 108)
   B        1010011|0            1          1010011|1   (166 -> 167)

Le trait | sépare les 7 bits de poids fort (inchangés) du bit de poids faible (remplacé). Chaque valeur ne bouge que de 1.

La capacité de stockage

Chaque octet ne peut cacher qu'un seul bit. Il faut donc 8 octets pour cacher un caractère (codé sur 8 bits).

Une image couleur offre 3 octets par pixel :

capacité (bits)  = nombre de pixels x 3
capacité (octets)= nombre de pixels x 3 / 8

Une petite image de 1000 x 1000 pixels contient 1 000 000 de pixels, soit 3 000 000 de bits disponibles, donc environ 375 000 caractères cachés — l'équivalent d'un gros livre, invisible à l'œil.

Une limite importante

La méthode LSB naïve est fragile : si l'image est recompressée (par exemple en JPEG), redimensionnée ou retouchée, les bits de poids faible sont modifiés et le message est détruit. Elle fonctionne bien avec des formats sans perte (PNG, BMP).

En résumé

  • Chaque pixel a 3 composantes R, V, B, chacune codée sur un octet (8 bits).
  • Le bit de poids faible (LSB) ne vaut que 1 : le modifier est imperceptible à l'œil.
  • On y cache 1 bit du message par octet.
  • Capacité : environ 3 bits par pixel, soit un octet pour 8 composantes.
  • Fragile face à la compression : à réserver aux formats sans perte.