STEGANOGRAPHIE: BMPSTEGANO, CACHER DES DONNÉES DANS UN BITMAP 24 BITS [DEV-C++ 4
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 2004
-
23 mars 2004 à 14:48
street_pc
Messages postés9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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.
street_pc
Messages postés9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és2Date d'inscriptionvendredi 3 juin 2005StatutMembreDernière intervention10 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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és241Date d'inscriptionmardi 29 octobre 2002StatutMembreDernière intervention23 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és3006Date d'inscriptiondimanche 14 avril 2002StatutMembreDernière intervention31 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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és241Date d'inscriptionmardi 29 octobre 2002StatutMembreDernière intervention23 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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és241Date d'inscriptionmardi 29 octobre 2002StatutMembreDernière intervention23 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).
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és9Date d'inscriptionmardi 23 mars 2004StatutMembreDernière intervention18 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és2865Date d'inscriptionsamedi 2 novembre 2002StatutMembreDernière intervention11 mai 20099 23 mars 2004 à 17:53
ton programme est pas mal, mais pourquoi faire des commentaires en anglais?
cs_djl
Messages postés3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 23 mars 2004 à 14:48
pas mal, ca marche bien :), dommage que ca melange c et c++...
9 juin 2005 à 19:58
mais maintenant e comprends pourquoi je ne comprends pas :D
9 juin 2005 à 19:41
9 juin 2005 à 19:13
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
9 juin 2005 à 14:21
9 juin 2005 à 12:12
`BYTE' does not name a type
In function `bool bPrintHeaderInfo(s_BMPHeader*)':
`clrscr' undeclared (first use this function)
etc ....
merci de m'aider
24 mars 2004 à 23:26
24 mars 2004 à 21:10
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?
24 mars 2004 à 21:07
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.
24 mars 2004 à 20:47
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 ;-)
24 mars 2004 à 18:51
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
24 mars 2004 à 18:13
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
24 mars 2004 à 18:13
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.
24 mars 2004 à 18:01
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... ;-)
24 mars 2004 à 17:55
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.
24 mars 2004 à 17:32
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.
23 mars 2004 à 18:49
LordBob > initialement, j'avais prévu cette source entre autres pour un ami avec qui je parle anglais...
23 mars 2004 à 17:53
23 mars 2004 à 14:48
this->... c'est pour plus de clarté ca?