TP19 : Stéganographie

info@mp2i-pv

TP19 : Stéganographie

La stéganographie est l’art de cacher un objet dans un autre. On peut par exemple cacher un message dans une image.

Il s’agit dans un premier temps de découvrir le message caché dans l’image mystere.pgm, puis de fabriquer soit-même des messages cachés.

Le format d’image que nous allons utiliser est le format PGM ascii. Vous pouvez regarder la description du format sur la page wikipedia.

On supposera dans la suite que les fichiers images ne contiennent pas de ligne de commentaire.

Le TP est à faire en C. Pour qu’il n’y ait pas d’ambiguïté sur ce que je demande, voici le fichier d’en-tête correspondant à votre programme: steganographie.h.

Lire un message caché

Exercice 1 : Mettre une image en mémoire.

Écrire une fonction charger_image qui prend en argument le nom d’un fichier et renvoie un pointeur sur image qui pointe sur une zone mémoire contenant les données de l’image.

Exercice 2 : Lire une lettre cachée.

L’image fournie contient un message caché de la manière suivante :

Ainsi une image qui contiendrait dans la première ligne les niveaux de gris suivant pour ses pixels:

niveau de gris bit de poids faible
80 0
81 1
81 1
89 1
89 1
90 0
89 1
80 0

cacherait sur cette ligne le caractère 'z' qui est le caractère de code ascii 122 qui s’écrit 01111010 en binaire.

  1. Comment obtient-on le bit de poids faible d’un entier?

  2. Écrire une fonction caractere qui prend en argument un tableau d’au moins 8 entiers et renvoie le caractère caché (avec la méthode décrite précédemment).

Exercice 3 : Lire le message secret.

Écrire une fonction message qui prend en argument une image en mémoire et un nom de fichier et écrit le message caché dans l’image dans le fichier correspondant. Le message se termine quand on rencontre le caractère '\0' de code ascii 0.

Exercice 4 : Écrire une commande

Écrire un programme qui prend en argument un nom de fichier et affiche le message secret contenu dans le fichier avec la méthode décrite ci-dessus.

Cacher un message

Exercice 5 : Cacher un caractère.

Écrire une fonction inserer_caractere qui prend en argument un tableau d’entiers d’au moins 8 cases et un caractère, et insère le caractère dans le tableau en suivant les règles décrites ci-dessus.

Exercice 6 : Coder ses propres messages.

Écrire une fonction cacher qui prend en argument une image en mémoire et une chaîne de caractères, cache le message dans l’image (sans oublier le caractère '\0' final) et renvoie l’adresse de l’image si l’image était assez grande pour contenir le message ou NULL si ce n’est pas le cas.

Exercice 7 : Sauvegarder une image.

Écrire une fonction sauvegarder_image qui prend en argument un nom de fichier (qui n’existe pas forcément) et une image en mémoire et sauvegarde l’image au format PGM ascii dans ce fichier.

Exercice 8 : Écrire une commande

Écrire un programme qui prend en argument un nom de fichier et une chaîne de caractères et fabrique un fichier secret.pgm contenant l’image avec le message caché. Si l’image n’est pas assez grande pour cacher le message (avec la méthode décrite; il est clair qu’on peut faire mieux), alors le programme doit afficher un message d’erreur.