2016-03-30 35 views
0

有沒有編譯錯誤只是功能錯誤,而在C製作一個簡單的XOR crypter

我試圖使在C簡單的XOR crypter。我發現,加密部分不是問題,因爲當XOR函數在同一個字符串上使用兩次時,它會返回我發回的確切字符串。因此,我相信這個問題並不是因爲這個加密部分,我相信寫這個文件時會出現這個問題。

功能的誤差在

int xorFile (char *infile, char *outfile) { 
    FILE *in, 
     *out; 
    long lSize; 
    char *buffer; 

    in = fopen (infile , "rb"); 
    out = fopen(outfile, "wb"); 

    if(!in) perror(infile),exit(1); 

    fseek(in , 0L , SEEK_END); 
    lSize = ftell(in); 
    rewind(in); 

    /* allocate memory for entire content */ 
    buffer = (char*)calloc(1, lSize+1); 
    if(!buffer) fclose(in),fputs("memory alloc fails",stderr),exit(1); 

    /* copy the file into the buffer */ 
    if(1!=fread(buffer , lSize, 1 , in)) 
     fclose(in),free(buffer),fputs("entire read fails",stderr),exit(1); 

    /* do your work here, buffer is a string contains the whole text */ 
    int i; 
    for(i=0;buffer[i]!='\0';i++) { 
     fputc(buffer[i]^XOR_KEY,out); 
    } 
    fclose(in); 
    free(buffer); 
    fclose(out); 
    return 0; 

} 

我相信導致錯誤

int i; 
for(i=0;buffer[i]!='\0';i++) { 
    fputc(buffer[i]^XOR_KEY,out); 
} 

完整程序

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/stat.h> 

#define XOR_KEY 0x6F 

int xorFile (char *infile, char *outfile) { 
    FILE *in, 
     *out; 
    long lSize; 
    char *buffer; 

    in = fopen (infile , "rb"); 
    out = fopen(outfile, "wb"); 

    if(!in) perror("blah.txt"),exit(1); 

    fseek(in , 0L , SEEK_END); 
    lSize = ftell(in); 
    rewind(in); 

    /* allocate memory for entire content */ 
    buffer = (char*)calloc(1, lSize+1); 
    if(!buffer) fclose(in),fputs("memory alloc fails",stderr),exit(1); 

    /* copy the file into the buffer */ 
    if(1!=fread(buffer , lSize, 1 , in)) 
     fclose(in),free(buffer),fputs("entire read fails",stderr),exit(1); 

    /* do your work here, buffer is a string contains the whole text */ 
    int i; 
    for(i=0;buffer[i]!='\0';i++) { 
     fputc(buffer[i]^XOR_KEY,out); 
    } 
    fclose(in); 
    free(buffer); 
    fclose(out); 
    return 0; 

} 

int main (int argc, char *argv[]) { 
    if (argc <= 2) { 

     fprintf (stderr, "Usage: %s [IN FILE] [OUT FILE]\n" , argv[0]) ; 

     exit (1); 
    } 

    xorFile (argv[1], argv[2]) ; 
} 

測試的原因

  • 經過多種操作系統上
  • 經過在不同的文件格式
  • 經過不同的權限
  • 經過不同的編譯器,以及(跑出來的東西來測試)

附加信息 當我加密一份t他的源文件和解密的話,所有剩下的只是#include <std

+0

FWIW,我運行了你的代碼,它對我來說工作得很好。輸出文件與輸入文件完全相同。 – kaylum

+0

@TomKarzes:你的問題的第二部分不會發生。他用'calloc'(零內存)分配'lSize + 1',然後只讀'lSize'。你的問題的第一部分仍然有效。 –

+0

什麼它不知道爲什麼它不適合我在Linux和Windows。 –

回答

2

您遇到的問題是由於您的循環過早退出而導致的。因爲它遇到空字節以下測試將盡快停止:

for(i=0;buffer[i]!='\0';i++) 

要加密整個文件,這需要改爲:

for(i=0;i<lSize;i++) 

這將不僅是對非問題文本文件,但也用於解密,因爲加密過程將爲與您的XOR_KEY匹配的任何字符引入零字節。例如,如果您的XOR_KEY是0x69,這是一個ASCII碼'i',則您的加密文件將包含一個零字節來代替每個'i'。解密時,它會在第一個這樣的字符處關閉文件,這解釋了您所看到的內容。這將糾正這一點。

+0

說我用這個創建了一個混淆的exe文件。該exe文件將不會運行嗎?我需要一種方法來解密它,然後再運行。我對嗎? –

+0

正確,只要密鑰不爲零,它幾乎肯定不會運行。但請記住,這種加密功能非常弱,對於有人破解而言相當微不足道。 –

1
buffer[i] ^= XOR_KEY; 
fputc(buffer[i]^XOR_KEY,out); 

首先,該計劃着眼於字符buffer[i],異或它,並存儲異或的字符回buffer[i]

然後,又着眼於buffer[i]字符(也就是現在的XOR運算),異或它,並寫入out

所以被寫入out的角色被XORed兩次 - 所以它只是原始角色。

+0

垃圾感謝指出。這是一個演示,看看它不是輸出問題,我現在會改變它。謝謝 –