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