s il vous plait g besoin d une solution pour un projet qui consiste a inserer un message caché en binaire sur les bits les moins significatifs
je crois qu il y a un probleme de memoire pour le tableau
aidez moi a trouver une solution merci
#include <iostream>
#include <fstream>
#include <string>//utiliser .size()
#include <cmath>//utiliser pow(,)
using namespace std;
//declaration de la structure pour lire l entete de photo
struct type_entete_photo
{
unsigned short Type_Fichier;
unsigned long TailleFichier;
unsigned short Reserve1;
unsigned short Reserve2;
unsigned long DecalageBitsImage;
unsigned long TailleEnteteInfo;
unsigned long DimX;
unsigned long DimY;
unsigned short NombredePlans;
unsigned short NombreBitsParPixels;
unsigned long A_Compresser;
unsigned long DimensionImage_Decompressee;
unsigned long ResX;
unsigned long ResY;
unsigned long NombreCouleurs;
unsigned long NombreCouleurs_Importantes;
};
//prototypes de fonctions
bool Lire_photo ( string &Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo &entete_photo);
void Afficher_Entetes ( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo);
bool Insertion_Message( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo);
void Decodage_Message( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo);
bool Sauvgarde_Image( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo);
bool Lire_photo ( string &Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo &entete_photo)
{
ifstream fic_binlu;//declaration du fichier en lecture
int i,j,Divise_Nboctets;//compteurs
cout<<"entrer le nom du fichier BMP : ";
cin>>Nom_Fichier_BMP;
fic_binlu.open(Nom_Fichier_BMP.c_str(),ios::binary|ios::in|ios::out);//ouverture fichier ecriture lecture
if (fic_binlu.fail())//erreur d ouverture
{
cout<<"il y a erreur d ouverture du fichier bmp"<<endl;
return(false);
}
else
{
//lecture d entete
fic_binlu.read((char*) & entete_photo.Type_Fichier,sizeof(unsigned short));
fic_binlu.read((char*) & entete_photo.TailleFichier,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.Reserve1,sizeof(unsigned short));
fic_binlu.read((char*) & entete_photo.Reserve2,sizeof(unsigned short));
fic_binlu.read((char*) & entete_photo.DecalageBitsImage,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.TailleEnteteInfo,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.DimX,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.DimY,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.NombredePlans,sizeof(unsigned short));
fic_binlu.read((char*) & entete_photo.NombreBitsParPixels,sizeof(unsigned short));
fic_binlu.read((char*) & entete_photo.A_Compresser,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.DimensionImage_Decompressee,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.ResX,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.ResY,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.NombreCouleurs,sizeof(unsigned long));
fic_binlu.read((char*) & entete_photo.NombreCouleurs_Importantes,sizeof(unsigned long));
if (entete_photo.Type_Fichier!=19778)//verifie type photo
{
cout<<"le fichier n est pas un fichier bmp"<<endl;
return(false);
}
else
{
if (entete_photo.NombreBitsParPixels!=24)//verifie nombre pixel photo
{
cout<<"le nombre de bits par pixel n est pas valide pour cette image"<<endl;
return(false);
}
else
{
if (entete_photo.A_Compresser!=0)//verifie compression photo
{
cout<<"l image est compresse donc n est pas valide"<<endl;
return(false);
}
else
{
if ((entete_photo.DimX==0)||(entete_photo.DimY==0)||(entete_photo.DimX>512)||(entete_photo.DimY>512))//verifie dimension photo
{
cout<<"les dimensions de l image sont invalides"<<endl;
return(false);
}
else
{
Divise_Nboctets=(4-((3*entete_photo.DimX)%4));//verifie le nombre d octets de chaque ligne est divisible par 4
for(i=0;i<(entete_photo.DimY*entete_photo.DimX);i++)//boucle for pour remplir un tableau[nombre de pixels total][canaux de couleurs]
{
if(((i%entete_photo.DimX)==0)&(i!=0))
//sauter par dessus le bourrage
fic_binlu.seekg(Divise_Nboctets*sizeof(unsigned char),ios::cur);
else
for(j=0;j<3;j++)
fic_binlu.read((char*) &tableau[i][j],sizeof(unsigned char));//lecture du fichier binaire variable par variable
}
return(true);
}
}
}
}
}
fic_binlu.close();
}
void Afficher_Entetes ( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo )
{
//affichage des données de l entete de la photo
cout<<"Informations sur le fichier:"<<endl;
cout<<"Nom du fichier:"<<Nom_Fichier_BMP<<endl;
cout<<"Dimension de l'image en X:"<<entete_photo.DimX<<endl;
cout<<"Dimension de l'image en Y:"<<entete_photo.DimY<<endl;
cout<<"Codage des couleurs(Nombre de bits par pixel):"<<entete_photo.NombreBitsParPixels<<endl;
cout<<"Nombre maximum de caracteres que peut contenir le message cache:"
//nombre de caracteres maximum=nombre de pixels/8 moins 32pixels de l entete de message moins les 8pixels du \0
<<(((entete_photo.DimX*entete_photo.DimY)/8)-32-8)
<<endl;
if (entete_photo.A_Compresser==0)//verifie compression de la photo
cout<<"Compression:Inactive"<<endl;
else
cout<<"Compression:Active"<<endl;
}
bool Insertion_Message( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo)
{
string chaine;
int k=0,i,j,Tab[512*512]/*tableau qui va contenir les bits des caracteres*/,nbr=0;
int couleur_canal;
do//verifie la validité du nombre de caracteres a entrer
{
cout<<"entrer la chaine de caractere a cacher dans l image"<<endl
<<"le nombre de caractere de la chaine ne doit pas depasser "<<(((entete_photo.DimX*entete_photo.DimY)/8)-32-8)<<endl;
getline(cin,chaine);//lire la phrase complete
}
while (chaine.size()>(((entete_photo.DimX*entete_photo.DimY)/8)-32-8));
for(i=0;i<chaine.size();i++)//parcourir chaque caractere de la chaine
for(j=7;j>=0;j--)//convertir chaque caractere en binaire
{
nbr=pow(2,i);
Tab[k]=((int(chaine[i])/nbr)%2);//mettre chaque bits du caractere dans une case du tableau TAB
k++;
}
cout<<"choisissez le canal de couleur sur lequel vous allez mettre le message a cacher"<<endl;
do//verifie la validité du canal de couleur choisi
{
cout<<"entrer 0 pour bleu,1 pour vert,2 pour rouge";
cin>>couleur_canal;
}
while((couleur_canal!=0)||(couleur_canal!=1)||(couleur_canal!=2));
//remplace les 32premiers pixels pour chaque canal par des 0(zero)
for (i=0;i<32;i++)
{
for (j=0;j<3;j++)
{
if ((tableau[i][j])%2!=0)
tableau[i][j]--;
}
}
//inserer le message secret
for (i=0;i<32+(chaine.size()*8);i++)//parcourir les pixels
{
if (i<32)//condition sur le numero du pixel
{ //pour les 32 premier pixels et pour un canal choisi remplacer les anciens bits par une suite de 1 et de 0
if ((i%2)==0)
{
if ((tableau[i][couleur_canal]%2)==0)
{
tableau[i][couleur_canal]++;
}
}
else
{
if ((tableau[i][couleur_canal]%2)!=0)
{
tableau[i][couleur_canal]--;
}
}
}
else
{ //pour les pixels suivants inserer les bits des caracteres de la chaine
if (Tab[i-32]!=0)
{ //si le code de pixel est paire et que le bits du caractere est impaire
if ((tableau[i][couleur_canal]%2)==0)
{
tableau[i][couleur_canal]++;//ajouter 1 au code du pixel
}
}
else
{ //si le code de pixel est impaire et que le bits du caractere est paire
if ((tableau[i][couleur_canal]%2)!=0)
{
tableau[i][couleur_canal]--;//ajouter 1 au code du pixel
}
}
}
}
//inserer la fin du message qui est le \0(une suite de 0 sur 8 pixels)
for (i=(32+(chaine.size()*8));i<(32+8+(chaine.size()*8));i++)
{
if ((tableau[i][couleur_canal]%2)!=0)
{
tableau[i][couleur_canal]--;
}
}
return(true);
}
void Decodage_Message( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo)
{
int i,j,k,code=0,Tab[512*512];
bool resultat=true;
for ( k=0;k<3;k++)
{
for (i=0;i<32;i++)
{
for (j=0;j<3;j++)
{
if(j==k)
{
if ((i%2)==0)
{
if ((tableau[i][j]%2)==0)
{
resultat=false;
break;
}
}
else
{
if ((tableau[i][j]%2)!=0)
{
resultat=false;
break;
}
}
}
else
if (tableau[i][j]%2!=0)
{
resultat=false;
break;
}
}
if(resultat==false)
break;
}
if ( resultat==true)
{
for (i=32;i<(entete_photo.DimX*entete_photo.DimY);i++)
{
if (tableau[i][k]%2!=0)
Tab[i-32]=1;
else
Tab[i-32]=0;
}
j=7;
cout<<"le message caché est : "<<endl;
for(i=0;i<((entete_photo.DimX*entete_photo.DimY)-32);i++)
{
if (j<0)
{
if (char(code)==0)
break;
else
{
cout<<char(code);
code=0;
j=7;
}
}
else
{
code=code+pow(Tab[i]*2,j);
j--;
}
}
}
break;
}
if ( resultat==false)
cout<<"le fichier BMP ne contient pas de message cache"<<endl;
}
bool Sauvgarde_Image( string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo)
{
string Nouveau_Nom;
ofstream fic_binecrit;
int Divise_Nboctets;
int i,j;
do
{
cout<<"entrer un nouveau nom pour l image :";
cin>>Nouveau_Nom;
}
while
(Nouveau_Nom==Nom_Fichier_BMP);
fic_binecrit.open(Nouveau_Nom.c_str(),ios::binary);
if (fic_binecrit.fail())//erreur d ouverture
{
cout<<"il y a erreur d ouverture du fichier en ecriture"<<endl;
return(false);
}
else
{
fic_binecrit.write((char*) &entete_photo,sizeof(type_entete_photo));
Divise_Nboctets=(4-((3*entete_photo.DimX)%4));//verifie le nombre d octets de chaque ligne est divisible par 4
for(i=0;i<(entete_photo.DimY*entete_photo.DimX);i++)
{
if(((i%entete_photo.DimX)==0)&(i!=0))
//bourrer avec des zeros
for (j=0;j< Divise_Nboctets;j++)
fic_binecrit.write((char*) 0,sizeof(unsigned char));
else
for(j=0;j<3;j++)
fic_binecrit.write((char*) &tableau[i][j],sizeof(unsigned char));//ecriture du fichier binaire variable par variable
}
return(true);
}
}
// Menu
void main(string Nom_Fichier_BMP,unsigned char tableau[512*512][3],type_entete_photo entete_photo)
{
char choix;
bool Lecture=false,Insert=false,Sauve=false,Quit=false;
char reponse1,reponse2,reponse3,reponse4;
cout<<"Logiciel de steganographie : Stegan \n"
<<"Developpeur: Ben Amara Fares \n";
cout<<"prog de menu: \n";
do{
//system("cls");
cout<<"entrez choix ? : \n";
cout<<" 1 - Lire une image(charger un fichier BMP en memoire vive) \n";
cout<<" 2 - Afficher les informations sur le fichier charge \n";
cout<<" 3 - Inserer un message cache \n";
cout<<" 4 - decoder le message cache \n";
cout<<" 5 - Sauvgarder la nouvelle image avec message cache \n";
cout<<" 6 - Quitter le programme \n";
cin>>choix;
switch(choix)
{
case '1' : if (Lecture==true)
{
do
{
cout<<"vous avez deja une image charge en memoire."
<<"si vous voulez l ecraser tapez O sinon tapez N:";
cin>>reponse1;
}
while
((toupper(reponse1)!='O')&(toupper(reponse1)!='N'));
if (toupper(reponse1)=='O')
{
if ( Insert==true)
{
do
{
cout<<"voulez vous sauvgarder l image-tapez O pour oui et N pour non:";
cin>>reponse2;
}
while
((toupper(reponse2)!='O')&(toupper(reponse2)!='N'));
if (toupper(reponse2)=='O')
{
Sauve=Sauvgarde_Image(Nom_Fichier_BMP,tableau,entete_photo);
}
}
}
}
Lecture=Lire_photo (Nom_Fichier_BMP,tableau,entete_photo);
break;
case '2' :
if ( Lecture==true)
{
Afficher_Entetes (Nom_Fichier_BMP,tableau,entete_photo);
}
else
cout<<"vous n avez pas le droit de selectionner cette option"<<endl
<<"il n y a aucun fichier BMP valide charge dans la memoire"<<endl;
break;
case '3' :
if ( Lecture==true)
{
Insert=Insertion_Message(Nom_Fichier_BMP,tableau,entete_photo);
}
else
cout<<"vous n avez pas le droit de selectionner cette option"<<endl
<<"il n y a aucun fichier BMP valide charge dans la memoire"<<endl;
break;
case '4' :
if ( Lecture==true)
{
Decodage_Message(Nom_Fichier_BMP,tableau,entete_photo);
}
else
cout<<"vous n avez pas le droit de selectionner cette option"<<endl
<<"il n y a aucun fichier BMP valide charge dans la memoire"<<endl;
break;
case '5' :
if ( Insert==true)
{
Sauve=Sauvgarde_Image(Nom_Fichier_BMP,tableau,entete_photo);
}
else
cout<<"vous n avez pas le droit de selectionner cette option"<<endl
<<"il n y a pas eu insertion d un message cache.Inserer un message puis sauvgarder."<<endl;
break;
case '6' :
cout<<"Voulez vous vraimment quittez le programme \n"
<<"entrer O pour oui et N pour non:";
cin>>reponse3;
if (toupper(reponse3)=='O')
{
if ((Insert==true)&(Sauve==false))
{
cout<<"voulez vous sauvgardez avant de quitter"
<<"entrer O pour oui et N pour non:";
cin>>reponse4;
if (toupper(reponse4)=='O')
{
Sauve=Sauvgarde_Image(Nom_Fichier_BMP,tableau,entete_photo);
}
}
Quit=true;
}
break;
}
}while(Quit==false);
}