关于用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++; } } #包括 #包括 无效解密(无符号长*v,无符号长*k); 常数int MAX=32; 常数长增量=0x9e3779b9; 长和=0xC6EF3720; int main(){ 文件*fp; 文件*destino; 无符号长v[2]; 无符号长k[4]={128、129、130、131}; 无符号长tam=0; 字符*缓冲区; char*aux[sizeof(无符号长)]; int i; if((fp=fopen(“image.png”,“rb”))==NULL){ printf(“错误!\n”); 返回0; } 否则{ fread(&aux,sizeof(无符号长),1,fp); memcpy(&tam,&aux,sizeof(无符号长型)); 缓冲区=(字符*)malloc(tam); //fread(缓冲区,1,tam,fp); char*buffer2[28568]; fread(和buffer2,128568,fp); /*对于(i=0;i

关于用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++; } } #包括 #包括 无效解密(无符号长*v,无符号长*k); 常数int MAX=32; 常数长增量=0x9e3779b9; 长和=0xC6EF3720; int main(){ 文件*fp; 文件*destino; 无符号长v[2]; 无符号长k[4]={128、129、130、131}; 无符号长tam=0; 字符*缓冲区; char*aux[sizeof(无符号长)]; int i; if((fp=fopen(“image.png”,“rb”))==NULL){ printf(“错误!\n”); 返回0; } 否则{ fread(&aux,sizeof(无符号长),1,fp); memcpy(&tam,&aux,sizeof(无符号长型)); 缓冲区=(字符*)malloc(tam); //fread(缓冲区,1,tam,fp); char*buffer2[28568]; fread(和buffer2,128568,fp); /*对于(i=0;i,c,image,fwrite,encryption,fread,C,Image,Fwrite,Encryption,Fread,其中tam是我的二进制文件(本例中为图像)的大小,其中我存储了前4个字节(无符号长),其中位于我的png文件(28568)中的大小 当我创建我的char*缓冲区时,我必须使用malloc动态分配,但是当我从我的文件中创建一个新的fread时,我得到一个“无可用源”msvrct!0xrandom\u memory\u地址处的memcpy()“在Eclipse中,当我调试时,我注释了这一行,并尝试手动将新的buffer2设置为28568作为数组的大小,显然有效,使buffer2重复打印ascii字符

其中tam是我的二进制文件(本例中为图像)的大小,其中我存储了前4个字节(无符号长),其中位于我的png文件(28568)中的大小

当我创建我的char*缓冲区时,我必须使用malloc动态分配,但是当我从我的文件中创建一个新的fread时,我得到一个“无可用源”msvrct!0xrandom\u memory\u地址处的memcpy()“在Eclipse中,当我调试时,我注释了这一行,并尝试手动将新的buffer2设置为28568作为数组的大小,显然有效,使buffer2重复打印ascii字符值,但当我调用decrypt对图像进行解密时,最终结果存储在v数组中,我必须将其复制到新文件中,我试图搜索如何在C中生成一个空图像png,但没有找到任何东西,所以我创建了一个加密图像的副本,称之为“image2.png”,但我认为这不是“干净的解决方案”,因为另一方面根本不起作用

有关此练习的更多解释,只需假设decrypt函数使用8字节(64位)的块,这些块通过密钥(数组k)进行一系列操作,存储在v数组本身中,穿过循环8 in 8并在每个循环中检索缓冲区in 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 buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
文件*fp;
文件*destino;
无符号长v[2];
无符号长k[4]={128、129、130、131};
无符号长tam=0;
字符*缓冲区;
字符辅助[sizeof(无符号长)];//没有“*”
int i;
if((fp=fopen(“image.png”,“rb”))==NULL){
printf(“错误!\n”);
返回0;
}
否则{
fread(aux,sizeof(无符号长),1,fp);
memcpy(&tam,aux,sizeof(无符号长型));
缓冲区=(字符*)malloc(tam);
//fread(buffer,1,tam,fp);//在本例中不带“&”
char buffer2[28568];//不带“*”
fread(buffer2,128568,fp);//或fread(buffer,1,tam,fp);
/*对于(i=0;i对于(i=4;i我认为您对缓冲区的声明有问题。我认为正确的答案应该是:

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 buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);
文件*fp;
文件*destino;
无符号长v[2];
无符号长k[4]={128、129、130、131};
无符号长tam=0;
字符*缓冲区;
char aux[sizeof(unsigned long)];//不带“*”
int i;
if((fp=fopen(“image.png”,“rb”))==NULL){
printf(“错误!\n”);
返回0;
}
否则{
fread(aux,sizeof(无符号长),1,fp);
memcpy(&tam,aux,sizeof(无符号长型));
缓冲区=(字符*)malloc(tam);
//fread(buffer,1,tam,fp);//在本例中不带“&”
char buffer2[28568];//不带“*”
fread(buffer2,128568,fp);//或fread(buffer,1,tam,fp);
/*对于(i=0;i对于(i=4;i我不完全理解您试图实现的目标,但这里有一个问题:

char* aux[sizeof(unsigned long)];
// ... some code ...
fread(&aux,sizeof(unsigned long),1,fp);
请理解
char*aux[sizeof(unsigned long)];
表示您正在声明一个双指针,但
fread()
prototype表示目标是一个单指针:

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);
应该是:

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 buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);

上有一些有趣的教程,我建议您阅读一些。

我不完全理解您试图实现的目标,但有一个问题是:

char* aux[sizeof(unsigned long)];
// ... some code ...
fread(&aux,sizeof(unsigned long),1,fp);
请理解
char*aux[sizeof(unsigned long)];
表示您正在声明一个双指针,但
fread()
prototype表示目标是一个单指针:

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);
应该是:

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 buffer2[28568];
fread(buffer2, 1, 28568, fp);
// or: fread(buffer2, 1, sizeof(buffer2), fp);

有一些有趣的教程,我建议你读一些。

旁注:像这样使用
malloc
buffer=malloc(tam*sizeof(*buffer));
。另外,你需要用
free(buffer)释放内存当你不需要它时。你试过在
memcpy
之后打印
tam
的值吗?这与图像的大小匹配吗?
char*buffer[28568]
获取指针数组,而不是
字符数组,因此这不是您想要的。请尝试在编译器上一直打开警告。是否可以使用
字符*缓冲区