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
© Copyright 2025 ExpyDoc