摘要:DES算法為密碼體制中的對稱密碼體制,又被稱為美國數(shù)據(jù)加密標(biāo)準(zhǔn),是1972年美國IBM公司研制的對稱密碼體制加密算法。明文按64位進(jìn)行分組,密鑰長64位,密鑰事實(shí)上是56位參與DES運(yùn)算。它將64位輸入經(jīng)過一系列變換得到64位的輸出。下面我們來看看c語言實(shí)現(xiàn)des加密算法詳細(xì)過程。
一、DES加密機(jī)制
圖1表明了DES加密的整個機(jī)制。對任意加密方案,總有兩個輸入:明文和密鑰。DES的明文長為64位,密鑰長為56位。
從圖1的左半部分,可見明文的處理經(jīng)過三個階段。首先,64位的明文經(jīng)過初始置換()而重新排列。然后進(jìn)行16輪相同函數(shù)的作用(又稱迭代 ),每輪都進(jìn)行置換和替代的操作。這16輪迭代操作可以視為一個函數(shù),其輸入包括64位明文和16個輪密鑰(圖1中的K1等,詳細(xì)見下文),其輸出為64位比特流(即為最后一輪迭代輸出)。該輸出左半部分(左32位)和右半部分(右32位)互換(即圖中32位互換)產(chǎn)生預(yù)輸出。最后該預(yù)輸出再通過一個初始置換()互逆的置換(,又稱逆初始置換 )的作用產(chǎn)生64位的密文。
圖1的右半部分給出了使用56位密鑰的過程。密鑰經(jīng)過初始置換(即圖中置換選擇1)后,經(jīng)過循環(huán)左移和置換(即圖中 置換選擇2 )分別得到子密鑰用于每輪的迭代(又稱輪密鑰 )。每輪的置換函數(shù)(置換選擇2)都一樣,但是由于密鑰的循環(huán)位移使得輪密鑰互不相同。
圖2給出了一輪變換的內(nèi)部結(jié)構(gòu)。首先,左半部分,64位中間數(shù)據(jù)的左右兩部分作為獨(dú)立的32位數(shù)據(jù),分別記為L和R。在經(jīng)典的Feistel密碼中,每輪變換的整個過程可以寫為下面公式:
?
輪密鑰Ki長度為48位,R是32位。首先將R拓展成48位,其中有16位是重復(fù)的。這48位與Ki異或,所得結(jié)果再用一個代替函數(shù)作用產(chǎn)生32位輸出,再用一個置換表置換后輸出。
二、C語言實(shí)現(xiàn)DES加解密算法
計算程序執(zhí)行10萬次需要的時間:
總共需要175秒
加解密一次的時間小于:0.00175秒
純計算加解密的時間會更短
去除IO操作后的時間
也就是說加解密一次的時間為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長度 Num移動位數(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個字符數(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]!=‘RM新时代网站-首页