摘要:DES算法為密碼體制中的對(duì)稱(chēng)密碼體制,又被稱(chēng)為美國(guó)數(shù)據(jù)加密標(biāo)準(zhǔn),是1972年美國(guó)IBM公司研制的對(duì)稱(chēng)密碼體制加密算法。明文按64位進(jìn)行分組,密鑰長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算。它將64位輸入經(jīng)過(guò)一系列變換得到64位的輸出。下面我們來(lái)看看c語(yǔ)言實(shí)現(xiàn)des加密算法詳細(xì)過(guò)程。
一、DES加密機(jī)制
圖1表明了DES加密的整個(gè)機(jī)制。對(duì)任意加密方案,總有兩個(gè)輸入:明文和密鑰。DES的明文長(zhǎng)為64位,密鑰長(zhǎng)為56位。
從圖1的左半部分,可見(jiàn)明文的處理經(jīng)過(guò)三個(gè)階段。首先,64位的明文經(jīng)過(guò)初始置換()而重新排列。然后進(jìn)行16輪相同函數(shù)的作用(又稱(chēng)迭代 ),每輪都進(jìn)行置換和替代的操作。這16輪迭代操作可以視為一個(gè)函數(shù),其輸入包括64位明文和16個(gè)輪密鑰(圖1中的K1等,詳細(xì)見(jiàn)下文),其輸出為64位比特流(即為最后一輪迭代輸出)。該輸出左半部分(左32位)和右半部分(右32位)互換(即圖中32位互換)產(chǎn)生預(yù)輸出。最后該預(yù)輸出再通過(guò)一個(gè)初始置換(
)互逆的置換(
,又稱(chēng)逆初始置換 )的作用產(chǎn)生64位的密文。
圖1的右半部分給出了使用56位密鑰的過(guò)程。密鑰經(jīng)過(guò)初始置換(即圖中置換選擇1)后,經(jīng)過(guò)循環(huán)左移和置換(即圖中 置換選擇2 )分別得到子密鑰用于每輪的迭代(又稱(chēng)輪密鑰 )。每輪的置換函數(shù)(置換選擇2)都一樣,但是由于密鑰的循環(huán)位移使得輪密鑰互不相同。
圖2給出了一輪變換的內(nèi)部結(jié)構(gòu)。首先,左半部分,64位中間數(shù)據(jù)的左右兩部分作為獨(dú)立的32位數(shù)據(jù),分別記為L(zhǎng)和R。在經(jīng)典的Feistel密碼中,每輪變換的整個(gè)過(guò)程可以寫(xiě)為下面公式:
?
輪密鑰Ki長(zhǎng)度為48位,R是32位。首先將R拓展成48位,其中有16位是重復(fù)的。這48位與Ki異或,所得結(jié)果再用一個(gè)代替函數(shù)作用產(chǎn)生32位輸出,再用一個(gè)置換表置換后輸出。
二、C語(yǔ)言實(shí)現(xiàn)DES加解密算法
計(jì)算程序執(zhí)行10萬(wàn)次需要的時(shí)間:
總共需要175秒
加解密一次的時(shí)間小于:0.00175秒
純計(jì)算加解密的時(shí)間會(huì)更短
去除IO操作后的時(shí)間
也就是說(shuō)加解密一次的時(shí)間為0.07毫秒
main2.c
驗(yàn)證算法的正確性和雪崩現(xiàn)象
1.
明文:12345678
密鑰:12345678
密文:6E15D7EC4F9D4A06
2.修改一位明文
明文:12345679
密鑰:12345678
密文:48598F155CB7C5C9
3.修改一位密鑰
明文:12345678
密鑰:12345679
密文:02AB45B02D446190
-main.c
1 /*-------------------------------------------------------
2 Data Encryption Standard 56位密鑰加密64位數(shù)據(jù) 3 --------------------------------------------------------*/
4 #include 《stdlib.h》
5 #include 《stdio.h》
6 #include “bool.h” // 位處理
7 #include “tables.h”
8
9 void BitsCopy(bool *DatOut,bool *DatIn,int Len); // 數(shù)組復(fù)制
10
11 void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字節(jié)到位
12 void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字節(jié)
13
14 void BitToHex(char *DatOut,bool *DatIn,int Num); // 二進(jìn)制到十六進(jìn)制 64位 to 4*16字符
15 void HexToBit(bool *DatOut,char *DatIn,int Num); // 十六進(jìn)制到二進(jìn)制
16
17 void TablePermute(bool *DatOut,bool *DatIn,const char *Table,int Num); // 位表置換函數(shù)
18 void LoopMove(bool *DatIn,int Len,int Num); // 循環(huán)左移 Len長(zhǎng)度 Num移動(dòng)位數(shù)
19 void Xor(bool *DatA,bool *DatB,int Num); // 異或函數(shù)
20
21 void S_Change(bool DatOut[32],bool DatIn[48]); // S盒變換
22 void F_Change(bool DatIn[32],bool DatKi[48]); // F函數(shù)
23
24 void SetKey(char KeyIn[8]); // 設(shè)置密鑰
25 void PlayDes(char MesOut[8],char MesIn[8]); // 執(zhí)行DES加密
26 void KickDes(char MesOut[8],char MesIn[8]); // 執(zhí)行DES解密
27
28
29
30 int main()
31 {
32 int i=0;
33 char MesHex[16]={0}; // 16個(gè)字符數(shù)組用于存放 64位16進(jìn)制的密文
34 char MyKey[8]={0}; // 初始密鑰 8字節(jié)*8
35 char YourKey[8]={0}; // 輸入的解密密鑰 8字節(jié)*8
36 char MyMessage[8]={0}; // 初始明文
37
38 /*-----------------------------------------------*/
39
40 printf(“Welcome! Please input your Message(64 bit): ”);
41 gets(MyMessage); // 明文
42 printf(“Please input your Secret Key: ”);
43 gets(MyKey); // 密鑰
44
45 while(MyKey[i]!=‘ 主站蜘蛛池模板: 色多多污网站在线观看 | 黄色一级片毛片 | 免费人成黄页在线观看1024 | 日本在线不卡免费 | 都市激情综合网 | 久久人人做人人玩人精品 | 欧美在线高清视频 | 色女仆影院 | 666夜色666夜色国产免费看 | 国产在线观看黄 | 国产三级网站在线观看 | 亚洲mm8成为人影院 亚洲qingse中文在线 | 色人阁婷婷| 免费h视频 | 香蕉网影院在线观看免费 | 天天做天天玩天天爽天天 | 亚洲乱淫| 日韩三级一区 | 国产成人啪精品午夜在线观看 | 国产精品资源手机在线播放 | 国产激烈床戏无遮挡在线观看 | 久久xx| 久久青草免费免费91线频观看 | 4438x全国最大色 | 欧美美女一区二区三区 | ts 人妖 另类 在线 | 黄网站视频在线观看 | 二区三区在线观看 | 日本免费一区视频 | 婷婷综合亚洲 | 欧美精品黑人性xxxx | 天天干天天草天天 | 一区二区三区国模大胆 | 精品乩伦视频 | 中文在线免费看影视 | 高清一级做a爱视频免费 | 亚洲网站在线观看 | 欧美成人天天综合天天在线 | 天堂网站www天堂资源在线 | 午夜久久久久久网站 | 天天噜噜色|