Je vous parlais il y a quelque temps de stéganographie et vous laissais entendre que l'avènement de l'informatique avait permis des exploits dans ce domaine. Aujourd'hui, je vais vous présenter un procédé que je trouve subtil et élégant : la stéganographie numérique. Celle-ci permet de cacher des données au sein d'une image par exemple, de façon totalement transparente.

Prenons une image de \(3 \times 3\) pixels. Dans votre ordinateur, cette image ressemble à cela.

0101 0101 0111 1011 0101 0110 1010 1011 1011
1011 0101 0110 1011 0101 0110 1101 1010 0001
1001 1001 1001 0101 1111 0101 1001 1000 1101

Chaque case du tableau représente un pixel. Chaque pixel est composé d'une suite de bits (les 0 et les 1) qui définissent sa couleur. Prenez une grosse loupe et regardez votre écran. Vous verrez que chaque pixel est composé de trois couleurs ; ce qui explique pourquoi on trouve trois quadruplets de bits (en réalité, c'est huit bits (un octet) mais pour y voir plus clair, je n'en ai mis que quatre).

Pixel d'un écran

Chaque quadruplet de bits correspond à l'intensité d'une des trois couleurs et c'est en modifiant l'intensité relative de ces trois composantes que l'on forme les seize millions et quelques couleurs disponibles sur notre ordinateur. Un pixel ressemble donc à ceci :

0101 0111 1000

Le dernier bit de chaque groupe de 8 est appelé bit de poids faible car il a la moindre valeur et ne change pas grand chose au nombre représenté. À l'instar du chiffre 5 des unités dans le nombre décimal 165 qui a peu d'influence sur sa grandeur. Ainsi on peut changer le dernier bit de chaque octet sans changer notablement la couleur et obtenir l'image ci-dessous.

0101 0100 0110 1011 0101 0111 1010 1011 1011
1010 0100 0111 1011 0101 0110 1101 1011 0001
1001 1000 1001 0101 1111 0100 1001 1001 1101

Pour notre œil, cette image est strictement identique à la précédente.

Lorsqu'on sait que chacun des bits de poids faible a été changé, il suffit de les récupérer et de reconstituer le message binaire qui est, dans l'exemple 100111011001110111101110111 et qui peut être traduit en texte. Ce texte est clair. Sa transformation est évidente et sa représentation binaire ne peut pas être considérée comme une forme de chiffrement. En revanche, le texte est caché. Très bien caché même car si l'image est interceptée, il est totalement impossible de deviner qu'elle contient un message.

Ce genre de prouesse peut être réalisée avec des morceaux de musique. Chaque son est codé sur un certain nombre de bits. Changer le bit de poids faible ne change rien pour votre oreille. Et pourtant, en reprenant chaque son codé en binaire, on peut récupérer un message.

En fait, on peut cacher du binaire dans du binaire. Ainsi on peu stéganographier une image dans un son, un son dans une image, un texte dans une image, une image dans une image ou n'importe quoi(1).

Comme je vous l'avais dit, c'est une technique vraiment plus subtile que les anciennes techniques archaïques présentées dans le précédent article. Pour preuve, voici deux images. L'une est l'image d'origine, l'autre contient un texte caché. L'auriez-vous deviné ?

Image de base Image stéganographiée

  1. (1) En fait non. C'est un petit peu plus complexe que cela et il y a quand même pas mal de limites, notamment avec les données compressées ce qui est le cas des images et des sons…