STÉGANOGRAPHIE OU COMMENT CACHÉ DU TEXTE DANS UNE IMAGE

cs_bloom1 Messages postés 328 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 8 mars 2007 - 11 juil. 2005 à 03:30
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 11 mai 2006 à 09:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32615-steganographie-ou-comment-cache-du-texte-dans-une-image

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
11 mai 2006 à 09:38
Je me suis permis de convertir ton code en C# :
http://www.csharpfr.com/codes/CACHER-TEXTE-DANS-IMAGE_37542.aspx
cs_CloudStrife Messages postés 12 Date d'inscription dimanche 10 mars 2002 Statut Membre Dernière intervention 14 janvier 2006
14 janv. 2006 à 19:12
hum :) très intéressent :P

Par contre, une petite amélioration pourrait être faite :)
Une adaptation a la taille du texte et de l'image :)
Au plus le texte est court au moins il consomme d'octet... hors pourquoi prendre 8bits par pixel sur une image de 1024x768, si le texte fait que 5000 caractères ? :) dans ce cas 1bit suffit plus que largement (puisqu'il permet de codé 96ko dans le fichier).
Et pourquoi pas y planquer complètement un fichier et non que un texte ? :)
paustmart Messages postés 19 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 26 novembre 2013
24 août 2005 à 14:06
Extrèmement interessant ce cours sur les images. Merci.
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
18 juil. 2005 à 13:46
@assemple
merci pour les corrections d'orthographe. Même si je connais les règles, j'ai tendance à me laisser aller sur les forums, sans pour autant donner dans un style sms.

@aymenk
Merci, j'avais pas tout à fait vu le tout comme ça. Bien que maintenant, grâce à ton explication, c'était « presque » limpide.
Je ne savais pas la subtilité sur la relation entre bits de poids faibles et couleur.

assemple a d'ailleurs très bien illustré ton explication.


Je vous remercie donc pour votre aide et m?avoir permis de mieux comprendre les subtilités de ce code, et de voir le soutien qu'offrent les membres du site.
assemple Messages postés 65 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 16 décembre 2011
18 juil. 2005 à 12:12
REPONSE à MILLENOD
Tu confonds Bit et Octet
Aymenk bloque le "cryptage" si l'image n'est pas en 24 bits donc :
Pour chaque point :
R G B
xxxxxxxxxxxxxxxxxxxxxxxxxx
x= 0 ou 1
R, G et B variant de 0 à 255,
Un caractère = 1 octet soit xxxxxxxx (x= 0 ou 1)

Le cryptage consiste à altérer R et B de 7/255 soit 2,7%, et B de 4/255 soit 1,5%, et dans la place libérée, stocker les 8 bits de chaque caractère du texte à crypter.
R G B
xxxxx123xxxxx456xxxxxx78
x= 0 ou 1, issus de l'image
1,2,3,4,5,6,7 = 0 ou 1, issus du caractère.
123, comme 456 varie de 0 à 7, tandis que 78 varie de 0 à 4

C'est à peu près ça (ou 8/256 et 5/256 ???)

Le programme de cryptage est pas mal, simple, modifiable...
Mais il eut été mieux que le dpr soit mieux conçu, par exemple en affichant les deux images, sans et avec texte
aymenk Messages postés 77 Date d'inscription samedi 25 janvier 2003 Statut Membre Dernière intervention 29 octobre 2018
18 juil. 2005 à 11:37
Salut Millenod,
Rappelons que dans le type BMP en format 24 bit/pixel, chaque pixel est représenté par
3 octets: un pour le rouge, un pour le vert et un pour le bleu. Chaque octet comporte
8 bits permettant de coder une valeur entière de 0 à 255.
Nous allons cacher un caractère (un octet) dans un pixel.
Nous aurons donc un caractère caché dans chaque point de l'image. Nous devons
répartir les 8 bits d'un octet parmi les 24 bits représentant le pixel. Arbitrairement
nous choisissons d'utiliser:
- les 3 bits de poids faible de l'octet du rouge
- les 3 bits de poids faible de l'octet du vert
- les 2 bits de poids faible de l'octet du bleu

Il est essentiel d'utiliser comme container les bits de poids faible, car ils ont
moins d'influence sur la couleur.
assemple Messages postés 65 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 16 décembre 2011
18 juil. 2005 à 10:58
cacheR : infinitif et non caché.
Pour ne pas faire cette faute il suffit de remplacer le verbe douteux par le verbe FAIRE.
2 exemples puisés dans votre texte, le verbe "cacher" dans 2 contextes. J'y ai remplacé "caché" par "FAIRE" ou "FAIT" :
1) Stéganographie ou comment FAIRE du Texte dans une Image.
2) ...et récuperer le texte FAIT
Millenod Messages postés 34 Date d'inscription mardi 29 avril 2003 Statut Membre Dernière intervention 21 septembre 2005
16 juil. 2005 à 00:00
Intéressant ma fois.
je débute et suis pas tout à fait à l'aise dans la manipulation des bits... et je n'y connais rien sur les images bmp.
(quel handicap!!!)


col := MyImage.canvas.Pixels[x, y];
On obteint la couleur d'origine du pixel, au format RGB.
Le format est définit comme tel : PPRRGGBB, avec PP pour la valeur de la palette, le RR pour le rouge, le GG pour le vert, BB pour le bleu

R := getRvalue(col); // extraction du rouge
G := getGvalue(col); // extraction du vert
B := getBvalue(col); // extraction du bleu
on a les intensité des couleurs.

R := R and 248 or (C and 7); // masquage (évident!)
c'est la que ca devient rude.

C and 7 : masque pour obtenir uniquement les valeurs contenu dans les 3derniers bits (GBB)
R and 248 : masque pour obtenir uniquement les valeurs contenu dans les 5premiers bits (PPRRG)

R := R and 248 or (C and 7); on regroupe les valeurs obtenu par les 2 masques dans la nouvelle valeur de R


G := G and 248 or (C and 56) shr 3;
y'a du décalage de bits dans l'air. rude!

(C and 56) : masque pour obtenir uniquement les valeurs contenu dans les bits 6 à 4 (RRG)

(C and 56) shr 3 : on décale ces bits pour les traiter comme si c'était les 3 premiers (GBB)

G and 248 or (C and 56) shr 3 : on regroupe les masques en un nouveau


etc


un texte comprends les caractère dont le code hexa est compris enter $20 (=32) et $7E (=126)
ce qui donne une valeur comprise entre :
00100000 et 01111110

ce qui indique que sur notre pixel, on ne va pas toucher au bit PP

on va coder notre caractère sur les valeurs RRGGBB.

pour la nouvelle valeur de R du code ci-dessus, on ne touchera pas à BB.
....



je pense pas être trop loin de la solution...
mais j'aurais besoin de qq explications en plus.
si l'un de vous veut bien me donner les derniers détails, pour que moi aussi je puisse etre illuminé par la beauté de ce code, et surtout sa subtilité :)


merci beaucoup de m'avoir fait creuser le ciboulot :)
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
13 juil. 2005 à 20:53
Très intéressant, ce code, aymenc.

Pour les lignes :

R := R and 248 or (C and 7); // masquage (évident!)
G := G and 248 or (C and 56) shr 3;
B := B and 252 or (C and 192) shr 6;

ton commentaire quant au masquage ("évident") démontre une belle maîtrise des mathématiques.
Félicitations !
Ceux qui sont moins brillants que toi auront un bon sujet de réflexion pour les vacances ! ;)

Bonne continuation.

japee
cs_bloom1 Messages postés 328 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 8 mars 2007
13 juil. 2005 à 18:27
Comment tu fais pour crypter du texte dedans ?
DRJEROME Messages postés 436 Date d'inscription jeudi 9 janvier 2003 Statut Membre Dernière intervention 5 février 2015
11 juil. 2005 à 12:47
Ben...moi j'ai pas encore essayé... mais bravo à l'avance ;)
Utilisateur anonyme
11 juil. 2005 à 11:17
Euh si ca fonctionne tres bien

Bravo
cs_bloom1 Messages postés 328 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 8 mars 2007
11 juil. 2005 à 03:30
Euh, ca fonctionne pas !
Rejoignez-nous