摘要:DES算法為密碼體制中的對稱密碼體制,又被稱為美國數(shù)據(jù)加密標準,是1972年美國IBM公司研制的對稱密碼體制加密算法。明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算。它將64位輸入經過一系列變換得到64位的輸出。下面我們來看看c語言實現(xiàn)des加密算法詳細過程。
一、DES加密機制
圖1表明了DES加密的整個機制。對任意加密方案,總有兩個輸入:明文和密鑰。DES的明文長為64位,密鑰長為56位。
從圖1的左半部分,可見明文的處理經過三個階段。首先,64位的明文經過初始置換()而重新排列。然后進行16輪相同函數(shù)的作用(又稱迭代 ),每輪都進行置換和替代的操作。這16輪迭代操作可以視為一個函數(shù),其輸入包括64位明文和16個輪密鑰(圖1中的K1等,詳細見下文),其輸出為64位比特流(即為最后一輪迭代輸出)。該輸出左半部分(左32位)和右半部分(右32位)互換(即圖中32位互換)產生預輸出。最后該預輸出再通過一個初始置換(
)互逆的置換(
,又稱逆初始置換 )的作用產生64位的密文。
圖1的右半部分給出了使用56位密鑰的過程。密鑰經過初始置換(即圖中置換選擇1)后,經過循環(huán)左移和置換(即圖中 置換選擇2 )分別得到子密鑰用于每輪的迭代(又稱輪密鑰 )。每輪的置換函數(shù)(置換選擇2)都一樣,但是由于密鑰的循環(huán)位移使得輪密鑰互不相同。
圖2給出了一輪變換的內部結構。首先,左半部分,64位中間數(shù)據(jù)的左右兩部分作為獨立的32位數(shù)據(jù),分別記為L和R。在經典的Feistel密碼中,每輪變換的整個過程可以寫為下面公式:
?
輪密鑰Ki長度為48位,R是32位。首先將R拓展成48位,其中有16位是重復的。這48位與Ki異或,所得結果再用一個代替函數(shù)作用產生32位輸出,再用一個置換表置換后輸出。
二、C語言實現(xiàn)DES加解密算法
計算程序執(zhí)行10萬次需要的時間:
總共需要175秒
加解密一次的時間小于:0.00175秒
純計算加解密的時間會更短
去除IO操作后的時間
也就是說加解密一次的時間為0.07毫秒
main2.c
驗證算法的正確性和雪崩現(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ù)組復制
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); // 二進制到十六進制 64位 to 4*16字符
15 void HexToBit(bool *DatOut,char *DatIn,int Num); // 十六進制到二進制
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]); // 設置密鑰
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進制的密文
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]!=‘ 主站蜘蛛池模板: 昌邑市| 景东| 伊金霍洛旗| 和平县| 樟树市| 建德市| 南投县| 塔城市| 长顺县| 福建省| 赣州市| 垣曲县| 丹凤县| 榕江县| 五常市| 龙里县| 榆社县| 惠来县| 溧水县| 马关县| 宝山区| 武功县| 宿州市| 太白县| 定南县| 北碚区| 绥中县| 四川省| 乌什县| 郯城县| 中卫市| 平远县| 天等县| 三台县| 镇康县| 长宁区| 永修县| 江口县| 泾源县| 江华| 垦利县|