• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd rozpoznania pliku, zwraca wartosc 1

Object Storage Arubacloud
0 głosów
102 wizyt
pytanie zadane 17 stycznia 2018 w C i C++ przez Czarteg Nowicjusz (120 p.)

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

#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);
return 0;
}

Miał on być  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. Dodatkowo wyswietla błąd o zwracaniu 1. Zmieniałem wartości w exit(1) na exit(0), wtedy zwraca 0, ale nadal nie działa poprawnie. Argc cały czas przyjmuje wartosc 1. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+1 głos
1 odpowiedź 543 wizyt
pytanie zadane 31 grudnia 2021 w JavaScript przez Bakkit Dyskutant (7,600 p.)
+1 głos
2 odpowiedzi 137 wizyt
pytanie zadane 15 grudnia 2020 w JavaScript przez Hipolit Roszkowski Obywatel (1,480 p.)
0 głosów
1 odpowiedź 1,707 wizyt

92,555 zapytań

141,403 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...