簡體   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