STEGANOGRAPHIE: BMPSTEGANO, CACHER DES DONNÉES DANS UN BITMAP 24 BITS [DEV-C++ 4

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 23 mars 2004 à 14:48
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004 - 9 juin 2005 à 19:58
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/21395-steganographie-bmpstegano-cacher-des-donnees-dans-un-bitmap-24-bits-dev-c-4

street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
9 juin 2005 à 19:58
désolé je n'avais pas compris que tu avais compris (ou était-ce l'inverse ?) :p
mais maintenant e comprends pourquoi je ne comprends pas :D
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 juin 2005 à 19:41
Oui bah ça va j'ai bien compris le système des palettes qd même hein ;) Mais à moins que je n'aies pas compris, il émettait un doute quant au fait que les BMP 24 bits aient ou pas une palette. Sinon, pour l'histoire du DataOffset, de fait, il faut l'utiliser, c'est pas pour rien ;)
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
9 juin 2005 à 19:13
lunarossa vérifie que tu as bien conio.h

kirua tu ne fais pas une "palette 24 bits"
dans une palette, si ma mémoire est bonne, tu définis 256 couleurs, chacune sur 32 bits (RVB + alpha). ensuite, tu utilise un seul octet par pixel, désignant le numéro de la couleur (de 0 à 255, soit 256 possibilités)
une page que j'ai lue pour ce petit prog :
http://www.commentcamarche.net/video/format-bmp.php3
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
9 juin 2005 à 14:21
une palette avec 24 bits ... ça fait bcp de couleurs à définir, alors qu'une couleur est pleinement définie par ses 3 * 8 bits! ce serait totalement absurde de faire une palette pour les 24 bits.
cs_lunarossa Messages postés 2 Date d'inscription vendredi 3 juin 2005 Statut Membre Dernière intervention 10 juin 2005
9 juin 2005 à 12:12
bonjour, j'ai plein d'erreur wuand je le compile (avec dev-c++ 4.9.9.2) du genre :

`BYTE' does not name a type
In function `bool bPrintHeaderInfo(s_BMPHeader*)':
`clrscr' undeclared (first use this function)

etc ....

merci de m'aider
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
24 mars 2004 à 23:26
Honnêtement je ne sais pas si les 24 bits impliquent une absence de palette, mais tu peux le savoir avec la valeur de iDataOffset: début des données (pixels)...
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 mars 2004 à 21:10
Tu m'as aidé en effet :-) merci pour cette réponse tout à fait claire.
Puisque je ne m'occupe que d'images 24 bits, il n'y a pas de palette du tout je suppose, donc j'attaque directement les pixels 3 octets à la fois (et en commençant par la ligne du dessous), ou bien il y a qd même qq octets à passer à l'endroit où aurait dû être la palette?
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
24 mars 2004 à 21:07
C est simple. La palette occupe 4 octets car il y en a un par composante (RGB) et le 4e est un octet alpha, c est a dire qui definit la transparence de la couleur.
Il y a une palette en BMP mais...pas toujours. En fait si tu n es pas en 24 bits, il y a une palette. Par exemple si tu es en 8 bits (mais en couleurs, parce que en 24 bits N&B il n y en a pas), ta palette comporte 256 entrees, et apres les donnees sont des indices dans cette table. Ca permet de choisir 256 couleurs parmi 16,9 millions.
C est tout ce dont je me souviens a propos des BMP, et meme si je ne suis pas le destinataire de cette requete j espere t avoir aide.
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 mars 2004 à 20:47
après avoir lu ton code j'ai décidé d'écrire une classe de lecture de BMP (ça peut tjs servir ^^)
J'ai codé sans ennui le débu (lecture de l'en-tête, je me suis basé sur un document de WotSit.org) mais je ne comprends pas ceci:

après toute une série de données (dernier élément: Important Colors), j'ai Palette (N * 4 octets) et puis Données (x octets, ça dépend de plusieurs facteurs, compression, dimensions etc)

Bon, mais ... comprends pas pq la Palette utilise 4 octets par élément! (ça devrait dépendre du nb d'octets par pixel non?). A quoi sert le 4ème octet? Et puis, comment j'attribue les indices ds la palette?

Je pensais qu'en BMP il n'y avait pas de palette, je ne comprends pas vrmnt l'intérêt pr un format comme celui-ci, qui ne doit pas limiter les couleurs. Tu peux m'éclaircir sur le contenu des BMP à partir de la palette? merci ;-)
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
24 mars 2004 à 18:51
merci de ton commentaire, je suis flatté.
pour des raisons propres (toujours d'exemple), je vais garder les macros min et max.
j'ai par contre corrigé la faute d'orthographe et lancer le programme sans paramètre ne donne plus d'erreur.
quant au nom de sortie, je le ferai sans doute lorsque j'aurais le temps
cs_Kirua Messages postés 3006 Date d'inscription dimanche 14 avril 2002 Statut Membre Dernière intervention 31 décembre 2008
24 mars 2004 à 18:13
impeccable, j'ai testé (ah, corrige le aborded de fin de code, c'est "aborted", minime mais c mieux ;-))

mon avis: vrmnt bon! j'ai caché tt le code source (main.cpp) dans une image bmp et on ne voit pas la différence, vrmnt. l'extraction c déroulée sans aucun problème (il semble qu'aucun caractère n'ait été modifié). tu devrais rajouter une option: possiblité de choisir le nom du fichier de sortie, et n'utiliser le nom d'origine que comme valeur par défaut (si rien n'est précisé).

une remarque: si on lance le programme sans option ça devrait appeler l'aide. pour l'instant ça génère une erreur.

bonne continuation!

PS: met tout ton code d'exploitation de BMP dans une classe, c'est bcp plus pratique et réutilisable. change tes macros min et max par des fonction inline ;-)

inlince double max(double a, double b)
{
return a>b ? a : b ;
}

et tu la surcharges pour les int, les float, les char, etc...
ça présente bcp d'avantages, mais j'ai pas le temps là.

ciao
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
24 mars 2004 à 18:13
Commme déjà dit, mon programme n'a pas pour réelle vocation de cacher un fichier de la façon la plus efficace possible, mais plutôt de le faire en C++. C'est à la base un programme-exemple...
Et l'altération n'est pas si importante. Celà dit, c'est peut-être pour ceci que j'ai dit que je tenterais de faire le meilleur rapport taille/codage.
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
24 mars 2004 à 18:01
Je sais bien que ton programme verifie plus de choses, mais le probleme c est que la difference de coloration peut faire un peu tache avec ton codage, paske 4 bits ca fait 16 valeurs sur 255, et si tu le repete sur 3 valeurs ca peut faire une difference assez importante.

Voila je precise quand meme que ce n etait pas mechant tout ce que j ai pu dire, mais de simples remarques. D ailleurs moi aussi j avais du mal entre C/C++ au debut... ;-)
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
24 mars 2004 à 17:55
>Trop long: oui en effet, je l'ai fait dans le souci du détail, avec vérifications, infos sur l'en-tête etc.
De plus je l'ai fait non pas pour être utile en tant que programme de stégano (il en existe des bien mieux), mais juste pour donner des exmples et faire un programme complet (vérification aux plus de niveau possible, plus d'options, sauvegarde du nom de fichier, etc.)

>"MAIS avec n'importe..." uhu ? moi aussi il accepte n'importe quel fichier non ? le mode texte manuel n'est qu'un choix.

>"Le codage etait plus discret, car seul 1 bit sur un octet etait modifie et c est le bit de poids faible." certes, mais la place disponible est alors divisée par 4... Lorsque j'aurais le temps (sans doute pas avant les vacances), je laisserai le choix: plus la taille du fichier à cacher sera faible, plus le codage sera discret.

Mon intention n'était pas de concurrencer ton programme, sans doute avantagé par sa légerté et sa portabilité, mais de fournir cette source aux visiteurs de ce site.
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
24 mars 2004 à 17:32
Je viens de regarder ton code ca me semble beaucoup trop long pour ce que ca fait.
J ai publie sur ce site un code qui fait la meme chose mais avec n importe quel fichier (a cacher) dans un fichier BMP 24bits non compressee et c etait beaucoup plus court, et portable (windows et linux).

Le code etait nettement plus court!!!

http://www.cppfrance.com/code.aspx?ID=10081

En particulier tu n as pas besoin de faire tant de manipulations avec le header!! Le codage etait plus discret, car seul 1 bit sur un octet etait modifie et c est le bit de poids faible.
street_pc Messages postés 9 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 18 octobre 2004
23 mars 2004 à 18:49
djl > oui c'est pour plus de clarté (surtout pour moi) et une habitude que je partage avec le php ;-p. je suis très désordonné pour le c/c++ car j'ai appris les deux en même temps et je ne fais pas toujours la différence. Je fais s'évanouir les rigoureux

LordBob > initialement, j'avais prévu cette source entre autres pour un ami avec qui je parle anglais...
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
23 mars 2004 à 17:53
ton programme est pas mal, mais pourquoi faire des commentaires en anglais?
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
23 mars 2004 à 14:48
pas mal, ca marche bien :), dommage que ca melange c et c++...

this->... c'est pour plus de clarté ca?
Rejoignez-nous