Fondere e nascondere info in files jpeg
Codice per fondere e nascondere dati in un jpeg
#include <stdio.h>
#include <time.h>

void cript (char *, char *, int); /* Prototipo di funzione */

main(int argc, char *argv[])
{
FILE *file1, *file2, *file3;
char *tutto1, *tutto2, pad[16];
long file1lung, file2lung;
int startpad;
time_t secondi;

if (argc<4)
{
printf("USO: %s file1 file2 file3:\n",argv[0]);
printf("file1 - file JPG\n");
printf("file2 - file da nascondere\n");
printf("file3 - nome del file di Output\n");
exit(-1);
}


file1 = fopen(argv[1], "r");
if (file1 == NULL)
{
printf("Errore di apertura nel file %s\n",argv[1]);
exit(-1);
}

file2 = fopen(argv[2], "r");
if (file2 == NULL)
{
printf("Errore di apertura nel file %s\n",argv[2]);
exit(-1);
}

file3 = fopen(argv[3], "w");
if (file3 == NULL)
{
printf("Errore di apertura nel file %s\n",argv[3]);
exit(-1);
}

/* Trova la lunghezza dei 2 files */

fseek(file1, 0, SEEK_END);
file1lung = ftell(file1);
rewind(file1);

fseek(file2, 0, SEEK_END);
file2lung = ftell(file2);
rewind(file2);

/* Legge il contenuto dei 2 files */

tutto1 = (char *) malloc(file1lung);
fread(tutto1, 1, file1lung, file1);

tutto2 = (char *) malloc(file2lung);
fread(tutto2, 1, file2lung, file2);

/* Crea la chiave che servira' per criptare i dati */

secondi = time(NULL);
srand(secondi);
startpad = rand();
startpad= startpad%(file1lung-16);
strncpy(pad, tutto1+startpad, 16);

/* Cripta i dati */

cript(tutto2, pad, file2lung);

/* Crea il file scrivendo prima il file JPG e poi i dati criptati */

fwrite (tutto1, 1, file1lung, file3);
fwrite (tutto2, 1, file2lung, file3);

printf("Dati necessari per estrarre i dati:\n\nByte: %d\nPad : %d\n", file1lung, startpad);

fclose(file1);
fclose(file2);
fclose(file3);

}

void cript (char *buff, char *pad, int lung)
{
int h;

for (h = 0; h < lung; h++)
{
buff[h]^=pad[h%16];
}
}

Codice per estrarre il file nascosto

#include <stdio.h>

void decript (char *, char *, int); /* Prototipo di funzione */

main(int argc, char *argv[])
{
FILE *file1, *file2;
char *tutto, pad[16];
long file1lung, file2lung, file3lung;

if (argc<5)
{
printf("USO: %s file1 file2 num:\n",argv[0]);
printf("file1 - file JPG\n");
printf("file2 - nome del file di Output\n");
printf("Bytes - numero di byte dell'immagine originale\n");
printf("Pad - numero iniziale del pad\n");
exit(-1);
}

file1 = fopen(argv[1], "r");
if (file1 == NULL)
{
printf("Errore di apertura nel file %s\n",argv[1]);
exit(-1);
}

file2 = fopen(argv[2], "w");
if (file2 == NULL)
{
printf("Errore di apertura nel file %s\n",argv[2]);
exit(-1);
}
/* Trova la lunghezza dei 3 files */

fseek(file1, 0, SEEK_END);
file1lung = ftell(file1);
file2lung = atoi(argv[3]);
file3lung = file1lung-file2lung;

if (file2lung>file1lung)
{
printf("Parametro \"Bytes\" sbagliato\n");
exit(-1);
}

/* Legge solo la parte dei dati criptati */

rewind(file1);
fseek(file1, file2lung, SEEK_CUR);
tutto = (char *) malloc(file3lung);
fread(tutto, 1, file3lung, file1);

/* Crea la chiave che servira' per decriptare i dati */

rewind(file1);
fseek(file1, atoi(argv[4]), SEEK_CUR);
fread(pad, 1, 16, file1);

/* Decripta i dati */

decript(tutto, pad, file3lung);

/* Salva i dati sul file */

fwrite (tutto, 1, file3lung, file2);

fclose(file1);
fclose(file2);

}

void decript (char *buff, char *pad, int lung)
{
int h;

for (h = 0; h < lung; h++)
{
buff[h]^=pad[h%16];
}
}