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]; } }
|