DES算法实验报告

DES算法实验报告

姓 名:

学 号:

课程名称:计算机安全技术指导教师:王景中

王超 09101020107 1

目录

DES算法实验报告 .......................................................................................................................... 1

目录 .................................................................................................................................................. 2

一、 DES算法简介 .................................................................................................................. 1

二、 DES算法原理 .................................................................................................................. 1

(一) 加密 ............................................................................................................................... 1

(二) 子密钥Ki(48bit)的生成算法 ....................................................................................... 4

三、 流程图 ............................................................................................................................... 5

(一) 加密流程图 ................................................................................................................... 5

(二) 子密钥生成流程图 ....................................................................................................... 6

(三) 解密流程图 ................................................................................................................... 6

(四) 功能流程图 ................................................................................................................... 7

四、 实验说明 ........................................................................................................................... 8

(一) 运行环境 ....................................................................................................................... 8

(二) 试验目的 ....................................................................................................................... 8

(三) 功能说明 ....................................................................................................................... 8

(四) 程序运行效果图 ........................................................................................................... 8

五、 主要函数 ........................................................................................................................... 9

六、 小结 ................................................................................................................................. 17 2

一、 DES算法简介

DES(Data Encryption Standard,DES)起源于19xx年美国国家标准局(NBS)征求国家密码标准方案。DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是19xx年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。在使用DES时,双方预先约定使用的“密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。

DES( Data Encryption Standard)算法,于19xx年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。

二、 DES算法原理

(一) 加密

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0 、R0两部分,每部分各长32位,其置换规则见下表:

58,50,12,34,26,18,10,2,60,52,44,36,28,20,12,4,

1

62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,

57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3,

61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,

即将输入的第58位换到第一位,第50位换到第2位,??,依此类推,最后一位是原来的第7位。 L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3??D64,则经过初始置换后的结果为:L0=D550??D8;R0=D57D49...D7。

经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示:

40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,

38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,

36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,

34,2,42,10,50,18,58 26,33,1,41, 9,49,17,57,25,

放大换位表

32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10,11,

12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,

22,23,24,25,24,25,26,27,28,29,28,29,30,31,32, 1,

单纯换位表

16,7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,

2,8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,

在f(Ri,Ki)算法描述图中,S1,S2...S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2......8)的功能表: 选择函数Si

S1:

14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,

0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,

4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,

2

15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, S2:

15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15, 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, S3:

10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7, 1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, S4:

7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4, 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, S5:

2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14, 11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, S6:

12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6, 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, S7:

4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,

3

1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,

6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,

S8:

13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,

1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,

7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,

2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,

(二) 子密钥Ki(48bit)的生成算法

初始Key值为64位,但DES算法规定,其中第8、16、......64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、......、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:

循环左移位数1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

以上介绍了DES算法的加密过程。 DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、??,最后一次用K0,算法本身并没有任何变化。

(三) 解密

DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2??K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。

4

三、 流程图

(一) 加密流程图

DES算法实验报告

5

(二) 子密钥生成流程图

DES算法实验报告

(三) 解密流程图

DES算法实验报告

6

功能流程图

DES算法实验报告

7 (四)

DES算法实验报告

DES算法实验报告

四、 实验说明

(一) 运行环境

服务器

操作系统:windows 或linux均可

(二) 试验目的

加解密算法程序; 了解DES算法的优缺点及应用场合,理解并掌握DES算法的原理,编写DES

(三) 功能说明

任意长度字符的加密解密; 支持中文加密解密;

(四) 程序运行效果图

DES算法实验报告

8

五、 主要函数

#include <iostream>

#include<math.h>

#include<string.h>

using namespace std;

const static char IP_Table[] = { //IP_Table置换 58, 50, 42, 34, 26, 18, 10, 2,

60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6,

64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1,

59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5,

63, 55, 47, 39, 31, 23, 15, 7

};

const static char Final_Table[] = { //最终置换 40, 8, 48, 16, 56, 24, 64, 32,

39, 7, 47, 15, 55, 23, 63, 31,

38, 6, 46, 14, 54, 22, 62, 30,

37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28,

35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26,

33, 1, 41, 9, 49, 17, 57, 25

};

const static char S_Box[8][64] = { //s_box

/* S1 */

{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},

/* S2 */

{15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},

/* S3 */

{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,

9

13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},

/* S4 */

{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},

/* S5 */

{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},

/* S6 */

{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},

/* S7 */

{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},

/* S8 */

{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11} };

const static char Rar_Table[] = { //压缩置换

14, 17, 11, 24, 1, 5,

3, 28, 15, 6, 21, 10,

23, 19, 12, 4, 26, 8,

16, 7, 27, 20, 13, 2,

41, 52, 31, 37, 47, 55,

30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53,

46, 42, 50, 36, 29, 32

};

10

const static char Exp_Table[] = { 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13,

12, 13, 14, 15, 16, 17,

16, 17, 18, 19, 20, 21,

20, 21, 22, 23, 24, 25,

24, 25, 26, 27, 28, 29,

28, 29, 30, 31, 32, 1

};

const static char P_Table[]={ 16, 7, 20, 21,

29, 12, 28, 17,

1, 15, 23, 26,

5, 18, 31, 10,

2, 8, 24, 14,

32, 27, 3, 9,

19, 13, 30, 6,

22, 11, 4, 25

};

const static char KeyRar_Table[]={ 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4 };

//设置全局变量,16轮密钥

bool key[16][48]={{0}};

void ByteToBit(bool *Out,char *In,int bits) {

int i;

for(i=0;i<bits;i++)

Out[i]=(In[i/8]>>(i%8))&1; }

void BitToByte(char *Out,bool *In,int bits) {

int i;

//扩展置换 //P置换 //字节到位转换函数 //位到字节转换函数 11

for(i=0;i<bits/8;i++)

Out[i]=0;

for(i=0;i<bits;i++)

Out[i/8]|=In[i]<<(i%8);

}

void Xor(bool *InA,const bool *InB,int length) //按位异或 {

for(int i=0;i<length;i++)

InA[i]^=InB[i];

}

void keyfc(char *In) //密钥生成函数

{

int i,j=0,mov,k,m;

bool* key0 = new bool[56];

bool* keyin = new bool[64];

bool temp;

ByteToBit(keyin,In,64); //字节到位的转换

for(i=0;i<56;i++) //密钥压缩为56位 key0[i]=keyin[KeyRar_Table[i]-1];

for(i=0;i<16;i++) //16轮密钥产生

{

if(i==0||i==1||i==8||i==15)

mov=1;

else

mov=2;

for(k=0;k<mov;k++) //分左右两块循环左移 {

for(m=0;m<8;m++)

{

temp=key0[m*7];

for(j=m*7;j<m*7+7;j++)

key0[j]=key0[j+1];

key0[m*7+6]=temp;

}

temp=key0[0];

for(m=0;m<27;m++)

key0[m]=key0[m+1];

key0[27]=temp;

temp=key0[28];

for(m=28;m<55;m++)

key0[m]=key0[m+1];

key0[55]=temp;

}

12

for(j=0;j<48;j++) //压缩置换并储存

key[i][j]=key0[Rar_Table[j]-1];

}

delete[] key0;

delete[] keyin;

}

void DES(char Out[8],char In[8],bool Type)//加密核心程序,Type=0时加密,反之解密 {

bool* MW = new bool[64];

bool* tmp = new bool[32];

bool* PMW = new bool[64];

bool* kzmw = new bool[48];

bool* keytem = new bool[48];

bool* ss = new bool[32];

int hang,lie,i;

ByteToBit(PMW,In,64);

for(int j=0;j<64;j++)

{

MW[j]=PMW[IP_Table[j]-1]; //初始置换

}

bool *Li=&MW[0],*Ri=&MW[32];

for(i=0;i<48;i++) //右明文扩展置换

kzmw[i]=Ri[Exp_Table[i]-1];

if(Type==0) //DES加密过程 {

for(int lun=0;lun<16;lun++)

{

for(i=0;i<32;i++)

ss[i]=Ri[i];

for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[Exp_Table[i]-1];

for(i=0;i<48;i++)

keytem[i]=key[lun][i];

Xor(kzmw,keytem,48);

/*S盒置换*/

for(i=0;i<8;i++)

{

hang=kzmw[i*6]*2+kzmw[i*6+5];

lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;

13

tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2;

tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2;

tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2;

}

for(i=0;i<32;i++) //P置换

Ri[i]=tmp[P_Table[i]-1];

Xor(Ri,Li,32); //异或

for(i=0;i<32;i++) //交换左右明文

{

Li[i]=ss[i];

}

}

for(i=0;i<32;i++)

{

tmp[i]=Li[i];

Li[i]=Ri[i];

Ri[i]=tmp[i];

}

for(i=0;i<64;i++)

PMW[i]=MW[Final_Table[i]-1];

BitToByte(Out,PMW,64); //位到字节的转换

}

else //DES解密过程

{

for(int lun=15;lun>=0;lun--)

{

for(i=0;i<32;i++)

ss[i]=Ri[i];

for(i=0;i<48;i++) //右明文扩展置换 kzmw[i]=Ri[Exp_Table[i]-1];

for(i=0;i<48;i++)

keytem[i]=key[lun][i];

Xor(kzmw,keytem,48);

/*S盒置换*/

for(i=0;i<8;i++)

{

hang=kzmw[i*6]*2+kzmw[i*6+5];

lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4]; tmp[i*4+3]=S_Box[i][(hang+1)*16+lie]%2;

tmp[i*4+2]=(S_Box[i][(hang+1)*16+lie]/2)%2;

tmp[i*4+1]=(S_Box[i][(hang+1)*16+lie]/4)%2;

14

tmp[i*4]=(S_Box[i][(hang+1)*16+lie]/8)%2;

}

for(i=0;i<32;i++) //P置换

Ri[i]=tmp[P_Table[i]-1];

Xor(Ri,Li,32); //异或

for(i=0;i<32;i++) //交换左右明文

{

Li[i]=ss[i];

}

}

for(i=0;i<32;i++)

{

tmp[i]=Li[i];

Li[i]=Ri[i];

Ri[i]=tmp[i];

}

for(i=0;i<64;i++)

PMW[i]=MW[Final_Table[i]-1];

BitToByte(Out,PMW,64); //位到字节的转换

}

delete[] MW;

delete[] tmp;

delete[] PMW;

delete[] kzmw;

delete[] keytem;

delete[] ss;

}

bool RunDes(char *Out, char *In, int datalength, char *Key, bool Type) //加密运行函数,判断输入以及对输入文本8字节分割

{

if( !( Out && In && Key && (datalength=(datalength+7)&0xfffffff8) ) )

return false;

keyfc(Key);

for(int i=0,j=ceil(datalength/8); i<j; ++i,Out+=8,In+=8)

DES(Out, In, Type);

return true;

}

int main()

15

char* Ki = new char[8];

char shuru[200];

char *Enter;

char* Print = new char[400];

int len = 0;

int i_mf,i=0;

cout << "输入原始字符串:" <<"\n"; cin >> shuru;

Enter=new char[strlen(shuru)+1]; for(i=0;i<strlen(shuru);i++)

{

Enter[i]=shuru[i];

}

Enter[i]='\0';

len=i+1;

cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++)

cin >> Ki[i_mf];

cout << "\n";

RunDes(Print,Enter,len,Ki,0);//加密

cout << "----明文----" << "\n"; for(i_mf=0;i_mf<len;i_mf++) cout << Enter[i_mf];

cout << "\n\n";

cout << "----密文----" << "\n"; for(i_mf=0;i_mf<len;i_mf++) cout<<Print[i_mf];

cout << "\n\n";

//此处进行不同密钥输入测试

cout << "请输入密钥(8位):" <<"\n"; for(i_mf=0;i_mf<8;i_mf++)

cin >> Ki[i_mf];

cout << "\n";

RunDes(Enter,Print,len,Ki,1);//解密

cout << "----明文----" << "\n"; for(i_mf=0;i_mf<len;i_mf++)

16 {

}

cout << Enter[i_mf]; cout << endl; delete[] Ki; delete[] Print; return 0;

六、 小结

通过这次课程设计,我从中了解了DES算法的加密、解密过程,梳理了这段时间所学的安全知识,有了更好的提高。

17

相关推荐