电子常识
摘要:DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算。它将64位输入经过一系列变换得到64位的输出。下面我们来看看c语言实现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位输出,再用一个置换表置换后输出。
计算程序执行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]!=‘