2012-08-03 52 views
2

所以我試圖做一個文件用C加密程序(由我是那種方式新C)所以我寫了這個簡單的XOR文件加密代碼:我的C加密程序有什麼問題?

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
char fileName1[35] = {'\0'};  //Name of original file 
char fileName2[35] = {'\0'};  //Name of encrypted file 
char keyString[20] = {'\0'};  //Key determines result encryption 
FILE* originalFile;     //File to be encrypted 
FILE* cryptedFile;     //The encrypted file 
int c;        //byte read from original file 


printf("Enter file location followed by name of the file you want to encrypt: "); 
scanf("%s", fileName1); 

printf("Enter file location followed by name of the encrypted file: "); 
scanf("%s", fileName2); 

printf("Enter your key (Encryption changes based on Key): "); 
scanf("%s", keyString); 

originalFile = fopen(fileName1, "rb"); //rb to read file bytes 
cryptedFile = fopen(fileName2, "wb"); //wb to write bytes to file 


if(originalFile != NULL && cryptedFile != NULL){ 
    while((c = getc(originalFile)) != EOF){ 
     int x; 
     for(x=0; x<strlen(keyString); x++){ 
      c ^= keyString[x]; 
      putc(c, cryptedFile); 
     } 
    } 
    fclose(originalFile); 
    fclose(cryptedFile); 
} 

return 0; 
} 

所以要測試這個程序我創建了一個名爲file1.txt的文件,並運行加密程序,將第二個文件作爲file2.txt,並輸入密碼爲,祕密爲。然後我再次運行該程序,但是這次是在加密的file2.txt文件中創建了一個file3.txt,其密鑰爲,密鑰爲。由於它是相同的密鑰,file3.txt應該與file1.txt相同,但是file3.txt中包含隨機內容。那麼我做錯了什麼?

回答

4

你的程序輸出太多的數據;嘗試檢查file1.txt,file2.txt和file3.txt的大小。問題在於這一部分:

while((c = getc(originalFile)) != EOF){ 
     int x; 
     for(x=0; x<strlen(keyString); x++){ 
      c ^= keyString[x]; 
      putc(c, cryptedFile); 
     } 
    } 

有兩個嵌套循環,所以整個內部循環爲每個輸入字符執行。在內部循環內嘗試一個新的,如果達到EOF,則跳出兩個循環,或使用c ^= keyString[(x++) % strlen(keyString)];將循環變平。

+0

謝謝,我不知道我是如何錯過這樣的問題 – user1546022 2012-08-03 11:56:02

2

如果我理解你的問題; 你想加密一個文件,通過給它一個輸出文件來加上一個鍵

現在,當你運行第一個文件時,它提供了一個輸出,據說是正確的。 現在你說如果你加密的加密文件應該給出相同的結果?

好吧,它應該嘗試顛倒過程,看看如果通過解密最後一個文件兩次,你應該最終得到原始文本。

+0

這就是我通過測試我加密FILE1.TXT得到FILE2.TXT(這是加密文件)中的程序換貨然後扭轉這種局面我加密的file2.txt文件,並且應該和file1.txt中的內容一樣,但沒有 – user1546022 2012-08-03 11:51:59

+0

要真正解密file2.txt,你需要改變encrpyts的算法來解密。我沒有C編程專家,但我的邏輯告訴我找到^ = – Andrei0427 2012-08-03 11:53:34

+0

@ Andrei0427^=的反向符號是它自己的反轉。 – 2012-08-03 11:56:33

0
int x = 0, keyLen = strlen(keyString); 
while((c = getc(originalFile)) != EOF){ 
    c ^= keyString[x++%keyLen]; 
    putc(c, cryptedFile); 
} 
0

如果比較輸入和輸出文件的文件大小,您將看到輸出文件越來越大。這是因爲對於讀取的每個字節,都會爲密碼中的每個字母寫一個字符。這意味着如果您的密碼是"secret",輸出文件將比輸入文件大6倍。

您需要提出一種算法,它接受密碼並將其所有字母組合成單個值,您可以將其用於XOR操作。該算法通常被稱爲hash function

0

您的編碼方案應該稍微糾正一下。您正在用鑰匙中的每個字符來讀取您讀取的每個字符,但不會產生所需的效果。你甚至可以注意到,你的加密文件比原來的大,而它們應該是相同的使用這種加密方案。

您需要的是將原始文本中的一個字符與關鍵字中的一個字符進行異或。 您可以修復它以下列方式(例如):

if(originalFile != NULL && cryptedFile != NULL){ 
     int x = 0; 
     int keyStringLength = strlen(keyString); 

     while((c = getc(originalFile)) != EOF){ 
     c ^= keyString[x]; 
     putc(c, cryptedFile); 

     ++x; 
     if (x >= keyStringLength) { 
      x = 0; 
     } 
     } 

     fclose(originalFile); 
     fclose(cryptedFile); 
}