La Stéganographie

ISN
La
Stéganographie
Comment dissimuler une image dans une image ?
Djabiri Abalkassim
CLASSE : TS2
LYCÉE DE CHIRONGUI
Année Scolaire : 2012/2013
Dans cette matière de spécialité Informatique et Science du Numérique, ma permis d’avoir un
aperçus de ce que c’est l’informatique. Et pour notre évaluation en fin d’année, j’avais
initialement prévu de faire un projet sur les opérations en binaire. J’ai vu alors que les nombres
binaires sont utilisés dans beaucoup domaine d’information notamment celle de l’imagerie. En
cours de route, lorsque j’étais en difficulté sur la conception de mon projet, mon professeur m’a
alors parlé d’un procédé qui utilise le codage binaire : la stéganographie (que je ne connaissais
même pas l’existence), qui consiste à dissimuler une image à l’intérieur d’une autre image en se
servant des nombres binaires. Cela m’a tout de suite intéressé et je l’ai alors pris comme
nouveau projet à présenter à fin d’année et l’autre je le laissé à mon camarade qui était lui aussi
en difficulté avec son projet.
Table des matières
I.
II.
Présentation de la stéganographie
............................................................................. 2
Dissimulation d'information dans une image ......................................................... 3
1°/ Le système binaire ................................................................................................... 3
2°/ Une image numérique .............................................................................................. 4
III.
Description du procédé stéganographique .............................................................. 5
1°/ La Mise en pratique .................................................................................................. 5
2°/ L’Algorithme .............................................................................................................. 6
IV.
V.
Langage et programmation utilisé ............................................................................... 7
Quelques Exemples .............................................................................................................. 9
Conclusion ............................................................................................................................... 10
1
I.
P résentation de la stéganograph ie
La stéganographie vient du grec steganos (caché ou secret) et graphein (écriture) et qui
signifie, littéralement, « écriture cachée ». C'est l'art de cacher un message au sein d'un autre
message de caractère anodin, de sorte que l'existence même du secret en soit dissimulée. Alors
qu'avec la cryptographie habituelle, la sécurité repose sur le fait que le message ne sera sans
doute pas compris ; avec la stéganographie, la sécurité repose sur le fait que le message ne sera
pas sans doute pas détecté. On dit que la cryptographie est « l'art du secret » alors que la
stéganographie est « l'art de la dissimulation ».
Il existe plusieurs techniques différentes qui permettent ce "tour de magie" :
La dissimulation dans un texte, la plus utilisé à l’époque pour communiquer des messages
secrets, par exemple en modifiant des espaces ou les tabulations entre les mots, alternant les
majuscules et les minuscules ou d’autres méthodes comme celles-ci :
Big rumble in New Guinea.
The war on
Celebrity acts should end soon.
Over four
Big ecstatic elephants replicated.
Mettre un message caché dans un texte
Est très facile, et en voici un exemple très
Simple. On prend chaque ligne de ce texte
Sans faire attention
A la forme bizarre du message
Girafe (j‘ai pas trouvé mieux...)
En prenant chaque première lettre nous avons le message
Bring two cases of beer.
Avec l'avènement de l'ordinateur et de son règne du "tout numérique", des techniques plus
performant se sont développés pour cacher n'importe quel document (Image, son, texte) dans
un autre document.
2
II.
Dissimulation d' inf ormation dans une
image
Les documents "porteurs" sont généralement des images (BMP, GIF, PNG, ...) ou des
sons (WAV, MIDI, ...). Nous allons étudier une technique de stéganographie appliquée à
l'image, c'est-à-dire voir comment il est possible de cacher un message dans une image. Pour cela
nous allons faire un rappel de ce qu'est une structure d'image.
1°/ Le système binaire
Le système binaire est un système de numération utilisant la base 2. Un bit (de l'anglais
binary digit) est un chiffre binaire, c'est-à-dire 0 ou 1. Dans un nombre binaire, la valeur d'un bit,
appelée poids, dépend de la position du bit en partant de la droite. On appelle bit de poids faible
(en anglais Least Significant Bit, ou LSB) est pour un nombre binaire, le bit ayant une faible
valeur (celui de droite dans la représentation positionnelle habituelle). À l’opposé, on a le bit de
poids fort, (en anglais Most Significant Bit, ou MSB) est le bit ayant la plus grande valeur dans
une représentation binaire donnée, (celui de gauche dans la représentation positionnelle
habituelle).
Poids du bit augmente
Poids du bit diminue
Bit de poids fort (MSB)
Bit de poids faible (LSB)
On appelle octet (en anglais byte ≠ bit ou B avec une majuscule dans les notations),
symbolisé par un « o » est une unité d'information composée de 8 bits. Il permet par exemple
de stocker un caractère, tel qu'une lettre ou un chiffre.
3
2°/ Une image numérique
Une image numérique est une image composée d’une succession de pixels (picture
elements), c’est-à-dire en (petites) zones carrées. Chaque pixel possède une couleur (ou une
nuance de gris). Un codage courant est le codage RVB (Rouge Vert Bleu). Un pixel est constitué
de 3 octets : un octet pour la composante rouge, un octet pour la composante verte et un octet
pour la composante bleue. C'est pour cela que l'on parle de RVB. À partir de ces trois octets, on
peut donc avoir 256*256*256 = 16777216 couleurs différentes, ce qui est largement plus que ne
peut distinguer l'œil humain.
L’ensemble des pixels est organisé sous forme d’un tableau bidimensionnel dans lequel
chacun d’eux peut-être repéré par un numéro de lignes x et un numéro de colonnes y. Le couple
(x,y) forme les coordonnées du pixel dans l’image. Le nombre de lignes et de colonnes donnent
la dimension de l’image, et le produit de ces deux nombres est égal au nombre de pixels contenus
dans l’image.
L'image n'est ni plus ni moins que le stockage dans un fichier de tous les pixels RVB
composant l'image finale.
Source : Livre Psysique Chimie TermS ed. Nathan Colection SIRIUS
4
III.
Desc ription du proc édé
stéganograph ique
Si on modifie la couleur d’un pixel en ajoutant ou retranchant un petit nombre à l’une
ou l’autre des trois composantes, le changement de couleur du pixel est imperceptible pour
l’œil.
Dans ce projet, je vais utiliser une technique stéganographie qu’on nomme la méthode
LSB (Least Significant Beat), ou méthode de bit de poids faible. Cette méthode consiste à
modifier le bit de poids faible des pixels codant l'image.
1°/Mise en pratique
 Soit 01101011 : un octet d’une des composantes RVB d'un pixel d’une image A qui cache ;
 Et 10011101 : un octet d’une des composantes RVB d'un pixel d’une image B que l'on
souhaite cacher.
Le but est de remplacer les bits de poids faible de l'image qui cache par les bits de poids fort de
l'image qu'on souhaite cacher.
 Sur l’image A, on doit d’abord mettre à zéro les 4 bits de droite et ce qui consisterait à
faire dans notre programme un ET logique avec 01100000 donc un "& 240".
 Puis, avec l’image B on fait directement un décalage de 4 bits vers la droite, ce qui va
nous donner : 00001001 donc pas besoin de mettre à zéro avec un ET logique.
 Et enfin, la composante du pixel de l'image stéganographiée est obtenue par un OU
logique entre l’image A et B : 01101001
Et il faut répéter ce procédé avec tous les autres composantes RVB.
5
2°/Algorithme
Voici l’algorithme qui permet de faire cela :
Variable :
im1, im2 et im3 : non typé
r1, v1, b1, r2, v2, b2, r, v et b : byte
p1 et p2 : tableau
e1 et e2 : chaine de caractère
L, H, x et y : entier
Initialisation :
La première image → im1
Emplacement de im1→e1
Ouvrir im1 dans e1
Les dimensions de im1 → L, H
La deuxième image → im2
Emplacement de im2→e2
Ouvrir im2 dans e2
Image stéganographiée → im3
Im3 est vide et prend L, H comme dimension
Traitement :
Pour y variant de 0 à H
Pour x variant de 0 à L
Stocker le pixel (x,y) de im1 dans un tableau p1
Mise à zéro des 4 bits de droite de la composante rouge→r1
Mise à zéro des 4 bits de droite de la composante verte→v1
Mise à zéro des 4 bits de droite de la composante bleue→b1
Stocker le pixel (x,y) de im2 dans un tableau p2
Décalage de 4 bits vers la droite de la composante rouge→r2
Décalage de 4 bits vers la droite de la composante verte→v2
Décalage de 4 bits vers la droite de la composante bleue→b2
Insertion des pixels de r2 dans r1→r
Insertion des pixels de v2 dans v1→v
Insertion des pixels de b2 dans b1→b
Écriture de im3 en r, v, b
Fin Pour
Fin Pour
Sortie :
Enregistrer im3
Afficher im3
6
IV. Langage et programmation utilisé
L’enseignement de spécialité ISN de cette année nous appris quelques langages de
programmations mais tous les langages que nous avons utilisés ne sont pas tous adaptés à
mon projet. Je vais les citer et les éliminer une par une :
Je peux déjà éliminer le HTML et ces langages additionnels comme le JavaScript ou le
PHP car ils sont destinés à concevoir des sites web et toutes les applications vont avec ça.
Je peux aussi éliminer le Pascal qu’on a appris avec son EDI (Environnement de
développement Intégré) Lazarus, qui est un langage de programmation conçu pour
l'enseignement, se caractérise par une syntaxe claire, rigoureuse et facilitant la structuration des
programmes mais auquel il m’est difficile voire impossible de travailler avec les images.
Nous avons aussi étudié le Java en version Java’s Cool qui est un logiciel, écrit en
Java, conçu pour l'apprentissage des bases de la programmation. Il permet de manipuler un
Macro-Langage de programmation, basé sur le langage Java.
Avec Java’s Cool contrairement à Lazarus, on peut travailler avec des images et même que je
peux faire avec lui une partie de mon programme c’est-à-dire la mise à zéro les 4 bits de droite
et le décalage de 4 bits vers la droite mais je ne peux les faire fusionner c’est-à-dire l'image
stéganographiée par un OU logique entre la première et la deuxième image.
Voici ce que j’ai pu faire avec l’aide de mon professeur :
void bitDzero(String image){
load(image);
int width=getWidth();
int height=getHeight();
for(int i=-width;i<=width+1;i++){
for (int j=-height1;j<height;j++){
int
rgb[]=getPixelColor(i,j);
int red=rgb[0];
int green=rgb[1];
int blue=rgb[2];
int rouge=red & 240;
int vert=green & 240;
int bleu=blue & 240;
setPixel(i,j,rouge,vert,bleu);
}
}
}
void decaleD(String image){
load(image);
int width=getWidth();
int height=getHeight();
for(int i=-width;i<=width+1;i++){
for (int j=-height1;j<height;j++){
int
rgb[]=getPixelColor(i,j);
int red=rgb[0];
int green=rgb[1];
int blue=rgb[2];
int rouge=red>>4;
int vert=green>>4 ;
int bleu=blue>>4;
setPixel(i,j,rouge,vert,bleu);
}
}
}
void main(){
bitDzero(" Image bit à zéro ");
sleep(1000);
save ("Image bit à zéro");
decaleD("Image décalé");
sleep(1000);
save ("Image décalé");
}
7
Mais le langage qui est le plus conformes à mon projet et le plus abordable à mon niveau
c’est le Python. Le Python est un langage qui peut s'utiliser dans de nombreux contextes et
s'adapter à tout type d'utilisation grâce à des bibliothèques spécialisées à chaque traitement. Il
permet (sans l’imposer) une approche modulaire et orientée objet de la programmation. Il est
cependant particulièrement utilisé comme langage de script pour automatiser des tâches simples
mais fastidieuses.
La syntaxe de Python est très simple et conduit à des programmes à la fois très compacts et très
lisibles.
Voici le Script du programme en Python qui permet de dissimuler une image sur une autre en
se basant sur mon algorithme :
from PIL import Image
# la bibliothèque PIL doit avoir été installée
e1=input("Saisissez entre guiellemets l'emplacement de
l'image qui cache l'autre : ")
# le programme demande à l’utilisateur de saisir l'emplacement de l’image 1
im1 = Image.open(e1)
L,H = im1.size
e1=input("Saisissez entre guiellemets l'emplacement de
l'image que l'on souhaite cacher: ")
# ouverture de l’image 1 situé sur l’emplacement que l’utilisateur à entrée
# les dimensions de l’image 1 sont affectées aux variables L, H
# le programme demande à l’utilisateur de saisir l'emplacement de l’image 2
Im2 = Image.open(e2)
im3 = Image.new("RGB",(L,H))
for y in range(H):
for x in range(L):
p1 = im1.getpixel((x,y))
# ouverture de l’image 2 situé sur l’emplacement que l’utilisateur à entrée
# image destination (image sténographiée, « vide » pour l'instant)
# on balaie toutes les lignes y, de 0 à H
# pour chaque ligne y, on balaie toutes les colonnes x, de 0 à L
# acquisition du pixel (x,y) de l'image 1
r1 = p1[0]&240
v1 = p1[1]&240
b1 = p1[2]&240
# mise à zéro des 4 bits de droite de la composante rouge
p2 = im2.getpixel((x,y))
# acquisition du pixel (x,y) de l'image
r2 = p2[0]>>4
v2 = p2[1]>>4
b2 = p2[2]>>4
# décalage de 4 bits vers la droite de la composante rouge
r = r1|r2
# insertion du pixel de l'image 2 dans celui de l'image 1
v = v1|v2
b = b1|b2
im3.putpixel((x,y),(r,v,b))
im3.save("image_stegano.png")
im3.show()
# idem pour la composante verte
# idem pour la composante bleue
# idem pour la composante verte
# idem pour la composante bleue
# idem pour la composante verte
# idem pour la composante bleue
# écriture de l'image stéganographiée pixel par pixel
# enregistrer l'image stéganographiée
# montrer l'image stéganographiée
8
V. Quelques Exemples
Voici quelques exemples qui illustrent ce qui en résulte de ce programme :
Image 2
Image 1
Image 1 avec les 4 bits de
poids faible R, V, et B, à 0
Image 2 cachée dans l'image 1
Image 1 avec le décalage des 4
bits vers la droite faible R, V, et B
Image 2 extraite de l’image
Avec ce programme, il est très difficile deviner l’image qui est caché.
L'extraction de l’image cachée par ce procédé n'est pas très compliquée; elle est même plus
simple : il s'agit de faire un décalage de 4 bits vers la gauche sur chaque composante R, V, B :
les 4 bits de poids faible deviennent ceux de poids fort. En Python, les 4 bits de droite sont alors
mis à 0, mais attention, on passe d'un mot de 8 bits à un mot de 12 bits : le décalage allonge la
longueur du mot. Il faut donc ignorer les bits de rang 8 à 11 en complétant avec un ET logique
avec 11111111 (& 255).
Voici ce qui en résulte en Python:
from PIL import Image
im3=Image.open("Image_stegano.png")
L,H = im3.size
im4 = Image.new("RGB",(L,H))
for y in range(H):
for x in range(L):
p1 = im3.getpixel((x,y))
r1 = p1[0]<<4 & 255
v1 = p1[1]<<4 & 255
b1 = p1[2]<<4 & 255
im4.putpixel((x,y),(r1,v1,b1))
im4.save("Image_caché.png")
9
im4.show()
Conclusion:
De nos jours la stéganographie est utilisé dans des multiples applications. Comme par exemples :
 pour la protection des données confidentielles que ce soit la pour entreprise ou
simplement personnel.
 Pour transmettre des informations personnelles sur internet en étant discret.
 Ou pour des communications militaires ou d’espionnages non détecté par l’ennemi.
Par exemple dans notre cas ici, si un utilisateur A veut envoyer à un autre utilisateur B une image
de son projet top-secret tout en gardant un aspect anodin pour les personnes indiscret.
L’utilisateur A va utiliser mon programme de dissimulation d’image pour cacher son image
secret et enverra à B, l’image qui en sortira à l’issu de ce programme. Par contre l’utilisateur B a
sur lui le programme qui va afficher l’image cachée.
Aujourd’hui, les techniques de stéganographie sont très diverses. Elle ne se limite pas à
dissimuler une image sur une image, on peut aussi dissimuler un texte dans une image ou
modifier un son pour en cacher un autre ou même les compléter avec d’autres méthodes de
cryptographie.
Mais toutes ces méthodes ne sont pas fiables à 100% et ils ont aussi des gros inconvénients :
 Premièrement, c’est qu’on perd la qualité de nos fichiers de départ.
 Et il y a aussi la question de compression d’image. On a travaillé sur des images qui ne
sont pas compressées. Si l'on compresse notre image dans un format destructif comme le JPEG,
l'information dissimulée va être altérée.
10