Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[c] pb avec un algo , action sur les pixels


Messages recommandés

Posté(e)

salut , g un pb avec un tp , on doit faire un programme de steganographie , qui consiste , à caher un texte ds une image en modifiant le bit de faible poids , tous les 4 octets , par la sequence de bits des caracteres (codes sur 8bits) .

on considere que l'en tete de l'image *.bmp est de 80 octets , soit 80*sizeof(char)

 

g fait l'algo pour decryper :

/******************************************************************************************/

/****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 = '';

 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("%dn",cpt);

fclose(f_encrypt);

 

}

qui marche , cf l'image *.bmp (www.chez.com/sebien ; puis image.bmp)

 

le pb , c que mon algo pour encrypter ne marche pas , ou plutot il marche , mais pas avec la meme convention ! et je vois pas ce qui foire !

si qqun a une idee , je suis tres interresse !

 

/******************************************************************************************/

/**********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 = ((pixel)&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 ("donen");

 

// clean up, such as it is

fclose (image_crypt);

fclose (TEMP);

fclose (image_encrypt);

 

 

}

 

:?

Posté(e)

Il est à rendre pour quand ton TP ? (qu'on se casse pas la tête si c'est juste pour aujourd'hui)

Tiens-nous au courant de tes découvertes (qu'on se casse pas la tête si tu as trouvé)...

Posté(e)

Raconte-moi tout...

La partie décryptage, elle est de toi ? (nan, paske y'a qd même une GROSSE différence de style entre les deux fonctions...)

Avant d'entrer dans le vif du sujet (paske j'en suis qu'à ma première lecture, là), qques remarques :

- les #define au milieu du code c'est pas beau

- les variables qui s'appellent TEMP c'est pas beau pas beau (x2 paske le nom ne veut rien dire, et paske les noms en majuscule c'est normalement prévu pour les #define !!)

- le coup du "j'ouvre un fichier, je demande la saisie d'une chaine, je sauve la chaine dans le fichier, je ferme le fichier, j'ouvre le fichier, je relis la chaine à partir du fichier..." c'est très moche (lis la chaine au clavier et puis basta! si vraiment tu veux récupérer ta chaine dans le fichier, ouvre, sauve et ferme et c'est tout... j'ai pas compris l'interêt du truc)- les commentaires // c'est en C++ ou en Java (et en Javascript, mais bon, on parle de langage de programmation, là) ;-)

- les boucles zarbi for(k=0;k<32;k+=4) où tu n'utilises pas "k" c'est de l'obfuscation de code, et c'est pas sympa pour ceux qui essaient de comprendre :-(

Posté(e)

temp , c parce qu'on va donner la possibilite à l'utulisateur de sauver son texte , c tout ....

 

heu , on est en binome , et un a fait l'encodage , l'autre a fait e l decodage , de son coté , c pquoi , les 2 sont different s, cela n'empeche que l'algo de l'encryptage , ne me parait pas faux pour autant , et que ca marche pas comme on veux !

ma question est donc de savoir quesce qui va pas ???

Posté(e)

Tiens, dans ta formule d'encryption, tu boucles toujours sur les 8 mêmes octets...

(le fread(&pixel, sizeof(char), 8, image_crypt) n'est pas dans la boucle)

...alors que si j'ai bien compris le principe, tu chopes un octet sur quatre, et tu lui remplaces son bit de poids faible par les bits de la chaine à encoder...

(oui, c'est plus écrit comme "tu chopes par paquet de 32 octets et tu codes une lettre dedans en remplacant qu'un bit de poids faible sur 4" mais c'est moins lisible)

Tu veux la correction de l'algo ou bien tu arriveras à te débrouiller tout seul ?

Posté(e)

Premier jet

 

while (fread(&c, sizeof(char), 1, TEMP))

{

fread(&pixel,sizeof(char), 32, image_crypt);

for (i = 0; i < 8; i++)

{

/* remplace le bit de poids faible du pixel par le i-ème bit de c */

pixel[4*i+3] = ((pixel[4*i+3]) & masque_encrypt) | ((c>>i)& 1);

}

fwrite(&pixel, 1, 32, image_encrypt);

}

Posté(e)

Attention, étant donné que je nai pas de compilo sous la main, je ne peux pas tester...

Dans la partie décryptage, les fichiers s'appellent f_nomfichier, pkoi tu n'appellerais pas ton fichier de message f_message ??

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...