摘要:DES算法為密碼體制中的對稱密碼體制,又被稱為美國數據加密標準,是1972年美國IBM公司研制的對稱密碼體制加密算法。明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算。它將64位輸入經過一系列變換得到64位的輸出。下面我們來看看c語言實現des加密算法詳細過程。
一、DES加密機制
圖1表明了DES加密的整個機制。對任意加密方案,總有兩個輸入:明文和密鑰。DES的明文長為64位,密鑰長為56位。
從圖1的左半部分,可見明文的處理經過三個階段。首先,64位的明文經過初始置換()而重新排列。然后進行16輪相同函數的作用(又稱迭代 ),每輪都進行置換和替代的操作。這16輪迭代操作可以視為一個函數,其輸入包括64位明文和16個輪密鑰(圖1中的K1等,詳細見下文),其輸出為64位比特流(即為最后一輪迭代輸出)。該輸出左半部分(左32位)和右半部分(右32位)互換(即圖中32位互換)產生預輸出。最后該預輸出再通過一個初始置換()互逆的置換(,又稱逆初始置換 )的作用產生64位的密文。
圖1的右半部分給出了使用56位密鑰的過程。密鑰經過初始置換(即圖中置換選擇1)后,經過循環左移和置換(即圖中 置換選擇2 )分別得到子密鑰用于每輪的迭代(又稱輪密鑰 )。每輪的置換函數(置換選擇2)都一樣,但是由于密鑰的循環位移使得輪密鑰互不相同。
圖2給出了一輪變換的內部結構。首先,左半部分,64位中間數據的左右兩部分作為獨立的32位數據,分別記為L和R。在經典的Feistel密碼中,每輪變換的整個過程可以寫為下面公式:
?
輪密鑰Ki長度為48位,R是32位。首先將R拓展成48位,其中有16位是重復的。這48位與Ki異或,所得結果再用一個代替函數作用產生32位輸出,再用一個置換表置換后輸出。
二、C語言實現DES加解密算法
計算程序執行10萬次需要的時間:
總共需要175秒
加解密一次的時間小于:0.00175秒
純計算加解密的時間會更短
去除IO操作后的時間
也就是說加解密一次的時間為0.07毫秒
main2.c
驗證算法的正確性和雪崩現象
1.
明文:12345678
密鑰:12345678
密文:6E15D7EC4F9D4A06
2.修改一位明文
明文:12345679
密鑰:12345678
密文:48598F155CB7C5C9
3.修改一位密鑰
明文:12345678
密鑰:12345679
密文:02AB45B02D446190
-main.c
1 /*-------------------------------------------------------
2 Data Encryption Standard 56位密鑰加密64位數據 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); // 數組復制
10
11 void ByteToBit(bool *DatOut,char *DatIn,int Num); // 字節到位
12 void BitToByte(char *DatOut,bool *DatIn,int Num); // 位到字節
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); // 位表置換函數
18 void LoopMove(bool *DatIn,int Len,int Num); // 循環左移 Len長度 Num移動位數
19 void Xor(bool *DatA,bool *DatB,int Num); // 異或函數
20
21 void S_Change(bool DatOut[32],bool DatIn[48]); // S盒變換
22 void F_Change(bool DatIn[32],bool DatKi[48]); // F函數
23
24 void SetKey(char KeyIn[8]); // 設置密鑰
25 void PlayDes(char MesOut[8],char MesIn[8]); // 執行DES加密
26 void KickDes(char MesOut[8],char MesIn[8]); // 執行DES解密
27
28
29
30 int main()
31 {
32 int i=0;
33 char MesHex[16]={0}; // 16個字符數組用于存放 64位16進制的密文
34 char MyKey[8]={0}; // 初始密鑰 8字節*8
35 char YourKey[8]={0}; // 輸入的解密密鑰 8字節*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]!=‘ 主站蜘蛛池模板: 国产特黄一级一片免费 | 成人狠狠色综合 | 最新在线网址 | 国产精品视频久久久久 | 免费看曰批女人爽的视频网址 | 欧美黄色片一级 | 日本不卡免费新一区二区三区 | 性xxxx奶大欧美高清 | 97久草| 日韩一级欧美一级一级国产 | 天堂8中文在线bt | 狠狠丁香激情久久综合 | 天天狠天天透天干天天怕处 | 国产农村一一级特黄毛片 | 日本在线亚洲 | 欧美色影视 | 色婷婷色综合缴情在线 | 最新激情网| 国产精品特黄毛片 | 丁香婷婷久久大综合 | 一区二区三区伦理 | 色婷婷亚洲精品综合影院 | 欧美黄色大全 | 手机在线观看毛片 | 亚洲精品456人成在线 | 藏经阁在线观看 | 潘金莲国产三级视频在线 | 久久精品乱子伦免费 | 91桃色国产线观看免费 | 午夜影院免费视频 | 久久老色鬼天天综合网观看 | 亚洲一本高清 | 欧美一卡2卡三卡4卡5卡免费观看 | 中文字幕在线第一页 | 天天操天天操天天操天天操 | 天天操天天操 | 亚洲欧美色鬼久久综合 | 手机在线观看视频你懂的 | 欧美aaaav免费大片 | 亚洲九九香蕉 | 国产特黄一级一片免费 |