c - 关于用c解密图像文件的许多疑问

标签 c image fwrite encryption fread

首先,我对 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 时,当我调试时,我从 Eclipse 中得到一个“No source available for “msvrct!memcpy() at 0xrandom_memory_address”,好吧,我评论了这一行,并尝试让它手动设置一个新的 buffer2 和 28568 作为我的数组的大小,显然有效,使 buffer2 的迭代打印 ascii 字符值但是当我调用 decrypt 来解密我的图像时,最终结果存储在 v 数组中,我必须将其复制到一个新文件中,我试图搜索如何在 C 中制作一个空图像 png 但我没有找到任何东西,所以我创建了一个加密图像的副本并调用它“image2.png”,但我认为这不是“干净的解决方案”,因为另一方面根本不起作用。

关于这个练习的更多解释只是说解密函数使用 8 字节(64 位) block ,通过 key (数组 k)进行一系列操作,它们存储在 v 数组本身中,穿过循环8 in 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);
    }
    ...

关于c - 关于用c解密图像文件的许多疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924919/

相关文章:

c - c 中的动态内存分配会引发特定大小的错误

c - C中的简单堆栈程序

image - seo如何优化一堆相似的图片?

android - 使用 Picasso 加载图像时显示模糊

python - 用Python编写后文件开头的奇怪字符

检查 C 语言中的服务器响应代码 200

c - 在客户端代码连接之前绑定(bind)

java - 如何使图像显示在 Java Swing Applet 中

PHP:fwrite 在 foreach 循环中不起作用(由于图像链接?)

c - 使用 fwrite/fread 和数据结构的几个问题