基於XOR的加密程序

以下程序實現對文件加密。使用了最簡單的XOR來完成。最近才知道,使用位運算的C編程稱之爲:低級程序設計……汗,此“低級”非彼“低級”……

首先是最簡單的XOR加密實現。

以下代碼:

 

 

該程序是最簡單的版本。對某一文件調用該程序,並給出密碼,即能完成編程。所給密碼和文件路徑最長爲BUFSIZ。若對某一已加密文件使用該程序,即可完成解密。

但不幸的是,在解密時,若所給密碼錯誤,則文件將損壞且無法修復……(貌似也可以修復,只不過麻煩了許多)

 

我認爲,如果密碼錯誤時,程序照樣運行,從而導致文件損壞,這是不應該的。當密碼錯誤時,程序應該終止運行而不是繼續動作。

於是,想到將密碼存儲於文件中,並以某種方式標註該文件爲加密文件,需要先給出密碼進行解碼。

於是又了以下程序:

 

先是頭文件:

 

接着是程序:

 

 

程序相當長啊~~~

第一次寫完以後相當興奮。但是運行以下,卻發現不正確。當我對某文件,如1.abc,加密後,源文件變成1.abc.coded。但對其解密後,卻發現無法運行……這樣,不管如何,只要經過加密的文件都將損壞……

研究了半天,才終於弄明白。是fopen出了問題。在fopen那裏,使用的mode是"rb+"。我原以爲,在解密時,當我把讀寫位置指定以後,從流頭開始寫入的話,就可以把原數據覆蓋,就如同在數組中一樣……但流畢竟不是數組。使用"rb+"時,是不會覆蓋原數據的,而類似於插入……這樣,已加密的文件頭BUFSIZ的密碼信息並沒有被覆蓋以達到刪除的目的,而是被移動到了文件後部。這樣就造成了文件損壞……

(補一句:我測試的是媒體文件,貌似如果是TXT等文件的話,不會損壞,但會多出信息……汗……)

想了半天,沒有想到有什麼函數能讓我從流中刪除部分數據……

 

於是,又改進了上面的程序。

 

chead.h:

 

cfile.c

 

 

想了半天確實沒有想到有可以刪除部分C流數據的函數,在網上找了下也確實沒有……於是使用了新建文件,將特定內容從舊文件複製至新文件,最後刪除舊文件的方法。

其實,在上面的程序二,其本質也是進行文件複製,不過當時爲了避免使用新的流容器,所以使用了在一個文件中來回定位的方法……這樣反而得不償失,空間是節省了,但時間效率降低了,由於要不停的來回定位,所以文件流的當前位置要來回不停的變動……

在程序三的CheckCode中,將兩個指針聲明爲register,大大的提高了效率。但奇怪的是,我將XorCode中的下標i聲明爲register後,並沒有提高效率,不知道是爲什麼……很想知道,在什麼情況下,將變量聲明爲register會提高效率。。。。。

 

當合法用戶忘記了密碼時候會無法解密該程序。實際上,我認爲加密只是用於防範非法用戶的,對合法用戶來說,應該能不需要記住密碼就可以進行解密。。。。

慶幸的是,由於該加密算法簡單,因此可以滿足這一點。如果是合法用戶,則使用下面的程序來解密,這樣就無需記住密碼……

 

chead.h

 

 

cfile.c

 

 

加密和解密實在是個很有趣的話題,以後有時間了再仔細研究吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章