繁体   English   中英

关于在c中解密图像文件的许多疑点

[英]Many doubts about decrypt an image file in c

首先,我不是很熟悉C,我来自Java,C#,C ++ ...并且我可能继承了这些语言的缺陷以实现这种做法,我有以下问题,这是我的代码:

#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,但是当我从我的文件中创建一个新的fread时,我得到一个“没有可用的源代码”msvrct!memcpy()在0xrandom_memory_address“来自Eclipse,当我调试时,好吧,我注释这一行,我尝试手动设置一个新的buffer2与28568作为我的数组的大小,显然有效,使缓冲的buffer2打印ascii字符值,但当我调用decrypt进行解密我的图像,最后的结果存储在v数组中,我必须在一个新文件中复制,我试图搜索如何在C中制作一个空图像png但我没有找到任何东西,所以我创建了我的加密图像的副本,称之为“image2”。 png“但我认为这不是”干净的解决方案“,因为另一方面根本不起作用。

有关此练习的更多解释,只需说解密函数使用8字节(64位)的块通过键(数组k)进行一系列操作,它们存储在v数组本身中,穿过8中的循环8并在每个循环执行中检索v中缓冲区的值,循环执行后我们得到v中的结果,只留下复制到最终显示图像解密的新文件中。

对于C中的所有新手来说,这是一个非常复杂的练习,它让我疯狂地试图弄清楚我做错了什么。

我希望任何人都能看到我现在无法做到的。

我认为你在缓冲区的声明方面遇到了问题。 我认为正确的应该是:

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);
    }
    ...

我不完全明白你想要完成什么,但有一个问题在这里:

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);

关于指针和数组有一些有趣的教程,我建议你阅读一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM