Accueil > > > CACHER UN FICHIER DANS UNE IMAGE BMP (8, 16, 24 ET 32 BITS). STÉGANOGRAPHIE. [BORLAND 5, BCB]
CACHER UN FICHIER DANS UNE IMAGE BMP (8, 16, 24 ET 32 BITS). STÉGANOGRAPHIE. [BORLAND 5, BCB]
Information sur la source
Description
Vous souhaitez cacher un fichier quelconque sans que personne ne puisse soupçonner son existence. Ce programme montre comment cacher n'importe quoi dans un document au format BMP (Bit Map). Plusieurs programmes similaires existes déjà sur ce cite, cependant aucun ne fait tous ceci : - Integration dans une image BMP 8, 16, 24 ou 32 bits. - Convertion dans les formats connus. - Interface graphique. - Calcule de l'alteration de l'image. - Espacement régulier des informations dans les pixels en fonctions de l’espace libre dans l'image. - Detection d'images stéganographié - Aperçu de l'image final. - Zoom sur l'images Un pixel est défini selon trois composantes : l'intensité de bleu, vert et rouge (les trois couleurs primaires en optique). Parfoit, le pixel est composé d'une quatrième composante : la transparence. On code ces informations chromatiques dans un certain nombre de bit. Ainsi, une image est qualifiée de N bits (où N est le nombre de bit) en fonction du nombre de bit qui lui sont allouée pour coder les couleurs. Les images Bitmap peuvent coder les couleurs sur : - 1 bit (Noir et Blanc) - 4 bits (16 couleurs prédéfinies. C'est une forme de compression.) - 8 bits (256 couleurs prédéfinies. Idem.) - 16 bits (65536 couleurs) - 24 bits (16777216 couleurs) - 32 bits (4294967296 couleurs) Pour plus d'information sur le principe de la stéganographie dans les images allez voir le TPE de TheWhiteShadow contenu le zip à l'adresse suivante : http://www.cppfrance.com/code.aspx?ID=22340 Pou r plus d'information sur le codage d'un bitmap win32 reportez vous au fichier "Format d'un bitmap win32.txt" dans mon zip. Voici comment integrer un fichier dans un bitmap. Attention, le code qui suit permet seulement de simplifié la lecture du code et ainsi de mieux visualisé la partie la plus importante. Il est impossible de bien intégrer ou extraire un fichier avec le code qui suit. Pour le code correcte, le chargement de l'image et du texte, les calculs d'altérations de l'image, l'interface graphique et l'aperçu consulter le zip.
Source
- char *ImgO, *ImgM; // Image originale et modifier
- char *DataAdd; // Fichier quelquonque inseré dans l'image
- char *cSave; // Chaine qui sera sauvegardée
- unsigned long lenImg, lenData; // Nonmbre d'octet dans l'image et dans le fichier
- unsigned long ImgHaut, ImgLarg; // Hauteur et largeur de l'image
- unsigned long ImgNbOctet; // Taille du fichier
- unsigned long ImgDebPixel; // Position du premier pixel
- unsigned long lenSave; // Nombre d'octet à sauvegarder
- int ImgResol; // Resolution de l'image
- char nbit; // Nombre de bit à integrer dans un octet
-
-
- void __fastcall TTexteChild::Integrer(void)
- {
- unsigned long length, ind;
- unsigned char DA, O1, O2, CT, ChT[3], X, ibit, p, i;
-
- p = (unsigned char) Puissance(2,nbit);
-
- ImgM = new char [lenImg];
- lenSave = lenImg;
-
- for (length=0;length<ImgDebPixel;length++) {
- ImgM[length] = ImgO[length];
- }
-
- ind = 0;
- ibit = 0;
-
- if ((ImgResol == 8) || (ImgResol == 24) || (ImgResol == 32)) { // format 8, 24 ou 32 bit
-
- for (;length<lenImg;length++) {
- DA = ImgO[length];
-
- if (ind <= lenData){
- CT = GetMessag(ind,ibit);
-
- DA = (DA & ~p) | CT;
- }
-
- ImgM[length] = DA;
- }
- } else if (ImgResol == 16) { // format 16 bit
-
- for (length=ImgDebPixel;length<lenImg;length+=2) {
- O1 = ImgO[length+1];
- O2 = ImgO[length];
-
- X = 0x80 & O1;
- ChT[0] = (O1 & 0x7F) >> 2;
- ChT[1] = ((O1 & 0x03) << 3) | (O2 >> 5);
- ChT[2] = O2 & 0x1F;
-
- for(i=0;i<3;i++) {
- if (ind <= lenData){
- CT = GetMessag(ind,ibit);
-
- ChT[i] = (ChT[i] & ~p) | CT;
- }
- }
- ImgM[length+1] = X | (ChT[0] << 2) | (ChT[1] >> 3);
- ImgM[length] = (ChT[1] << 5) | ChT[2];
- }
- }
-
- cSave = ImgM;
-
-
- /*
- if (ind < lenData)
- Etat1->Caption = "Intégrer partiellement";
- else
- Etat1->Caption = "Intégrer";
- */
-
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TTexteChild::Extraire(void)
- {
- unsigned long length, ind;
- int val;
- unsigned char DA, O1, O2, CT, ChT[3], ibit, i, *pt;
- bool etape;
- AnsiString tmp = " ";
-
- etape = true;
-
- DataAdd = new char [2];
- lenData = 0;
-
- Calcul:
-
- ind = 0;
- DataAdd[ind] = 0;
- ibit = 0;
-
- if ((ImgResol == 8) || (ImgResol == 24) || (ImgResol == 32)) { // format 8, 24 ou 32 bit
-
- for (length=ImgDebPixel;length<lenImg;length++) {
- if (ind <= lenData){
- SetMessag(ind,ibit,ImgO[length]);
- }
- }
- } else if (ImgResol == 16) { // format 16 bit
-
- for (length=ImgDebPixel;length<lenImg;length+=2) {
- O1 = ImgO[length+1];
- O2 = ImgO[length];
-
- ChT[0] = (O1 & 0x7F) >> 2;
- ChT[1] = ((O1 & 0x03) << 3) | (O2 >> 5);
- ChT[2] = O2 & 0x1F;
-
- for(i=0;i<3;i++) {
- if (ind <= lenData){
- SetMessag(ind,ibit,ChT[i]);
- }
- }
- }
- }
-
- if ((ind == 1) && (lenData == 0)) { // premier passage : longueur du nom du fichier
- val = ((unsigned char)DataAdd[0]);
- lenData = val +6;
- free(DataAdd);
- DataAdd = new char [lenData + 1];
- goto Calcul;
- }
- if ((ind == lenData+1) && (etape == true)) { // deuxième passage : taille du fichier
- if (DataAdd[lenData - 5] == '\0') {
- pt = DataAdd + lenData - 4;
- lenSave = CharToDWord(pt,4);
- lenData = lenData + lenSave;
- free(DataAdd);
- DataAdd = new char [lenData + 1];
- etape = false;
- goto Calcul;
- } else {
- //Etat3->Caption = "Pas de fichier";
- lenSave = 0;
- return;
- }
- }
-
- if ((ind != lenData+1) && (etape == true)) {
- lenSave = 0;
- //Etat3->Caption = "Pas de fichier";
- return;
- }
-
- cSave = DataAdd;
-
- // Etat3->Caption = "Extration terminé";
- }
- //---------------------------------------------------------------------------
-
- int __fastcall TTexteChild::Puissance(int valeur, int puissance)
- {
- int v, v2, i;
-
- v = v2 = 1;
- for (i=1;i<puissance;i++) {
- v = v * valeur;
- v2 = v + v2;
- }
-
- return v2;
- }
- //---------------------------------------------------------------------------
-
- UCHAR __fastcall TTexteChild::GetMessag(DWORD &ind, unsigned char &ibit)
- {
- UCHAR t1, t2, p, ib;
- DWORD in;
-
- in = ind;
- ib = ibit;
-
- p = (UCHAR) Puissance(2,nbit);
-
- t1 = DataAdd[in];
- t1 = (t1 >> ib) & p;
-
- if (ib + nbit > 8) {
- ib = ib + nbit - 8;
- in++;
-
- p = (UCHAR) Puissance(2,ib);
- t2 = DataAdd[in];
- t2 = t2 & p;
- t1 = (t2 << (nbit - ib)) | t1;
- } else {
- ib += nbit;
- if (ib >= 8) {
- in++;
- ib = 0;
- }
- }
- ind = in;
- ibit = ib;
- return t1;
- }
- //---------------------------------------------------------------------------
-
- void __fastcall TTexteChild::SetMessag(DWORD &ind, unsigned char &ibit, unsigned char bit)
- {
- UCHAR t1, t2, DA, p, ib;
- DWORD in;
-
- in = ind;
- ib = ibit;
-
- p = (UCHAR) Puissance(2,nbit);
-
- DA = bit;
- DA = DA & p;
- t1 = DataAdd[in];
- t1 = t1 | ((p << ib) & (DA << ib));
- DataAdd[in] = t1;
-
- if (ib + nbit > 8) {
- ib = ib + nbit - 8;
- in++;
-
- DataAdd[in] = DA >> (nbit - ib);
- } else {
- ib += nbit;
- if (ib >= 8) {
- in++;
- ib = 0;
- DataAdd[in] = 0;
- }
- }
-
- ind = in;
- ibit = ib;
- return ;
- }
- //---------------------------------------------------------------------------
char *ImgO, *ImgM; // Image originale et modifier
char *DataAdd; // Fichier quelquonque inseré dans l'image
char *cSave; // Chaine qui sera sauvegardée
unsigned long lenImg, lenData; // Nonmbre d'octet dans l'image et dans le fichier
unsigned long ImgHaut, ImgLarg; // Hauteur et largeur de l'image
unsigned long ImgNbOctet; // Taille du fichier
unsigned long ImgDebPixel; // Position du premier pixel
unsigned long lenSave; // Nombre d'octet à sauvegarder
int ImgResol; // Resolution de l'image
char nbit; // Nombre de bit à integrer dans un octet
void __fastcall TTexteChild::Integrer(void)
{
unsigned long length, ind;
unsigned char DA, O1, O2, CT, ChT[3], X, ibit, p, i;
p = (unsigned char) Puissance(2,nbit);
ImgM = new char [lenImg];
lenSave = lenImg;
for (length=0;length<ImgDebPixel;length++) {
ImgM[length] = ImgO[length];
}
ind = 0;
ibit = 0;
if ((ImgResol == 8) || (ImgResol == 24) || (ImgResol == 32)) { // format 8, 24 ou 32 bit
for (;length<lenImg;length++) {
DA = ImgO[length];
if (ind <= lenData){
CT = GetMessag(ind,ibit);
DA = (DA & ~p) | CT;
}
ImgM[length] = DA;
}
} else if (ImgResol == 16) { // format 16 bit
for (length=ImgDebPixel;length<lenImg;length+=2) {
O1 = ImgO[length+1];
O2 = ImgO[length];
X = 0x80 & O1;
ChT[0] = (O1 & 0x7F) >> 2;
ChT[1] = ((O1 & 0x03) << 3) | (O2 >> 5);
ChT[2] = O2 & 0x1F;
for(i=0;i<3;i++) {
if (ind <= lenData){
CT = GetMessag(ind,ibit);
ChT[i] = (ChT[i] & ~p) | CT;
}
}
ImgM[length+1] = X | (ChT[0] << 2) | (ChT[1] >> 3);
ImgM[length] = (ChT[1] << 5) | ChT[2];
}
}
cSave = ImgM;
/*
if (ind < lenData)
Etat1->Caption = "Intégrer partiellement";
else
Etat1->Caption = "Intégrer";
*/
}
//---------------------------------------------------------------------------
void __fastcall TTexteChild::Extraire(void)
{
unsigned long length, ind;
int val;
unsigned char DA, O1, O2, CT, ChT[3], ibit, i, *pt;
bool etape;
AnsiString tmp = " ";
etape = true;
DataAdd = new char [2];
lenData = 0;
Calcul:
ind = 0;
DataAdd[ind] = 0;
ibit = 0;
if ((ImgResol == 8) || (ImgResol == 24) || (ImgResol == 32)) { // format 8, 24 ou 32 bit
for (length=ImgDebPixel;length<lenImg;length++) {
if (ind <= lenData){
SetMessag(ind,ibit,ImgO[length]);
}
}
} else if (ImgResol == 16) { // format 16 bit
for (length=ImgDebPixel;length<lenImg;length+=2) {
O1 = ImgO[length+1];
O2 = ImgO[length];
ChT[0] = (O1 & 0x7F) >> 2;
ChT[1] = ((O1 & 0x03) << 3) | (O2 >> 5);
ChT[2] = O2 & 0x1F;
for(i=0;i<3;i++) {
if (ind <= lenData){
SetMessag(ind,ibit,ChT[i]);
}
}
}
}
if ((ind == 1) && (lenData == 0)) { // premier passage : longueur du nom du fichier
val = ((unsigned char)DataAdd[0]);
lenData = val +6;
free(DataAdd);
DataAdd = new char [lenData + 1];
goto Calcul;
}
if ((ind == lenData+1) && (etape == true)) { // deuxième passage : taille du fichier
if (DataAdd[lenData - 5] == '\0') {
pt = DataAdd + lenData - 4;
lenSave = CharToDWord(pt,4);
lenData = lenData + lenSave;
free(DataAdd);
DataAdd = new char [lenData + 1];
etape = false;
goto Calcul;
} else {
//Etat3->Caption = "Pas de fichier";
lenSave = 0;
return;
}
}
if ((ind != lenData+1) && (etape == true)) {
lenSave = 0;
//Etat3->Caption = "Pas de fichier";
return;
}
cSave = DataAdd;
// Etat3->Caption = "Extration terminé";
}
//---------------------------------------------------------------------------
int __fastcall TTexteChild::Puissance(int valeur, int puissance)
{
int v, v2, i;
v = v2 = 1;
for (i=1;i<puissance;i++) {
v = v * valeur;
v2 = v + v2;
}
return v2;
}
//---------------------------------------------------------------------------
UCHAR __fastcall TTexteChild::GetMessag(DWORD &ind, unsigned char &ibit)
{
UCHAR t1, t2, p, ib;
DWORD in;
in = ind;
ib = ibit;
p = (UCHAR) Puissance(2,nbit);
t1 = DataAdd[in];
t1 = (t1 >> ib) & p;
if (ib + nbit > 8) {
ib = ib + nbit - 8;
in++;
p = (UCHAR) Puissance(2,ib);
t2 = DataAdd[in];
t2 = t2 & p;
t1 = (t2 << (nbit - ib)) | t1;
} else {
ib += nbit;
if (ib >= 8) {
in++;
ib = 0;
}
}
ind = in;
ibit = ib;
return t1;
}
//---------------------------------------------------------------------------
void __fastcall TTexteChild::SetMessag(DWORD &ind, unsigned char &ibit, unsigned char bit)
{
UCHAR t1, t2, DA, p, ib;
DWORD in;
in = ind;
ib = ibit;
p = (UCHAR) Puissance(2,nbit);
DA = bit;
DA = DA & p;
t1 = DataAdd[in];
t1 = t1 | ((p << ib) & (DA << ib));
DataAdd[in] = t1;
if (ib + nbit > 8) {
ib = ib + nbit - 8;
in++;
DataAdd[in] = DA >> (nbit - ib);
} else {
ib += nbit;
if (ib >= 8) {
in++;
ib = 0;
DataAdd[in] = 0;
}
}
ind = in;
ibit = ib;
return ;
}
//---------------------------------------------------------------------------
Conclusion
Voilà quelques mise à jours qui devraient plairent. En prévision : l'image stéganographier résiste à une détection mathématique.
Historique
- 25 octobre 2004 17:42:58 :
- //---------- 25/10/2004 ----------//
- Convertion dans les formats connus.
- Espacement régulier des informations dans les pixels en fonctions de l’espace libre dans l'image.
- Zoom sur l'images
- 29 octobre 2004 20:18:54 :
- - Convertion dans les formats connus.
- Espacement régulier des informations dans les pixels en fonctions de l’espace libre dans l'image.
- Detection d'images stéganographié
- Zoom sur l'images
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|