TP2 : tatouage d'images
Introduction
La stéganographie est une opération qui permet de cacher un message dans une image. Ce message est invisible aux observateurs, sauf à ceux qui connaissent l’existence de ce message et qui savent retrouver cette information. Ce message peut être du texte, une autre image, un programme exécutable, un fichier mp3, etc. Par exemple: la photo 1 (Lena.pgm) est l’image d’origine, la photo 2 (tatoumina1.jpg) est le message à cacher et la photo 3 (Tatou.pgm) est l’image dans laquelle est caché le message. Visuellement, il n’y a pas de différences entre les photos 1 et 3 et le message est invisible.
Images
Une image est une
fonction I(x,y) à support fini (ses dimensions) et dont les valeurs sont ici
des scalaires sur 8 bits : le noir correspond à une valeur nulle, le blanc à
255. En informatique, c’est simplement un tableau d’octets à 2 dimensions.
Stéganographie LSB
Nous utilisons 2
bits / pixel pour cacher les informations. Voici les 16 premiers pixels (en
hexadécimal) de l’image d’origine Lena.pgm, puis de l’image Tatoue.pgm
contenant un fichier caché. Ces 16 pixels contiennent la taille du message
caché :
De
même, les 16 octets suivants contiennent les 4 premiers caractères du nom du
fichier caché :
Q1 : Retrouver (en utilisant hexedit)
à partir du fichier Tatou.pgm, le taille et le nom du fichier caché dans
l’image d’origine Lena.pgm.
Q2 : Retrouvez où commene le flux
binaire correspondant a l’image mina1.jpg dans le fichier Tatou.pgm
Manipulation de bits en C
Les opérateurs bit à bit & (et), | (ou),
^ (ou exclusif), ˜(inversion), >> (rotation à droite), <<(rotation
à gauche) réalisent des opérations bit à bit et permettent d’isoler des bits ou
groupes de bits. Si i est un octet, prenons par exemple i=100 (i.e. 0x64 en
hexadécimal et 0110 0100 en binaire), alors :
• i & 0x2 (00000010) permet d’isoler le
bit 2 de i : i&0x2 donne 0
• i & 0xF0 (11110000) permet d’isoler les
4 bits de poids forts de i. i & 0xF0 donne 01100000 en binaire ou 0x60 en
hexadécimal ou 96 en décimal.
• i >> 3 décale tous les bits de i de 3
crans vers la droite, soit 00001100 ou 12 en décimal et 0xC en hexadécimal.
• i << 2 décale tous les bits de i de 2
crans vers la gauche, soit 10010000 ou 144 en décimal et 0x90 en hexadécimal.
Q3 : DECODAGE : Ecrire un
programme (en C ou en Java) permettant d’extraire toutes les informations
cachées dans un image (exe : Tatou.pgm) et de les sauver dans un nouveau
fichier de sortie. Vérifier que ce fichier de sortie correspond bien à
mina1.jpg.
Code utile
Lecture
et écriture d’images PGM en C
Lecture
et écriture d’images PGM en Java
Q4 : ENCODAGE : Ecrire et
tester un programme (en C ou en Java)
permettant de cacher un fichier dans une image.