C語言DES加密算法分析_第1頁
C語言DES加密算法分析_第2頁
C語言DES加密算法分析_第3頁
C語言DES加密算法分析_第4頁
C語言DES加密算法分析_第5頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優質文檔-傾情為你奉上云南大學軟件學院School of Software, Yunnan University成績學 期: 2011秋季學期 課程名稱: 密碼技術 任課教師: 學生姓名: 學 號: 實驗項目: 實驗二 DES加密算法 聯系電話: 電子郵件: 完成提交時間: 年 月 日密碼技術實驗報告實驗項目:實驗二,第2題 實現DES對任意文件的加解密實驗要求(內容)實現DES對任意文件的加解密,利用控制臺對所有文件(中英文文本、符號甚至任意的文件)的加解密。加解密形式如下: cipher -e/-d key inputfile outputfile 說明:對于加密來說,輸入文件名就是明

2、文文件,對于解密來說,輸入文件名就是密文文件,注意文件讀取方式和控制文件結束控制臺編程: int main(int argc, char *argv )實驗環境操作系統:win7編譯環境:Microsoft Visual Studio 2010實現功能本次實驗達到了題目的要求: 實現了用DES實現控制臺對任意文件的加解密,用鍵盤接收明文(密文)文件路徑和密鑰,然后再輸入需要保存的密文(明文)文件路徑,然后就可以把加解密后得到的密明文文件保存該路徑下。程序主要采取對數據的位操作的形式,把明密文文件中的內容以字節為單位讀取,每次讀取8個byte共65bits,然后使用標準DES的算法依次對讀取的6

3、4bits明密文進出加解密處理。 主函數的操作也充分體現了程序的可操作性和健壯性,能夠讓用戶自己選擇相應的操作,比如加密、解密以及對程序的一些基本情況說明。但是對文件的路徑的輸入有比較嚴格的格式約束。如:盤符名: 格式錯誤則會導致文件打開失敗,不能進行加解密操作。數據結構 本次實驗的程序較為復雜,涉及對位的操作。實驗過程中用到的主要數據結構為數組和文件型指針,在實驗中我定義了2個文件型指針FILE *fp1,*fp2,其中一個指向明文文件,一個指向密文文件。另外還定義了多個字符數組,如char Plainfpath260聲明字符數組存儲明文文件的文件路徑,char Cipherfpath260

4、聲明字符數組存儲密文文件的文件路徑,char key100聲明字符數組存儲密鑰。對于讀取出來的數據均以unsigned char的類型進行處理。這個程序的實現比較復雜的是對位的操作,主要包括取位值、移位和異或等,在對位的操作還主要用到了memcpy函數對unsigned char類型的字符串進行復制,除此之外沒有采用更多的數據結構。程序流程程序模塊結構圖:開始 start選擇操作解密函數退出程序加密函數 用戶輸入明密文文件路徑和密鑰明(密)文文件是否能打開 退出程序 對打開的文件進行操作,每次取出長度為8個byte的明密文。 將8byte的明密文和密鑰轉換為64bits 明密文進行初始置換IP

5、密鑰進行置換選擇1循環左移和置換選擇2產生子密鑰分成左右兩部分進入F函數 右半部分在F函數里依次進行擴展置換、與子密鑰異或、S盒置換和P置換經F函數處理的與左半部分異或后成右半部分,原先的右半部分作為左半部分32bits對換,然后進行逆初始置換將結果由64bits轉換成8byte,然后寫入文件保存main()函數的調用關系:Encrypt()Decrypt()Explain()Block_Decrypt()Block_Encrypt()L_Shift()R_Shift()BToC()CToB()F_function()函數的接口:void Encrypt(char *Plainfpath,ch

6、ar *Cipherfpath,unsigned char *Keys);/加密函數void Decrypt(char *Cipherfpath,char *Plainfpath,unsigned char *Keys);/解密函數void Block_Encrypt(unsigned char *Plain,unsigned char *Cipher,unsigned char *Key);/分組加密函數void Block_Decrypt(unsigned char *Cipher,unsigned char *Plain,unsigned char *Key);/分組加密函數void C

7、ToB(unsigned char *C_String,unsigned char *B_String);/將字符類型轉換成二進制類型的函數void BToC(unsigned char *B_String,unsigned char *C_String);/將二進制類型轉換成字符類型的函數void L_Shift(unsigned char *PC_Key,int count);/加密中循環左移函數void R_Shift(unsigned char *PC_Key,int count);/解密中循環右移函數void F_function(unsigned char *R_String,un

8、signed char *S_Key);/F函數void Explain();/程序說明函數代碼與代碼分析主要函數的接口、調用與被調用函數、所實現的功能和實現的主要思路: int main(char ch) :Function: 為用戶提供基本操作,調用加密解密函數。 Calls: Encrypt(),Decrypt()和Explain()。Called By: 未被其它函數調用。Input(type) 字符型(char)。 Output(type): 無,只是輸出“”中的字符串。 Return(type): 整型 Others: 無 Bug: 測試尚未發現void Encrypt(char

9、*Plainfpath,char *Cipherfpath,unsigned char *Keys) Function: 實現的功能是:接收明文文件路徑和密鑰,并打開文件,然后根據對文件的 操作依次從文件中以二進制方式讀取字符,并使用DES算法加密,然后將處理過 的二進制字符寫入到密文文件中。 實現的主要思路:首先調用fopen()函數打開文件,對打開的文件進行操作, 調用fseek()函數定位讀寫指針函數fseek ,將文件的讀寫指針移到文件結束位置,調 用ftell()函數返回fp1指向的文件中的讀寫指針當前位置,即文件的長度,再調用 rewind()函數將文件讀寫指針移到文件開始位置。調

10、用fgetc()從fp1所指向的明文 文件中依次以二進制的方式讀取字符,然后調用Block_Encrypt進行加密,并 把結果寫入密文文件保存。此外對于不足8byte的分組將填充*并作標記以便 進行加密。 Calls: Block_Encrypt() Called By: main() Input(type) char類型的數組 Output(type): char類型的數組 Return(type): 無返回值的類型。 Others: 無 Bug: 測試中尚未發現void Decrypt(char *Cipherfpath,char *Plainfpath,unsigned char *Ke

11、ys) Function: 實現的功能是:接收密文文件路徑和密鑰,并打開文件,然后根據對文件的 操作依次從文件中以二進制方式讀取字符,并使用DES算法解密,然后將處理過 的二進制字符寫入到明文文件中。 實現的主要思路:首先調用fopen()函數打開文件,對打開的文件進行操作, 調用fseek()函數定位讀寫指針函數fseek ,將文件的讀寫指針移到文件結束位置,調 用ftell()函數返回fp1指向的文件中的讀寫指針當前位置,即文件的長度,再調用 rewind()函數將文件讀寫指針移到文件開始位置。調用fgetc()從fp1所指向的密文 文件中依次以二進制的方式讀取字符,然后調用Block_D

12、ecrypt()進行解密,并 把結果寫入明文文件保存。此外對于之前有填充標記的分組在解密后應該刪除 填充進去的*。 Calls: Block_Decrypt() Called By: main() Input(type) char類型的數組 Output(type): char類型的數組 Return(type): 無返回值的類型。 Others: 無 Bug: 測試中尚未發現void Block_Encrypt(unsigned char *Plain,unsigned char *Cipher,unsigned char *Key)Function: 實現的功能是:接收8個byte的明文,

13、并使用DES算法加密,得到8個byte 的密文。 實現的主要思路:首先調用CToB()將二進制明文字符與密鑰字符轉換成 64bits,再依次對64bit的明文進行初始置換、16輪F_function()函數的處理、32bit 對換和逆初始置換得到64bit密文。在F函數中使用的子密鑰是將輸入的密鑰進 行置換選擇1的處理然后在每輪加密中再對密鑰進行循環左移和置換選擇2 的處 理后得到子密鑰。最后調用BToC()將64bit轉換成8個byte的密文。 Calls: CToB(),F_function(), L_Shift和BToC()。 Called By: Encrypt() Input(typ

14、e) unsigned char類型的數組 Output(type): unsigned char類型的數組 Return(type): 無返回值的類型。 Others: 無 Bug: 測試中尚未發現void Block_Decrypt(unsigned char *Cipher,unsigned char *Plain,unsigned char *Key); Function: 實現的功能是:接收8個byte的密文,并使用DES算法加密,得到8個byte 的明文。 實現的主要思路:首先調用CToB()將二進制密文字符與密鑰字符轉換成 64bits,再依次對64bit的密文進行初始置換、16

15、輪F_function()函數的處理、32bit 對換和逆初始置換得到64bit明文。在F函數中使用的子密鑰是將輸入的密鑰進 行置換選擇1的處理然后在每輪解密中再對密鑰進行循環右移和置換選擇2 的處 理后得到子密鑰。最后調用BToC()將64bit轉換成8個byte的明文。 Calls: CToB(),F_function(), R_Shift和BToC()。 Called By: Decrypt() Input(type) unsigned char類型的數組 Output(type): unsigned char類型的數組 Return(type): 無返回值的類型。 Others: 無

16、Bug: 測試中尚未發現void CToB(unsigned char *C_String,unsigned char *B_String)Function: 將字符(8byte)轉換成二進制位值(64bit) 實現的主要思路:利用表達式*(B_String+(8*i+7-j)=(C_Stringij)&1 對C_Stringi中的字符進行移位操作取出每個位的值賦值給B_String。 Calls: 無Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char類型的數組 Output(type): unsigned cha

17、r類型的數組 Return(type): 無 Others: 無 Bug: 測試尚未發現void BToC(unsigned char *B_String,unsigned char *C_String)Function: 將二進制位值(64bit)轉換成字符(8byte) 實現的主要思路:利用表達式*(C_String+i)=*(C_String+i)|(*(B_String+ (8*i+j)(7-j)將B_String中的每8個值進行移位的等操作構成C_String中的 一個值。 Calls: 無Called By: Block_Encrypt和Block_Decrypt()Input(t

18、ype) unsigned char類型的數組 Output(type): unsigned char類型的數組 Return(type): 無 Others: 無 Bug: 測試尚未發現void L_Shift(unsigned char *PC_Key,int count)Function: 將56bit的密鑰分兩部分左移count位 實現的主要思路:利用memcpy()對密鑰進行復制操作,具體步驟如下: memcpy(temp,PC_Key,count); memcpy(PC_Key,PC_Key+count,28-count); memcpy(PC_Key+(28-count),tem

19、p,count);/前28位左移count位 memcpy(temp,PC_Key+28,count); memcpy(PC_Key+28,PC_Key+(28+count),28-count); memcpy(PC_Key+(56-count),temp,count);/后28位左移count位 Calls: 無Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char類型的數組和int型的值 Output(type): unsigned char類型的數組 Return(type): 無 Others: 無 Bug:

20、測試尚未發現void R_Shift(unsigned char *PC_Key,int count)Function: 將56bit的密鑰分兩部分右移count位 實現的主要思路:利用memcpy()對密鑰進行復制操作,具體步驟如下: memcpy(temp,PC_Key+(28-count),count); memcpy(PC_Key+count,PC_Key,28-count); memcpy(PC_Key,temp,count);/前28位右移count位 memcpy(temp,PC_Key+(56-count),count); memcpy(PC_Key+(28+count),PC

21、_Key+28,28-count); memcpy(PC_Key+28,temp,count);/后28位右移count位 Calls: 無Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char類型的數組和int型的值 Output(type): unsigned char類型的數組 Return(type): 無 Others: 無 Bug: 測試尚未發現void F_function(unsigned char *R_String,unsigned char *S_Key)Function: 對明密文的右半部分F函

22、數進行處理,包括擴展置換、與子密鑰異或、S 盒置換和P置換 實現的主要思路:擴展置換利用E表將32位擴展到48位,然后與48位的子 密鑰進行異或;S盒置換將48位的明密文分成8個6位塊分別對應8個S盒替換 表,然后每個6位塊中的第1和6位作為行號,其余的作為列號,在S盒替換表 中找到對應的值,這樣將48位壓縮到32位,然后再根據置換函數P進行置換操 作。 Calls: 無Called By: Block_Encrypt和Block_Decrypt()Input(type) unsigned char類型的數組 Output(type): unsigned char類型的數組 Return(type):

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論