Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1246 connectés 

  FORUM HardWare.fr
  Programmation

  a l'aide svp , je galere en C sur un projet de steganographie

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

a l'aide svp , je galere en C sur un projet de steganographie

n°72936
psebcopath​e
Posté le 16-11-2001 à 22:24:54  profilanswer
 

voila , je dois faire un prog qui encode et decode du texte ds une image , en modifiant le bit de faible poids tous les 4 octets , et je m'embrouille tout seul !
ce que g fait , cad  presque rien :
 
#include <stdio.h>
 
main()
{
    int texte[100];
 int i;
 FILE *entree = fopen("image.bmp", "r" );
    FILE *sortie = fopen("sortie.bmp", "w" );
   long copybuf[25600];
 struct pixel
 {
  long pfort :31;
  unsigned pfaible:1;
 };
 typedef struct pixel s_pixel;
 
   
 /*entete*/
 while (copybuf<40)
 {
 fread(©buf,sizeof(int),1,entree);
   
 fwrite(©buf,sizeof(int),1, sortie);
 }
/*texte à crypter*/  
 printf("entrez le texte a steganografier :\n" );
 scanf("%d",&texte);
 
/*cryptage
 while(fread(©buf,sizeof(int),3200,entree))
 {
  for  
 }
 
 
 
    */
 
 
et voila une source que g trouve, qui est sencée marche mais c pas le cas chez moi :/
 
/* ensteg.c
** do steganography stuff
** note that this assumes a binary-type pnm (P4,P5,P6) without a comment field
**
** usage:
**   steg image.pnm file.dat output.pnm
** enstegs the file in file.dat into image.pnm to form output.pnm.  Assumes
** that the destegged file can have trailing garbage without a problem
** (.tar.gz is fine).
*/
 
#include <stdio.h>
 
int main(int argc, char *argv[])
{
    FILE *fp1 = fopen(argv[1], "r" );
    FILE *fp2 = fopen(argv[2], "r" );
    FILE *fout = fopen(argv[3], "w" );
    int w, h, max;
    char buf, copybuf[1024];
 
    fscanf(fp1, "%1024s", copybuf);
    fscanf(fp1, "%d%d%d\n", &w, &h, &max);
    fprintf(fout, "%s\n%d %d\n%d\n", copybuf, w, h, max);
 
    // ensteg the data
    printf ("enstegging...\n" );
    while (fread(&buf, 1, 1, fp2))
    {
 int i;
 
 for (i = 0; i < 8; i++)
 {
     char b = fgetc(fp1);
     char s = (b&0xFE) | ((buf>>i)&1);
     fwrite(&s, 1, 1, fout);
 }
    }
 
    // copy the remainder of the file (random-pad everything though)
    printf ("copying rest/adding garbage...\n" );
    while ((max = fread(copybuf, 1, 1024, fp1)))
    {
 int i;
 
 for (i = 0; i < 1024; i++)
     copybuf[i] &= (0xFE | (rand()>>3));
 fwrite(copybuf, 1, max, fout);
    }
 
    printf ("done\n" );
 
    // clean up, such as it is
    fclose (fp1);
    fclose (fp2);
    fclose (fout);
 
    return 0;
}
merci a tous .
    fclose (entree);
    fclose (sortie);
     
 
}

mood
Publicité
Posté le 16-11-2001 à 22:24:54  profilanswer
 

n°72997
gilou
Modérateur
Modzilla
Posté le 17-11-2001 à 07:50:18  profilanswer
 

Tu essayes le code sur quel format d'image?
Parce qu'il faut tenir compte de l'en-tete...
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°72999
rufo
Pas me confondre avec Lycos!
Posté le 17-11-2001 à 09:00:25  profilanswer
 

moi, je suis étonné que cette portion de code marche :
/*texte à crypter*/  
printf("entrez le texte a steganografier :\n" );
scanf("%d",&texte);
 
ta var texte est un tableau....tu mets pas d'indice?
 
et remarque: y'a plusieurs entêtes de bmp :)

n°73004
gilou
Modérateur
Modzilla
Posté le 17-11-2001 à 10:29:43  profilanswer
 

Bon notons certains des pb:
 

Citation :

main()


 
int main() ca te permettra de retourner des codes d'erreurs eventuellement, en sortie.
 
 

Citation :

FILE *entree = fopen("image.bmp", "r" );
FILE *sortie = fopen("sortie.bmp", "w" );


 
FILE *entree = fopen("image.bmp", "rb" );
FILE *sortie = fopen("sortie.bmp", "wb" );
/* Ca change rien mais ca fait pas de mal pour relire */
 
Bon un petit test pour verifier que les operations ont reeussi ca serait pas mal...
 
if (!entree || !sortie)
  {
   /* Ecrire un zoli msg d'erreur */
   exit (0);
   }
 

Citation :

struct pixel  
{  
 long pfort :31;  
 unsigned pfaible:1;  
};  
typedef struct pixel s_pixel;


Bof, je ferais:
typedef struct pixel{  
 long pfort :31;  
 unsigned pfaible:1;  
}pixel;  
 
De toute facon, je vois pas a quoi ca va te servir puisque un masque sera bien plus efficace.
 

Citation :

while (copybuf<40)  
{  
fread(©buf,sizeof(int),1,entree);  
   
fwrite(©buf,sizeof(int),1, sortie);  
}


 
{
  char copybuf[40];
  fread(©buf,sizeof(int),40,entree);  
  fwrite(©buf,sizeof(int),40, sortie);  
}
 

Citation :

printf("entrez le texte a steganografier :\n" );  
scanf("%d",&texte);


 
scanf("%s",&texte);  
Ben oui, car c'est pas un nombre que tu lis en entree.
De plus, scanf s'arretera au premier blanc, ce qui n'est sans doute pas suffisant pour le texte a crypter qui a priori est sans doute compose de plusieurs mots.
 
 
etc.
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73009
gilou
Modérateur
Modzilla
Posté le 17-11-2001 à 10:54:09  profilanswer
 

Au fait, l'essentiel de l'algo tient en ceci:
 

Citation :

while (fread(&buf, 1, 1, fp2))
{
    int i;
    for (i = 0; i < 8; i++)
    {
      char b = fgetc(fp1);
      char s = (b&0xFE) | ((buf>>i)&1);
      fwrite(&s, 1, 1, fout);
    }
}


Decomposons:

Citation :

while (fread(&buf, 1, 1, fp2))  {...}

Il boucle en lecture sur fp2, le fichier qui contient le texte a coder, et traite un caractere a la fois.

Citation :

(a&0xFE) | (b&1)

(b&0xFE): on met a 0 le bit de poids faible de a
(b&1): on recupere le bit de poids faible de b
D'ou (a&0xFE) | (b&1) : on met le bit de poids faible de b a la place de celui de a.
 

Citation :

for (i = 0; i < 8; i++) { a>>i; }


Il decale un a un les bits du caractere a.
 
Avec tout ca l'algo est vraiment evident:
On prend un caractere a coder c dans le fichier.  
Pour le coder, on fait:
On prend un pixel de l'image pix (l'algo suppose qu'elle est codee sur un caractere, sinon, il faut adapter)
on prend le bit de poids faible de c, on le met dans le bit de poids faible de pix, on decale les bits de c de un pour traiter le second bit au prochain tour, il est range en bit de poids faible.
On ecrit le pixel modifie, et on recommence 7 fois pour les autres bits de c.
C'est pas tres complique comme algo.
 
Il serait un poil plus efficace ecrit ainsi d'ailleurs, en bossant sur 8 pixels a la fois:
 

Citation :

char pixel[8], c;
int i;
while (fread(&c, 1, 1, fp2))
{
   fread(&pixel, 1, 8, fp1);
   for (i = 0; i < 8; i++)
       pixel[i] = ((pixel[i])&0xFE) | ((c>>i)&1);
   fwrite(&pixel, 1, 8, fout);
}


(Et si tu sais que ton texte est en ascii pur, tu peux bosser sur 7 pixels a la fois, plutot que 8...).
Il faut aussi prevoir un test pour voir si l'image est assez grande pour coder le texte: verifier que le nb de pixels de l'image est superieur a 8 fois la longueur du texte a coder avant de demarrer le codage, ou alors tronquer le texte a coder en fonction de la taille de l'image.
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73185
psebcopath​e
Posté le 17-11-2001 à 23:49:35  profilanswer
 

franchement je suis bluffé , je vous remerci tous bcp  
sinon , notre prof à crypter une image , on doit la decrypter , c une image 24bits (true collor) elle a modifie le bit de faible poids tous les 4 octets , normalement le texte fait 100 caractere.  
pour le moment g fait ca :  
#include <stdio.h>  
#include "librairie.h"  
 
void decrypt()  
{  
 
int enteteimage[40]; /* correspond à l'entête de l'image de 80octets */  
int curseur;  
long img_texte; /*correspond à la partie d'image encryptée */  
long masque=1;/*filtre permettant de décrypter l'image */  
long step_one[8];  
int i=0;  
char lettre;  
char mot[100];  
FILE *entree = fopen("image.bmp", "rb" );  
 
 
 
 
/*entete*/  
for (curseur =0 ; curseur< 40 ; curseur++ )  
{  
fread(&enteteimage,sizeof(int),2,entree);  
}  
for (curseur =40 ; curseur< 1640 ; curseur=curseur+16 )  
{  
while (i<8)  
{  
fread(&img_texte,sizeof(long),1,entree);  
step_one[i]=img_texte&masque;  
step_one[i]<<31-i);  
i++;  
lettre=step_one[0]+step_one[1]+step_one[2]+step_one[3]+step_one[4]+step_one[5]+step_one[6]+step_one[7];  
printf("%c",lettre);  
}  
/* mot[]=*/  
}  
 
 
 
 
fclose (entree);  
 
 
}  
 
si vous voulez essayer , l'image est sur www.chez.comsebienimage.bmp

n°73188
HelloWorld
Salut tout le monde!
Posté le 18-11-2001 à 00:07:02  profilanswer
 

ton lien marche pas :(
Forbidden
You don't have permission to access the requested URL on this server.
 
Sinon c cool je viens de decouvrir c koi la s-t-e-g-a-n-o-g-r-a-p-h-i-e (:sweat:) et comment ca fonctionne
 
histoire de contribuer :

Code :
  1. fscanf(fp1, "%1024s", copybuf);


c'est pour sauter l'entete du bitmap (si mes souvenirs sont bons)
car au debut y'a pas les couleurs, mais des indications sur la tailles, le nombre de couleurs ... tu peux trouver tres facilement de la doc dessus si tu veux faire un truc propre (car il peux y avoir une palette en suivant si <= 256 couleurs je crois et dans ce cas ca ferait desordre sur l'image finale


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°73299
psebcopath​e
Posté le 18-11-2001 à 17:25:08  profilanswer
 

enfait , vu que je suis chez un hebergeur un peu special :/ , on est obligé de se connecter à http://www.chez.com/sebien/ , puis de taper ensuite "image.bmp" et on peut la telecharger , desole .
merci bcp à toi aussi . , le programme d'encryptrage marche , reste celui qui permet de decrypter ....
pour l'entete de l'image , je considere qu'il est de 80 octets , comme ca g de la marge :) .

 

[edtdd]--Message édité par gilou--[/edtdd]

n°73404
gilou
Modérateur
Modzilla
Posté le 19-11-2001 à 03:58:15  profilanswer
 

le pb du lien, c'etait la virgule collee a l'url.
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73405
Tetedeienc​h
Head Of God
Posté le 19-11-2001 à 07:01:48  profilanswer
 

rufo a écrit a écrit :

moi, je suis étonné que cette portion de code marche :
/*texte à crypter*/  
printf("entrez le texte a steganografier :\n" );
scanf("%d",&texte);
 
ta var texte est un tableau....tu mets pas d'indice?
 
et remarque: y'a plusieurs entêtes de bmp :)  




 
euh, comme chacun le sais, un tableau en C est un bete pointeur ...
 
DOnc forcément oui ca amrche :D
 
Enfin sans le & ...


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
mood
Publicité
Posté le 19-11-2001 à 07:01:48  profilanswer
 

n°73406
Tetedeienc​h
Head Of God
Posté le 19-11-2001 à 07:02:27  profilanswer
 

gilou a écrit a écrit :

le pb du lien, c'etait la virgule collee a l'url.
A=,  



OUAIIIIIIIIIIIIIIIIIIIII
 
Y SAI ENFIN PLANTAI , Y SAI ENFIN PLANTAI !
 
:lol:  
 
:hello: gilou :D

 

[edtdd]--Message édité par Tetedeiench--[/edtdd]


---------------
L'ingénieur chipset nortiaux : Une iFricandelle svp ! "Spa du pâté, hin!" ©®Janfynette | "La plus grosse collec vivante de bans abusifs sur pattes" | OCCT v12 OUT !
n°73409
gilou
Modérateur
Modzilla
Posté le 19-11-2001 à 08:07:01  profilanswer
 

C' est mon clavier qui deconne entre les majuscules et les minuscules.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73410
gilou
Modérateur
Modzilla
Posté le 19-11-2001 à 08:17:50  profilanswer
 

Pour ton probleme, j' ai essaye un truc comme ca:

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4. char buffer[54]; /* Un header de bmp  fait 54 octets */
  5. char bytes[32];  /* 8*4 = 32 octets pour coder une lettre */
  6. char letter;
  7. int i, j, count;
  8. FILE *in = fopen("I:\\image.bmp", "r" ); /* a adapter */
  9. fread(buffer,1,54,in); /* On lit l' en tete*/
  10. count = 0; /* compte les lettres lues */
  11. fread(bytes, 1,2,in); /* a adapter. Ca c'est d' apres l' aspect du binaire de l' image qui avait l' air d'etre modifiee de 4 en 4 en demarrant par le 3e octet */
  12. while (fread(bytes, 1,32,in) && (count< 100))
  13. {
  14.   letter = '\0';
  15.   for (i = 0; i < 8; i++)
  16. {
  17.   j=4*i+3; /* Cf la ligne suivante, pour bytes[31-j] */
  18.   letter = ((bytes[31-j])&0x01) | (letter<<1);
  19.           /* les octets de poids fort sont a la fin, et doivent etre lus en premier */
  20. }
  21.   fprintf(stdout, "letter: %c", letter);
  22.   count++;
  23. }
  24. fclose(in);
  25. return 0;
  26. }


Il a pas l'air de decoder ton image, mais peut etre les infos que tu as donnees sont insuffisantes(ou mon programme estil bugge). Le principe general devrait etre bon. A toi d' adapter a tes donnees.
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73424
psebcopath​e
Posté le 19-11-2001 à 10:37:55  profilanswer
 

yes , quel boss!
le pb , du decryptage , c que la convention est :
1- entete = 80octets pour avoir de la marge  
2- l'image en true color (24 bits) : le bit de faible poids tous les 4 octets est remplace par le code binaire du caractere .  
 
 
, un tres tres grand merci , g tout compris now, je devrais pouvoir m'en sortir :jap:
:pouceup:

n°73429
gilou
Modérateur
Modzilla
Posté le 19-11-2001 à 11:04:03  profilanswer
 

Ah OK, je comprends, elle demarre pas au debut du bitmap, OK!
Sachant ca, il est facile de decoder l'image pour trouver le texte suivant:
LE SUJET DU PARTIEL SE TROUVE DANS LE CHATEAU DE ARGHHHHH !
(suffit de remplacer la ligne

Code :
  1. fread(bytes, 1,2,in); /* a adapter. Ca c'est d' apres l' aspect du binaire de l' image qui avait l' air d'etre modifiee de 4 en 4 en demarrant par le 3e octet */


par:

Code :
  1. fread(bytes, 1,26,in); /* 54 + 26 = 80, offset de debut du texte */

 
dans mon post precedent).
 
A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73436
chrisbk
-
Posté le 19-11-2001 à 11:51:26  profilanswer
 

bon ben c pas le tout, mais qqun sait comment faire de la steganographie resistant a un algo de compression, comme le jpg ?

n°73647
psebcopath​e
Posté le 19-11-2001 à 23:05:26  profilanswer
 

j'y suis aussi arrive avec l'algo precedent comme ceci :#include <stdio.h>
#define masque 0x01 /* 1 en hexadécimal*/
main()
{
 
 char bytes[32];  /* 8*4 = 32 octets pour coder une lettre */
 char letter;
 int i, j, count; /* compteurs utilisés pour manipuler les bits*/
 FILE *in = fopen("point.bmp", "r" );  
 fseek(in,sizeof(char)*80,0) ;/* on zappe l'en tête*/
 count = 0; /* compte les lettres lues */
 printf("message decode : \n" );
 
 while (fread(&bytes, 1,32,in) && (count< 100))
 {
  letter = '\0';
  for (i = 0; i < 8; i++)
  {
   j=4*i+3;  
   letter = ((bytes[31-j])&masque) | (letter<<1);
   /* les octets de poids fort sont a la fin, et doivent etre lus en premier */
  }
  printf("%c", letter);
  count++;
 }
printf("\n" );
printf("lettres lues " );
printf("%d\n",count);
fclose(in);
 
}
 
uin tres grand merci

n°73662
gilou
Modérateur
Modzilla
Posté le 20-11-2001 à 00:49:37  profilanswer
 

Si tu veux une bonne note a ton exo (ainsi qu'un bon entrainement au programmes c sous unix/linux), tu peux:
 
* changer main() en int main() et retourner un code d'erreur si il y a erreur.  
* recuperer un parametre -i nom_de_fichier en entree
* recuperer un parametre -o nom_de_fichier en sortie et le cas echeant, ecrire le texte dans ce fichier en sortie.
* recuperer un parametre -s step et modifier l'algo afin que l'on cherche tout les step octets (ici, step=4)
* recuperer un parametre -h head et modifier l'algo afin que l'on saute les head premiers octets (ici head=80)
* recuperer un parametre -n num et ne decripter que les n premiers caracteres (ici, n=100).
* recuperer un parametre -? et afficher le manuel (resume) d'utilisation. Afficher aussi ce manuel si la ligne de commande est erronnee.
* par defaut, supposer que le fichier en entree est sur stdin (et verifier cela avec la signature du fichier, qui doit demarrer par "BM" ).
* Tester si fopen echoue (ainsi que les autres operations de lecture et positionnement dans le fichier. Ecrire sur stderr un message d'erreur approprié.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°73663
gilou
Modérateur
Modzilla
Posté le 20-11-2001 à 01:36:15  profilanswer
 

Au fait, tu peux probablement remplacer:

Code :
  1. for (i = 0; i < 8; i++)
  2. {
  3.   j=4*i+3; 
  4.   letter = ((bytes[31-j])&masque) | (letter<<1);
  5.   /* les octets de poids fort sont a la fin, et doivent etre lus en premier */
  6. }


par:

Code :
  1. for (i = 0; i < 8; i++)
  2. {
  3.   if ((bytes[4*i])& 0x01)
  4.         letter |= 0x80; /* On met 1 dans le bit de poids fort */
  5.   letter>>1;            /* on decale vers le bas */     
  6. }


A+,

 

[edtdd]--Message édité par gilou--[/edtdd]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°74672
psebcopath​e
Posté le 22-11-2001 à 23:15:01  profilanswer
 

heu desole , g encore un pb , j'encrypte bien l'image avec mon texte , mais a parement , pas selon la bonne convention , ca j'arrive pas à la decrypter , si qqun pouvait me dire ou est l'erreur , ca serait cool :)
 
/**********************************************
********************************************/
/**********sous programme qui permet de steganografier un texte dans une image*************/
/*************************************************
*****************************************/
 
void encrypt()
{
#define masque_encrypt 0xFE
#define CHARMAX 101
 char  copybuf[80];
 char nomfic[51];
 char pixel[32], c;
 int i=0,j=0,k=0;
 char ligne[CHARMAX]="";              /*message saisi par l'utilisateur*/
 int rang=0;        
 int vide=0;
 
 
 FILE *image_crypt; /*ouverture en lecture de l'image initiale*/
    FILE * TEMP; /*fichier temporaire ou est stocke le message*/
    FILE *image_encrypt = fopen("out.bmp", "w" );/*ouverture en écriture de l'image finale (avec le message)*/  
   
   
 
 
 printf("indiquez le chemin ou se trouve l'image support de steganographie :" );
 scanf("%s",&nomfic);
    image_crypt=fopen(nomfic, "r" );
 
 
 
 
 TEMP=fopen("message.txt","w" );
 printf(" VEUILLEZ TAPER LE MESSAGE A CODER :" );
 
 scanf("%d",&vide);      /*vidage à la barbare du buffer */
 gets(ligne);       /*chargement du message dans une string*/  
 fputs(ligne,TEMP);      /*copie de la string dans un fichier temp*/
 fclose(TEMP);
 
 
 printf("\n" );
 
 // sauvegarde de l'entête de l'image:  
 
 while (j<80)
 {
 fread(©buf,sizeof(char),1,image_crypt);
 
 fwrite(©buf,sizeof(char),1, image_encrypt);
 j++;
 }
 printf("\n" );
 
 
 // encrypte texte dans image  
     
 
 TEMP=fopen("message.txt", "r" ); /*ouverture du fichier en lecture pour traitement*/
 while (fread(&c, sizeof(char), 1, TEMP))
 {
   
  fread(&pixel,sizeof(char), 8, image_crypt);
  for (k=0; k<32; k=k+4)
  {
 
   for (i = 0; i < 8; i++)
   {
 
   pixel[i] = ((pixel[i])&masque_encrypt) | ((c>>i)&1);//remplace le bit de faible poids de pixel par le bit de c
   }
  }
  fwrite(&pixel, 1, 8, image_encrypt);
 }
 
     //copie fin image
     
 printf ("copie fin...\n" );
    while (!feof(image_crypt))
    {
 
    fread(©buf,sizeof(char),1,image_crypt);
   
 fwrite(©buf,sizeof(char),1,image_encrypt);
 
    }
 
 
    printf ("done\n" );
 
    // clean up, such as it is
    fclose (image_crypt);
    fclose (TEMP);
    fclose (image_encrypt);
 
     
}
 
/*************************************************
*****************************************/
/****sous programme qui permet de decrypter le texte à partir d'une image steganografiée***/
/*************************************************
*****************************************/
 
void decrypt()
{
 
#define masque_decrypt 0x01 /* 1 en hexadécimal*/
 
 char octets[32];  /* 8*4 = 32 octets pour coder une lettre */
 char lettre;
 int i, j, cpt; /* compteurs utilisés pour manipuler les bits*/
 FILE *f_encrypt = fopen("out.bmp", "r" ); /* a adapter */
 fseek(f_encrypt,sizeof(char)*80,0) ;/* on zappe l'en tête*/
 cpt = 0; /* compte les lettres lues */
 printf("message decode : \n" );
 
 while (fread(&octets, 1,32,f_encrypt) && (cpt< 100))
 {
  lettre = '\0';
  for (i = 0; i < 8; i++)
  {
   j=4*i+3; /* Cf la ligne suivante, pour bytes[31-j] */
   lettre = ((octets[31-j])&masque_decrypt) | (lettre<<1);
   /* les octets de poids fort sont a la fin, et doivent etre lus en premier */
 
  }
  printf("%c", lettre);
  cpt++;
 }
printf("\n" );
printf("lettres lues " );
printf("%d\n",cpt);
fclose(f_encrypt);
 
}

n°74761
psebcopath​e
Posté le 23-11-2001 à 10:54:24  profilanswer
 

up!

n°75003
psebcopath​e
Posté le 23-11-2001 à 23:08:49  profilanswer
 

/*************************************************
*****************************************/
/**********sous programme qui permet de steganografier un texte dans une image*************/
/*************************************************
*****************************************/
 
void encrypt()
{
#define masque_encrypt 0xFE
#define CHARMAX 101
 
 char copybuf[80];
 char nomfic[51];
 unsigned char pixel[4], c;
 unsigned char pixel_code[32];
 int i=0,j=0,k=0;
 char ligne[CHARMAX]="";              /*message saisi par l'utilisateur*/
 int rang=0;        
 int vide=0;
 
 
 FILE *image_crypt; /*ouverture en lecture de l'image initiale*/
    FILE * Temp; /*fichier temporaire ou est stocke le message*/
    FILE *image_encrypt = fopen("out.bmp", "w" );/*ouverture en écriture de l'image finale (avec le message)*/  
   
   
 
 
 printf("indiquez le chemin ou se trouve l'image support de steganographie :" );
 scanf("%s",&nomfic);
    image_crypt=fopen(nomfic, "r" );
 Temp=fopen("message.txt","w" );
 printf(" VEUILLEZ TAPER LE MESSAGE A CODER :" );
 scanf("%d",&vide);      /*vidage à la barbare du buffer */
 gets(ligne);       /*chargement du message dans une string*/  
 fputs(ligne,Temp);      /*copie de la string dans un fichier temp*/
 fclose(Temp);
 printf("\n" );
 
 // sauvegarde de l'entête de l'image:  
 while (j<80)
 {
  fread(©buf,sizeof(char),1,image_crypt);
  fwrite(©buf,sizeof(char),1, image_encrypt);
  j++;
 }
 printf("\n" );
 
 
 // encrypte texte dans image  
    fseek(image_crypt,sizeof(char)*80,0);
 Temp=fopen("message.txt", "r" ); /*ouverture du fichier en lecture pour traitement*/
 while (fread(&c, sizeof(char), 1, Temp))
 {
  for (i = 0; i < 8; i++)
  {
   fread(&pixel,sizeof(char), 4, image_crypt);
   for (j=0; j<3 ; j++)
   {
     pixel_code[j] = pixel[j];
   }
   pixel_code[3] = ((pixel[3])&masque_encrypt) | ((c>>i)&0x01);//remplace le bit de faible poids de pixel par le bit de c
  }
   
  fwrite(&pixel_code, 1, 32, image_encrypt);
 }
 
     //copie fin image
    printf ("copie fin...\n" );
 fseek(image_crypt,sizeof(char)*3200,0);
    while (!feof(image_crypt))
    {
  fread(©buf,sizeof(char),1,image_crypt);
    fwrite(©buf,sizeof(char),1,image_encrypt);
 }
    printf ("done\n" );
 
    // FERMETURE DES FICHIERS  
    fclose (image_crypt);
    fclose (Temp);
    fclose (image_encrypt);
 getch();
 menu();
 
}
 
a l'aide gilou ou qqun d'autre , pkoi ca marche pas ??
 :heink:  :??:  :cry:

n°75085
Fork
Posté le 24-11-2001 à 12:20:42  profilanswer
 

Ca ne marche pas car tu as loupé un point important du cours de C !
L'ADRESSE D'UN TABLEAU, C'EST LE NOM DU TABLEAU TOUT COURT !!
 
Il faut donc que tu remplaces :
 
* scanf("%s",&nomfic);  
* fread(©buf,sizeof(char),1,image_crypt);  
* fwrite(©buf,sizeof(char),1, image_encrypt);  
* etc...
 
par :
 
* scanf("%s",nomfic);  
* fread(copybuf,sizeof(char),1,image_crypt);  
* fwrite(copybuf,sizeof(char),1, image_encrypt);  
* etc...
 
 
Par contre, pour les variables de type int et char, il faut effectivement mettre le '&'.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  a l'aide svp , je galere en C sur un projet de steganographie

 

Sujets relatifs
[c++] Graphisme, répondez svp (projet urgent)[PHP]Besoin d'aide !
Aide PhpAide pour la création d'un dico de définitions
[PhP] Besoin d'aide pour la gestion d'un site de vente en ligne !Projet de jeu video : on recrute !!!
debutant vb 6, besoin d aide, URGENT...[URGENT] [Java] aide sur JList !!
Une petite aide, juste 2 secondes.... merci ![Visual C++ 6] Faire un projet rtf
Plus de sujets relatifs à : a l'aide svp , je galere en C sur un projet de steganographie


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR