[英]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.