Bonjour,
j’ai encore besoin de vos lumières z’éclairées. Je cherche à faire un programme léger et simple de stéganographie, assez ciblé: cacher une image en bmp 24 bits, dans une autre du même acabit. La plupart des source codes précédement trouvés ne proposaient de ne cacher dans des images que des fichiers texte. Ne sachant pas vraiment comment extraire les octets d’une images pour les copier dans un point texte, et encore moins accomplir l’action inverse T_T.
L’idée de base est de prendre deux image bmp 24bits, une petite (qu’on appellera pour l’occasion PT) et une grande (GD) au moins 4 fois plus grande. explication du pourquoi 4 fois: chaque octet de couleur de chaque pixel sera divisé en paire de bit, ces paires remplaçant alors les deux bits de poids faibles de chaque octet de couleur des pixels de GD. Agnahagh? Explication²:
Premier pixel de PT:
R:00011011
V:11001100
B:10011110
Premier pixel de GD:
R:1100100100
V:1001010001
B:1101001010
Second pixel de GD:
R:1101001011
V:1010011111
B:1001000000
Troisième pixel de GD:
R:1001011011
V:0010010100
B:1000010110
Quatrième pixel de GD:
R:1010011111
V:0010110111
B:1000011010
Bref, pour l’heure j’ai gratter un bout de code permettant de copier une image. Juste ça. Et là tout dérape!
Le code (ci dessous) ne copie qu’une bande de l’image, en bas O_o:
(image reconverties en jpg pour pouvoir les poster)
Image originale:
[attachment=1330:Copie_de_chat.JPG]
Image “copiée”:
[attachment=1331:Copie_de_chat2.JPG]
(On retourve le bas noir et le bas des flèches blanches, il suffit d’ouvrir la photo dans un autre fenêtre ^^)
En gros 10% de l’image…
[codebox]#include
#include
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct y
{
unsigned char R;
unsigned char V;
unsigned char B;
}pixel;
struct x
{
unsigned char u;
unsigned char v;
unsigned char w;
}header;
int image()
{
FILE *fpbin,*finbin;
unsigned char moyenne;
int x,y,i;
unsigned char j;
fpbin = fopen(“image.bmp”,“r”);
printf(“Lecture de l’image\n”);
finbin = fopen(“image2.bmp”,“a+”);
printf(“Creation de l’image2\n”);
printf(“entete installée\n”);
for(i = 0;i<18;i++)
{
header.u = fgetc(fpbin);
putc(header.u,finbin);
header.v = fgetc(fpbin);
putc(header.v,finbin);
header.w = fgetc(fpbin);
putc(header.w,finbin);
}
printf(“Entete terminée\n”);
for(x = 0;x<(450000);x++)
//Voir plus bas pour le pourquoi du 450000
{
pixel.R = fgetc(fpbin);
putc(pixel.R,finbin);
pixel.V = fgetc(fpbin);
putc(pixel.V,finbin);
pixel.B = fgetc(fpbin);
putc(pixel.B,finbin);
}
fclose(fpbin);
fclose(finbin);
printf(“Ca a marché\n”);
return 0;
}
int main(int argc, char *argv[])
{
if(argc != 3)
{
printf(“Erreur pas d’arguments\n”);
return 1 ;
}
image();
return 0;
}[/codebox]
//L’image du chat fait 1350054 octets, -54 pour le header bmp, le tout par 3 (3couleurs), ce qui nous laisse 450000 triplettes d’octets à copier).
//Pour l’heure le programme ne se fera que sur cette image, je ne suis pas sûr de savoir comment compter les octets d’une image,
//peut être avec un while(1), un tableau, et un break, à méditer…
//A noter, que le programme ne “copie l’imagee” que si l’on rentre un valeur entre 10% et 1000%, soit ici, 45000 et 4500000, tout en gardant la même image fianle. Etrange…
Voilà, là est mon problème. Je n’arrive à pas comprendre que l’imagee ne soit que partiellement copiée, et ce que par le bas.
De plus, cette proportion de recopiage (environ 10%), se retrouve quand j’essaye de copier d’autre images (en changeant la valeur de 450000 évidement ^^)
Auriez vous l’oeil du tigre, l’esprit du homard austral et sauriez vous me dire où j’ai pêché?
Merki d’avance
Capty