2011-09-06 185 views
-1

我一直想在一個非常簡單的加密日常工作,它應該是這樣的:

生成隨機ASCII

- 生成ASCII字符的隨機密鑰(ASCII表只是置換)
- 對於要加密的文件中的每個字符,獲取其十進制表示(X),然後將其替換爲索引X處的字符。

問題是它損壞了一些文件,我不知道爲什麼。
任何幫助,將不勝感激。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
int main() 
{ 
    int temp,used[256]; 
    char *key,*mFile; 
    long i,fSize; 

    memset(used,0,sizeof(used)); 

    srand(time(NULL)); 

    FILE *pInput = fopen("Input.in","rb"); 
    FILE *pOutput = fopen("Encrypted.out","wb"); 
    FILE *pKeyOutput = fopen("Key.bin","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyOutput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 
    key = (char*)malloc(255); 
    for(i=0;i<256;i++) 
    { 
     temp = rand()%256; 
     while(used[temp]) 
      temp = rand()%256; 
     key[i] = temp; 
     used[temp] = 1; 
    } 
    fwrite(key,1,255,pKeyOutput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 

    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     fputc(key[temp],pOutput); 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyOutput); 
    free(mFile); 
    free(key); 
    return 0; 
} 



解密例程:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int temp,j; 
    char *key,*mFile; 
    long i,fSize; 

    FILE *pKeyInput = fopen("key.bin","rb"); 
    FILE *pInput = fopen("Encrypted.out","rb"); 
    FILE *pOutput = fopen("Decrypted.out","wb"); 

    if(pInput==NULL||pOutput==NULL||pKeyInput==NULL) 
    { 
     printf("File I/O Error\n"); 
     return 1; 
    } 

    key = (char*)malloc(255); 
    fread(key,1,255,pKeyInput); 

    fseek(pInput,0,SEEK_END); 
    fSize = ftell(pInput); 
    rewind(pInput); 
    mFile = (char*)malloc(fSize); 
    fread(mFile,1,fSize,pInput); 

    for(i=0;i<fSize;i++) 
    { 
     temp = mFile[i]; 
     for(j=0;j<256;j++) 
     { 
      if(key[j]==temp) 
       fputc(j,pOutput); 
     } 
    } 

    fclose(pInput); 
    fclose(pOutput); 
    fclose(pKeyInput); 
    free(mFile); 
    free(key); 
    return 0; 
} 
+2

沒有檢查,沒有意見,沒有調試打印 - >錯誤的代碼 - >行爲可能不可預測 – pmod

+0

哪些文件是腐敗? – Chriszuma

+0

@pmod代碼很簡單,不需要任何評論。 –

回答

2

請確保您使用unsigned char;如果char已簽名,則在處理0x80..0xFF範圍內的字符時,將出錯。具體來說,您將在「映射表」中訪問負面的索引。

當然,嚴格說來,ASCII是一個7位代碼集和0x00..0x7F不是ASCII範圍以外的任何字符。


您只分配255個字節,但您繼續覆蓋超出您分配的一個字節。這是一個基本的緩衝區溢出;你調用未定義的行爲(這意味着任何事情都可能發生,包括它似乎在不引起麻煩的情況下正常工作的可能性 - 在某些機器上)。

另一個問題是,你寫映射了256個可能的字節代碼,這是令人費解的255。其他字節值會發生什麼?

當然,因爲你寫的256字節映射到「加密」文件,這將是孩子們的遊戲進行解碼;這個方案的安全性可以忽略不計。但是,作爲編程練習,它仍然有一些優點。

沒有理由啜整個文件,然後按字節寫出來的字節。你可以很好地逐字節讀取它,並逐字節地寫入它。或者,您可以啜泣整個文件,將其原位映射,然後一次寫入整個文件。一致性在編程中很重要。

+0

可能要編輯走,如果... –

+0

非常感謝,它現在工作正常。 –

+0

改變了緩衝區大小爲256(DA地獄是我在想什麼^ _ ^) –