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