2010-08-03 139 views
0

我在加密文件中的某些數據時遇到問題。我使用簡單的異或。 可以說,我有這樣的結構:二進制文件加密問題

struct MyFile{ 
char fileName[128]; 
int account; 
float balance;}; 

保存這是一個二進制文件工作正常,但是當我使用XOR到文件名的結構進行加密並保存結構爲HD然後讀取結構和解密的文件名沒有正確顯示字符。我使用這個簡單的函數來加密/解密的目的。

static void Codec(const char *key,int keySize,char* in,char *result,int length) 
{ 
    for(int i=0;i<length;i++) 
     result[i]=in[i]^key[i%keySize]; 
} 

請注意,當我加密文件名並直接解密它在內存中結果是正確的。我錯過了什麼,爲什麼它保存在硬盤上時被改變。請提前回復,並提前回復...

+3

您無法真正使用'加密'標籤,當詢問XOR問題時......任何傢伙只需要0.0001秒就可以找出你的'鑰匙'。 – 2010-08-03 22:55:57

+1

你是如何編寫/閱讀文件的?而@ Remus,他似乎在使用一次性鍵盤,因爲他的代碼使用了一串鍵。只要他不重用密鑰,這在技術上是安全的。編輯:哦,除非他使用的文件比文件短。然後是的,這將是可笑的容易找出 – Xzhsh 2010-08-03 22:56:30

+0

嘗試異或與它的零鍵 - 是你的算法? – 2010-08-03 23:03:36

回答

1

請注意,您需要打開文件二進制模式(對於fopen,「rb」/「wb」而不是「r」/「w」)。特別是Windows C實現有關於\n < - >\r\n轉換的問題。

unsigned char用於算術和位運算也是一個好主意;除8位二進制補碼之外的任何字符都可能會造成麻煩(這是允許的,大多數實現使用並且可能不會造成對稱XOR加密的任何問題,但仍需謹慎。)

2

首先,確定數據是否在寫入磁盤時實際發生了更改。讓你的程序打印出這四個地方的字符串:

  1. 之前將其加密
  2. 在加密之後,但它寫入磁盤
  3. 從磁盤中讀取之後之前,但解密它
  4. 前解密後

#2和#3的結果是否相同?如果是這樣,那麼在傳輸到磁盤並返回時文件不會被更改。

如果#2和#3不同,請嘗試將未加密的字符串寫入磁盤並將其讀出。這是否成功?

只將一個這樣的結構寫入文件並在十六進制編輯器中檢查文件的內容。該文件在磁盤上時是什麼樣的?

發佈寫入磁盤和從磁盤讀取的代碼也可能存在問題的一部分。

2

您必須以二進制模式打開文件。如果你使用CI/O(像我通常做),這意味着

FILE *input_file = fopen(input_file_name, "rb"); 
FILE *output_file = fopen(output_file_name, "wb"); 

相反,如果你已經被騙到用C++流,這意味着

std::ifstream input_file(input_file_name, ios::in | ios::binary); 
std::ofstream output_file(output_file_name, ios::out | ios::binary);