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 ; aide : c est entre le 140e et le 160e octet

 

Manipulation de bits en C ou en Java

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.