資源描述:
《c語言實現(xiàn)des算法des加密算法實驗報告》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在學術論文-天天文庫。
1、xx工程大學實驗報告(2015-2016學年第一學期)報告題目:DES加密算法課程名稱:密碼學B任課教員:專業(yè):學號:姓名:二O一六年一月十八日一、課程概述目的:培養(yǎng)學員的編程能力,理解算法原理。要求:給出DES算法的軟件實現(xiàn),測試DES的加密速度。二、設計思路使用C++語言進行編程,簡化了輸入輸出語句。預處理時加入了iostream包。使用了std名字空間。加密時程序輸入的明文是8個ascii碼,生成一個16個16進制數(shù)的密文。脫密時程序輸入的密文是16個16進制數(shù),生成一個8個ascii碼的明文。加脫密所用密鑰均由16個16進制數(shù)組成。其中16進制數(shù)全部使用大寫字母。
2、程序中大量使用了的布爾數(shù)組,一個bool型變量只占用一位存儲空間,比int型、char型變量要小的多。這降低了程序的空間復雜度。三、采取的方案本程序是將一個由8個ascii碼組成的明文分組加密,生成一個由16個16進制數(shù)組成的密文?;?qū)⒁粋€由16個16進制數(shù)組成的密文進行脫密,生成一個由8個ascii碼組成的明文。所用密鑰由16個16進制數(shù)組成。本實驗按照輸入數(shù)據(jù)及初始置換、16圈迭代、子密鑰生成和逆初始置換及輸出數(shù)據(jù)四個步驟實現(xiàn)加密算法設計。1、輸入數(shù)據(jù)及初始置換本程序首先會提示用戶輸入加密脫密識別碼,加密輸入1,脫密輸入0,將此識別碼存入整形變量o。根據(jù)o的不同值,提
3、示用戶輸入8個字符(加密)或16個16進制數(shù)(脫密)。輸入的明文或密文轉(zhuǎn)化為二進制數(shù)后儲存到布爾型數(shù)組m[65]中。初始置換通過函數(shù)IP完成,函數(shù)輸入為原始明文m,函數(shù)將輸出結果保存到布爾型數(shù)組mip[65]中。函數(shù)思想為查表,含有一個整形變量數(shù)組ip[64],保存初始變換表IP。將mip的第i位賦值為m的第ip[i]位。2、子密鑰生成輸入16個16進制數(shù)的密鑰后,將密鑰保存在一個16位字符數(shù)組c中,通過ToEr函數(shù)將之變?yōu)槎M制數(shù)。ToEr函數(shù)輸入為字符數(shù)組,通過switch語句逐個檢查字符數(shù)組的每一位,將對應的四位二進制數(shù)存在64位布爾數(shù)組k中。64bit密鑰去掉每個
4、字節(jié)的最高位得到56bit密鑰輸入,通過置換選擇1變換得到和各28bit,通過Zhihuan_1函數(shù)實現(xiàn)置換選擇一。Zhihuan_1函數(shù)輸入為二進制密鑰數(shù)組k[64],輸出為C0和D0,將C0、D0分別儲存在28位布爾數(shù)組C、D中。函數(shù)采用查表方式生成C0和D0。根據(jù)迭代的輪數(shù)確定C和D移位循環(huán)的位數(shù),主程序中利用一個16位整形數(shù)組來存放每一次循環(huán)左移的位數(shù)。循環(huán)左移通過XunHuan函數(shù)實現(xiàn),函數(shù)輸入為循環(huán)位數(shù)和長度為28的布爾數(shù)組(C或者D),函數(shù)運行一次只能改變一個布爾數(shù)組的值。為了減低編程復雜度,程序使用串行方法,分兩次進行C、D的移位。每完成一次C和D的移位,
5、進行一次置換選擇二。置換選擇二利用zhihuan_2函數(shù)完成。思想和Zhihuan_1函數(shù)類似。zhihuan_2函數(shù)輸入為移位后的C、D,zhihuan_2函數(shù)將圈子密鑰存放在16*48的二維布爾數(shù)組kk[17][49]中。kk[i][48]表示第i圈的圈子密鑰。原理圖如圖1所示。脫密(o=0時)需要將圈子密鑰交換,此時可利用kk[0][49]充當中間變量,無需定義新的變量減少了系統(tǒng)開銷。圖1圈子密鑰生成算法3、16圈迭代DES的每一圈迭代采用的是Feistel模型,先將初始置換后的明文mip數(shù)組分成L和R兩部分,先將R的內(nèi)容放在等長的布爾數(shù)組T中,最后時需要將L的值賦
6、為T。之后進入F函數(shù),F(xiàn)函數(shù)原理如圖2。圖2F函數(shù)原理圖程序中的F函數(shù)輸入有初始置換結果的右半部分R、圈子密鑰kk、迭代圈數(shù)i。輸出保存在R中。先將輸入的R通過查表的方法進行E拓展,結果保存在48位布爾數(shù)組a中。再將a與圈子密鑰k按位模二加。結果保存在a中。接下來將a分成8組,分別進入8個S盒。用for控制循環(huán)8次,每次操作選用6位二進制代碼的開頭一位和最后一位轉(zhuǎn)化成十進制數(shù),控制S盒的行數(shù),再將6位二進制代碼的中間四位轉(zhuǎn)化成十進制數(shù),控制S盒的列數(shù)。進入第幾個S盒有迭代圈數(shù)i確定。取到S盒中的十進制數(shù)后,將它轉(zhuǎn)化成二進制數(shù),儲存在32位布爾數(shù)組T中,在使用查表法完成P盒
7、置換,最終結果保存在R中。最后將L與R按位模二加,得到新的R,完成一次迭代。4、逆初始置換16次迭代后,先將L16和R16連接起來,保存到64位布爾數(shù)組m中,m之前用于保存明文,這樣減小了程序占用的空間。另外,為了保證加脫密算法的一致性,迭代時最后一圈不需要交換L與R,但程序中為了簡化編程復雜度,在迭代時仍然交換了L與R。所以在連接時需要再次交換L與R。所以m的高32位應儲存R,低32位應儲存L。逆初始置換原理同初始置換步驟,不再贅述。四、取得的成果利用密鑰8FBCA對明文加密,密文為6B217C871EAE79D2H結果如圖