Program nie rozpoznaje pliku

0

Cześć,
mam upragniony program do ukrywania tekstu w bitmapie napisany w czystym C.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int get_image_data_offset(FILE* bmp_offset) {
	fseek(bmp_offset,10,0);
	int offset;
	offset=(int)fgetc(bmp_offset);
	return offset;
}

int get_message_length(FILE *fp) {
	fseek(fp, 0L, SEEK_END);
	int size = ftell(fp);
	fseek(fp, 0L, SEEK_SET);
	return(size);
}
int get_bit(char the_byte,int which_bit) {
	return((the_byte>>8-which_bit)&1);
}

int main(int argc,char** argv) {
	unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
    int i, j;
	FILE *file_handle;
	FILE *message_handle;
	FILE *hidden_message_handle;

	if(argc!=5) {
		printf(" -e: Add text to image\n -d : Get text from image\n",argv[0]);
		exit(1);
	}

	int mode;
	if(!strcmp(argv[1],"-e"))
		mode=1;
	else if(!strcmp(argv[1],"-d"))
		mode=0;
	else {
		printf(" - e = encrypt \n d= decrypt \n",argv[0]);
		exit(1);
	}

	/* HANDLING FILE OPENING AND ERRORS */
	file_handle=fopen(argv[2],"r");
	if (file_handle == NULL) {
		fprintf(stderr, "Can't open input file %s\n",argv[2]);
		exit(1);
	}

	hidden_message_handle=fopen(argv[3],"w");
	if (hidden_message_handle== NULL) {
		fprintf(stderr, "Cannot create output file %s\n",argv[3]);
		exit(1);
	}


	int c=0;

	/* Generate file with the same header. Copy first 128 bytes */
	char tmp_sig_cpy;
	int offset=get_image_data_offset(file_handle);

	rewind(file_handle);

	for(i=0;i<offset;i++) {
		tmp_sig_cpy=fgetc(file_handle);
		fputc(tmp_sig_cpy,hidden_message_handle);
		c++;
	}
	/* Made file as .bmp */

	char file_buffer; 			// Temp variable for one byte from file
	char message_buffer;		// Temp buffer for one byte of message

	if(mode) {
		message_handle=fopen(argv[4],"r");
		if (message_handle== NULL) {
			fprintf(stderr, "Can't open text input file %s\n",argv[4]);
			exit(1);
		}
		int hidden_message_length=get_message_length(message_handle);


	/*
	After offset has been read and the file header has been written as is for the virgin image - the length of the hidden message is written as the first byte. This length is then used while decrypting the text from the image.
	*/
		fputc(hidden_message_length,hidden_message_handle);
		c++;
		do {
			int bit_of_message;
			if(!feof(message_handle)) {
				message_buffer=fgetc(message_handle);
				for(i=1;i<=8;i++) {  //Do this for every bit in every byte of the virgin-image

					file_buffer=fgetc(file_handle);
					c++;
					int file_byte_lsb = file_buffer & 1; // AND WITH 1 TO GET THE VALUE OF LSB. AND MAKES IT 0 IF LSB IS 0 OR 1 IF IT IS 1

					bit_of_message=get_bit(message_buffer,i);
					//bit_of_message=mask_table[i] & message_buffer;
					if(file_byte_lsb==bit_of_message) {
						fputc(file_buffer,hidden_message_handle);
					}
					else {
						if(file_byte_lsb==0)
							file_buffer = (file_buffer | 1);
						else
							file_buffer = (file_buffer & ~1);
						//  logic to flip the LSB bit of file_buffer and put it into a file with putc()
						fputc(file_buffer,hidden_message_handle);
					}
				}
			}
			else {
				tmp_sig_cpy=fgetc(file_handle);
				fputc(tmp_sig_cpy,hidden_message_handle);
				c++;
			}
		} while(!feof(file_handle));
		fclose(message_handle);
	}
	else {
		message_handle=fopen(argv[4],"w");
		if (message_handle== NULL) {
			fprintf(stderr, "Can't open text input file %s\n",argv[4]);
			exit(1);
		}

		/* Grab LSB of all bytes for length specified at fgetc */
		int message_length=fgetc(file_handle);
		for(i=0;i<message_length;i++) {
			char temp_ch='\0';
			for(j=0;j<8;j++) {
				temp_ch=temp_ch<<1;
				file_buffer=fgetc(file_handle);
				int file_byte_lsb = file_buffer & 1;
				temp_ch|=file_byte_lsb;
			}
			fputc(temp_ch,message_handle);
		}
		fclose(message_handle);
	}

	/* Clean up before exit */
	fclose(file_handle);
	fclose(hidden_message_handle);
}

Jest on uruchamiany z konsoli komendami odpowiednio dla ukrywania tekstu w bitmapie i odczytywania z niej informacji:

-e sample.bmp stegano_sample.bmp message.txt
-d stegano_sample.bmp intermediate.bmp original_message.txt

Problem polega na tym, że wywala mi komunikat, że nie rozpoznaje pliku stegano_sample.bmp. Nie wiem o co chodzi. Program docelowo ma działać na Linuksie, ja go odpalam na Windowsie. Gdyby ktoś mógł sprawdzić jego działanie na tym pierwszym byłbym wdzięczny.

0
Czarteg napisał(a):

Gdyby ktoś mógł sprawdzić jego działanie na tym pierwszym byłbym wdzięczny.

Postaw sobie maszyne virtualną z pierwszym lepszym Linuxem i sam bedziesz mógł testować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1