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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、ype) unsigned char類型的數(shù)組 Output(type): unsigned char類型的數(shù)組 Return(type): 無 Others: 無 Bug: 測試尚未發(fā)現(xiàn)void L_Shift(unsigned char *PC_Key,int count)Function: 將56bit的密鑰分兩部分左移count位 實現(xiàn)的主要思路:利用memcpy()對密鑰進行復(fù)制操作,具體步驟如下: 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類型的數(shù)組和int型的值 Output(type): unsigned char類型的數(shù)組 Return(type): 無 Others: 無 Bug:

20、測試尚未發(fā)現(xiàn)void R_Shift(unsigned char *PC_Key,int count)Function: 將56bit的密鑰分兩部分右移count位 實現(xiàn)的主要思路:利用memcpy()對密鑰進行復(fù)制操作,具體步驟如下: 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類型的數(shù)組和int型的值 Output(type): unsigned char類型的數(shù)組 Return(type): 無 Others: 無 Bug: 測試尚未發(fā)現(xiàn)void F_function(unsigned char *R_String,unsigned char *S_Key)Function: 對明密文的右半部分F函

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

溫馨提示

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

評論

0/150

提交評論