La stéganographie comme l'indique Wikipedia, c'est l'art de la dissimulation. Il s'agit de cacher un objet dans un autre.
Dans le cas qui nous interesse, il s'agira de cacher un texte dans une image. Pour cela, nous allons avoir besion d'une image de reference. Elle sera la clé. Il faut que l'image de réfèrence se trouve aussi bien du coté du crypteur que du décrypteur. Et une seconde image (qui contiendra le texte caché) devra être transférer du crypteur au décrytpeur. Le decrypteur n'aura plus qu'a faire la difference entre les deux images (image de reference et image avec le texte caché) pour retrouver le message.
Pour ce faire, nous allons utiliser des images de type RGB codé en 24 bits ! 8 premiers bits pour le rouge (Red), les 8 suivant pous le Vert (Green) et enfin les 8 derniers bits pour le bleu (Blue).
Il nous faut aussi un format d'image qui ne se pas destructif car cela alterera le message (comme le JPEG par exemple).
L'algorythme est relativement simple, on décompose chaque octet du texte à cacher : les trois premiers bits qu'on addition à la première composante de couleur, le quatrième et le cinquième bits avec la deuxième et les trois derniers pour la dernière composante. Il suffit pour décrypter d'avoir l'image de référence et l'image contenant les données, une simple différence entre les deux images et les données réapparaissent. On ne voit pas (qualité visuelle) de différence entre les deux images, seules les deux parties (émetteur et récepteur) savent qu'il existe une différence (et donc un message). Le principal problème est la taille de l'image de référence qui doit être plus important : au minimum plus de trois fois la taille du message à cacher par rapport au fichier re reference.On peut considérer, aussi, que si les données à transporter sont du texte, l'usage d'un dictionnaire de référence (réduire les 256 valeurs à 32) serait préjudiciable (A=1, B=2... et Z=26). Bien sur, rien n'empêche de crypter les données avant de les cacher dans l'image via un algorithme (XOR, MD5... ou le votre). Voila un exemple de "codage"
valeur RGB de l'image de reference Rf=25, Bf=180, Df=56 octet a caché = 45 soit 0x00101101 : Rc=0x001=1, Gc=0x01=1, Bc=0x101=5. la valeur de l'image codée devient Re=Rf+Rc, Ge=Gf+Gc, Be=Bf+Bc. Le problème de la valeur '0' à coder devient Rc=0x111, Gc=0x111, Bc=0x111.
Il est evidement que l'on doit ajouter un décalage dans les bits à cacher suivant un seuil, ce qui prend plus de place dans l'image. Si l'octet de reference est déjà à la valeur 0xFF (255), cela devient difficile d'ajouter la valeur des bits à cacher. On peut tout aussi bien faire une soustraction à la place de l'addition (le decodage se fera sur la valeur absolue de la difference entre l'octet de reference et l'octet caché).Le choix d'une image de réfèrence complêtement noire (RGB à 0x000000) n'est pas une bonne idée ! Idem pour une image complement blanche ou uni de façon général, il faut clairement une image de réfèrence bruitée, riche en variation.