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