Многие сомнения по поводу расшифровки файла изображения в c - PullRequest
1 голос
/ 29 марта 2012

Во-первых, я не очень знаком с C, я из Java, C #, C ++ ... и, возможно, я унаследовал дефекты от этих языков, чтобы реализовать эту практику, у меня есть следующий вопрос, вот мойcode:

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

void decrypt(unsigned long* v, unsigned long* k);

const int MAX = 32;
const long delta = 0x9e3779b9;
long sum=0xC6EF3720;

int main() {
  FILE *fp;
  FILE *destino;
  unsigned long v[2];
  unsigned long k[4] = { 128, 129, 130, 131 };
  unsigned long tam=0;
  char* buffer;
  char* aux[sizeof(unsigned long)];
  int i;

if ((fp = fopen("image.png", "rb")) == NULL) {
    printf ("Error! \n ");
    return 0;
}
else {
    fread(&aux,sizeof(unsigned long),1,fp);
    memcpy(&tam,&aux,sizeof(unsigned long));
    buffer = (char*)malloc(tam);
    //fread(&buffer,1,tam,fp);
    char *buffer2[28568];
    fread(&buffer2,1,28568,fp);
    /*for(i = 0;i < tam;++i) {
         printf("%c", ((char *)buffer2)[i]);
     }*/
    for(i=4;i<tam;i+=8) {
        memcpy(&v,&buffer2[i],8);
        decrypt(&v,&k);
    }
    if ((result= fopen("image2.png", "rb")) == NULL) {
        printf ("Error! \n ");
        return 0;
    }
    else {
        fwrite(v,sizeof(unsigned long)*2,1,result);
        fclose (result);
        fclose(fp);
    }
}
return 0;
}

void decrypt(unsigned long* v, unsigned long* k) {
int i=0;
while(i<MAX) {
    v[1] = v[1] -((4 << v[0])+(k[2]^v[0])+(sum^(5 >> v[0]))+k[3]);
    v[0] = v[0] -((4 << v[1])+(k[0]^v[1])+(sum^(5 >> v[1]))+k[1]);
    sum = sum-delta;
    i++;
   }

}

Где tam - это размер моего двоичного файла (в данном случае это изображение), где я храню первые 4 байта (без знака), где находится размер в моем png-файле (28568)

Когда я создаю свой буфер char *, мне нужно динамически назначать с помощью malloc, но когда я создаю новый фред из моего файла, я получаю «Нет доступного источника для» msvrct! Memcpy () в 0xrandom_memory_address »из Eclipse, когда я отлаживаюНу, я комментирую эту строку и пытаюсь сделать так, чтобы вручную установить новый буфер2 с размером 28568 в качестве размера моего массива, по-видимому, работает, делая итерацию buffer2, печатает значения символов ascii, но когда я вызываю команду decrypt for, сделайте расшифровку моего изображения, окончательный результат хранится в массиве v, который я должен скопировать в новый файл, я пытался найти, как сделать пустое изображение PNG в C, но яничего не нашел, поэтому я создал копию своего зашифрованного изображения, назвав его «image2.png», но я полагаю, что это не «чистое решение» для этого, потому что с другой стороны не работает вообще.

Для более подробного объяснения этого упражнения просто скажите, что функция дешифрования работает с блоками по 8 байт (64 бита), которые через ключ (массив k) выполняют последовательность операций, где они хранятся в самом массиве v, пересекая цикл 8.в 8 и извлекает значение буфера в v в каждом из них, после выполнения цикла у нас есть результат в v и остается только скопировать в новый файл, где, наконец, отображается дешифрование изображения.

Это оченьсложная практика для всех новичков в Си, это сводит меня с ума, пытаясь понять, что я делаю не так.

Надеюсь, кто-нибудь может увидеть то, что я пока не могу.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Я не совсем понимаю, что вы пытаетесь сделать, но здесь есть одна проблема:

char* aux[sizeof(unsigned long)];
// ... some code ...
fread(&aux,sizeof(unsigned long),1,fp);

Поймите, что char* aux[sizeof(unsigned long)]; означает, что вы объявляете двойной указатель, но fread() прототипзаявляет, что адресат является единственным указателем:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

, поэтому вместо этого вам следует:

char aux[sizeof(unsigned long)]; 
// ... some code ...
fread(aux,sizeof(unsigned long),1,fp);

Не усложняйте вещи, которые не сложны!

Вы также делаете эту ошибку в других частях вашего кода, вам нужно все перепроверить, хорошо?Опять же:

char *buffer2[28568];
fread(&buffer2,1,28568,fp);

должно быть:

char buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);

Есть несколько интересных руководств по указателям и массивам , я предлагаю вам прочитать некоторые.

2 голосов
/ 29 марта 2012

Я думаю, у вас проблемы с объявлениями буферов. Я думаю, что правильное должно быть:

FILE *fp;
  FILE *destino;
  unsigned long v[2];
  unsigned long k[4] = { 128, 129, 130, 131 };
  unsigned long tam=0;
  char* buffer;
  char aux[sizeof(unsigned long)]; // without the "*"
  int i;

if ((fp = fopen("image.png", "rb")) == NULL) {
    printf ("Error! \n ");
    return 0;
}
else {
    fread(aux,sizeof(unsigned long),1,fp);
    memcpy(&tam,aux,sizeof(unsigned long));
    buffer = (char*)malloc(tam);
    //fread(buffer,1,tam,fp); // without the "&" in this case
    char buffer2[28568]; // without the "*"
    fread(buffer2,1,28568,fp); // or fread(buffer,1,tam,fp);
    /*for(i = 0;i < tam;++i) {
         printf("%c", buffer2[i]); // or buufer[i] if you change to use it again
     }*/
    for(i=4;i<tam;i+=8) {
        memcpy(v,&buffer2[i],8);
        decrypt(v,k);
    }
    ...
...