Stéganographie visuelle
La stéganographie visuelle consiste à cacher un message visuel dans une image.
Cette image contient un message caché ! Sauras-tu le retrouver ?
Principe
L’image secrète est cachée dans les bits de poids faibles, c’est à dire les bits les moins significatifs (en anglais lsb : least significant bits) de l’image originale.
Opérations sur les octets
Pour faire de la stéganographie (codage, décodage), il faut manipuler les bits d’un octets (masquage, déplacement, …).
Pour réaliser les fonctions ci-dessous, il faudra utiliser les opérateurs « bit à bit » de Python :
msb2lsb(o, n)
qui renvoie un octet (type int
) ne contenant plus que les n
bits les plus significatifs de l’octet o
(et les rend par conséquent moins significatifs).Exemple : bin(msb2lsb(0b10111011, 3))
→ "0b101"
lsb(o, n)
qui renvoie un octet ne contenant plus que les n
bits les moins significatifs de l’octet o
.Exemple : bin(lsb(0b10111011, 3))
→ "0b11"
lsb2msb(o, n)
qui renvoie un octet ne contenant plus que les n
bits les moins significatifs de l’octet o
, mais déplacés à la place la plus significative.Exemple : bin(lsb2msb(0b10111011, 3))
→ "0b11"
lsb2zero(o, n)
qui renvoie un octet ne contenant plus que les n
bits les moins significatifs de l’octet o
.Exemple : bin(lsb2zero(0b10111011, 3))
→ "0b10111000"
Encodage et décodage sur des images
Pour cacher une image dans une autre, ou au contraire retrouver une image cachée, on doit opérer des manipulations sur les octets représentant les pixels : une seul octet pour les images en niveaux de gris, 3 pour celle en couleur, …
Pour réaliser les fonctions ci dessous, on utilisera celles définies plus haut.
decode_image(image, n)
retourne l’image cachée dans image
(une image de type PIL.Image
), n
étant le nombre de bits de poids faibles utilisés.
fusion(pixel1, pixel2)
qui traite puis fusionne (opération binaire à déterminer) les pixels pixel1
, pixel2
(des tuples s’il s’agit d’images en couleur !).