c语言des算法实验报告,C语言实现DES算法实验报告解析.doc
C語(yǔ)言實(shí)現(xiàn)DES算法實(shí)驗(yàn)報(bào)告解析
xx工程大學(xué)
實(shí)驗(yàn)報(bào)告
(2015-2016學(xué)年第一學(xué)期)
報(bào)告題目: DES加密算法
課程名稱: 密碼學(xué)B
任課教員:
專 業(yè):
學(xué) 號(hào):
姓 名:
二O一六年一月十八日
一、課程概述
目的:培養(yǎng)學(xué)員的編程能力,理解算法原理。
要求:給出DES算法的軟件實(shí)現(xiàn),測(cè)試DES的加密速度。
二、設(shè)計(jì)思路
使用C++語(yǔ)言進(jìn)行編程,簡(jiǎn)化了輸入輸出語(yǔ)句。預(yù)處理時(shí)加入了iostream包。使用了std名字空間。
加密時(shí)程序輸入的明文是8個(gè)ascii碼,生成一個(gè)16個(gè)16進(jìn)制數(shù)的密文。
脫密時(shí)程序輸入的密文是16個(gè)16進(jìn)制數(shù),生成一個(gè)8個(gè)ascii碼的明文。
加脫密所用密鑰均由16個(gè)16進(jìn)制數(shù)組成。
其中16進(jìn)制數(shù)全部使用大寫(xiě)字母。
程序中大量使用了的布爾數(shù)組,一個(gè)bool型變量只占用一位存儲(chǔ)空間,比int型、char型變量要小的多。這降低了程序的空間復(fù)雜度。
三、采取的方案
本程序是將一個(gè)由8個(gè)ascii碼組成的明文分組加密,生成一個(gè)由16個(gè)16進(jìn)制數(shù)組成的密文。或?qū)⒁粋€(gè)由16個(gè)16進(jìn)制數(shù)組成的密文進(jìn)行脫密,生成一個(gè)由8個(gè)ascii碼組成的明文。所用密鑰由16個(gè)16進(jìn)制數(shù)組成。
本實(shí)驗(yàn)按照輸入數(shù)據(jù)及初始置換、16圈迭代、子密鑰生成和逆初始置換及輸出數(shù)據(jù)四個(gè)步驟實(shí)現(xiàn)加密算法設(shè)計(jì)。
1、輸入數(shù)據(jù)及初始置換
本程序首先會(huì)提示用戶輸入加密脫密識(shí)別碼,加密輸入1,脫密輸入0,將此識(shí)別碼存入整形變量o。根據(jù)o的不同值,提示用戶輸入8個(gè)字符(加密)或16個(gè)16進(jìn)制數(shù)(脫密)。輸入的明文或密文轉(zhuǎn)化為二進(jìn)制數(shù)后儲(chǔ)存到布爾型數(shù)組m[65]中。
初始置換通過(guò)函數(shù)IP完成,函數(shù)輸入為原始明文m,函數(shù)將輸出結(jié)果保存到布爾型數(shù)組mip[65]中。函數(shù)思想為查表,含有一個(gè)整形變量數(shù)組ip[64],保存初始變換表IP。將mip的第i位賦值為m的第ip[i]位。
2、子密鑰生成
輸入16個(gè)16進(jìn)制數(shù)的密鑰后,將密鑰保存在一個(gè)16位字符數(shù)組c中,通過(guò)ToEr函數(shù)將之變?yōu)槎M(jìn)制數(shù)。ToEr函數(shù)輸入為字符數(shù)組,通過(guò)switch語(yǔ)句逐個(gè)檢查字符數(shù)組的每一位,將對(duì)應(yīng)的四位二進(jìn)制數(shù)存在64位布爾數(shù)組k中。
64 bit密鑰去掉每個(gè)字節(jié)的最高位得到56 bit密鑰輸入,通過(guò)置換選擇1變換得到和各28 bit,通過(guò)Zhihuan_1函數(shù)實(shí)現(xiàn)置換選擇一。Zhihuan_1函數(shù)輸入為二進(jìn)制密鑰數(shù)組k[64],輸出為C0和D0,將C0、D0分別儲(chǔ)存在28位布爾數(shù)組C、D中。函數(shù)采用查表方式生成C0和D0。
根據(jù)迭代的輪數(shù)確定C和D移位循環(huán)的位數(shù),主程序中利用一個(gè)16位整形數(shù)組來(lái)存放每一次循環(huán)左移的位數(shù)。循環(huán)左移通過(guò)XunHuan函數(shù)實(shí)現(xiàn),函數(shù)輸入為循環(huán)位數(shù)和長(zhǎng)度為28的布爾數(shù)組(C或者D),函數(shù)運(yùn)行一次只能改變一個(gè)布爾數(shù)組的值。為了減低編程復(fù)雜度,程序使用串行方法,分兩次進(jìn)行C、D的移位。
每完成一次C和D的移位,進(jìn)行一次置換選擇二。置換選擇二利用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時(shí))需要將圈子密鑰交換,此時(shí)可利用kk[0][49]充當(dāng)中間變量,無(wú)需定義新的變量減少了系統(tǒng)開(kāi)銷。
圖1 圈子密鑰生成算法
3、16圈迭代
DES的每一圈迭代采用的是Feistel模型,先將初始置換后的明文mip數(shù)組分成L和R兩部分,先將R的內(nèi)容放在等長(zhǎng)的布爾數(shù)組T中,最后時(shí)需要將L的值賦為T。之后進(jìn)入F函數(shù),F函數(shù)原理如圖2。
圖2 F函數(shù)原理圖
程序中的F函數(shù)輸入有初始置換結(jié)果的右半部分R、圈子密鑰kk、迭代圈數(shù)i。輸出保存在R中。先將輸入的R通過(guò)查表的方法進(jìn)行E拓展,結(jié)果保存在48位布爾數(shù)組a中。再將a與圈子密鑰k按位模二加。結(jié)果保存在a中。
接下來(lái)將a分成8組,分別進(jìn)入8個(gè)S盒。用for控制循環(huán)8次,每次操作選用6位二進(jìn)制代碼的開(kāi)頭一位和最后一位轉(zhuǎn)化成十進(jìn)制數(shù),控制S盒的行數(shù),再將6位二進(jìn)制代碼的中間四位轉(zhuǎn)化成十進(jìn)制數(shù),控制S盒的列數(shù)。進(jìn)入第幾個(gè)S盒有迭代圈數(shù)i確定。取到S盒中的十進(jìn)制數(shù)后,將它轉(zhuǎn)化成二進(jìn)制數(shù),儲(chǔ)存在32位布爾數(shù)組T中,在使用查表法完成P
總結(jié)
以上是生活随笔為你收集整理的c语言des算法实验报告,C语言实现DES算法实验报告解析.doc的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TI基于MSP430F67641的电能表
- 下一篇: 非对称繁简字对照表