实验10 加密与解密算法的实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

加密与解密算法的实现

数据加密标准(DES)算法是一个分组加密算法。它以64位(8字节)为分组对数据加密,其中有8位(第8、16、24、32、40、48、56和64位)用作奇偶校验位,另外的56位为真正的密钥,保密性依赖于密钥,加密和解密过程使用同一个密钥。本实验通过编写一个DES算法加密/解密程序,介绍数据加密/解密原理和技术。

【实验目的】

1)理解加密与解密的基本思想。

2)掌握DES算法的程序设计流程。

3)编写DES加密与解密程序,加深对数据加密与解密的理解,提高网络安全的编程能力。

【实验设备及环境】

1)Windows XP操作系统。

2)VC++ 6.0 编译环境。

【实验任务及内容】

1.DES算法流程

(1)加密程序设计

DES算法的加密过程如图9-10-1所示。

图9-10-1 DES加密算法流程图

设初始置换为IP,运算函数为f,16个子密钥为K

i

,则DES加密过程表示如下:

L 0R

=IP(明文)L

R

R

i

R

i-1

K

i

L i =R

i-1

,R

i

=L

i-1

⊕f(R

i-1

,K

i

),其中,i =1,2,…,16

密文=IP-1(R

16L

16)

(2)解密程序设计

DES解密和加密使用相同的算法,唯一不同的是密钥次序相反,即只需要把16个密钥的顺序倒过来。DES解密过程可用符号表示如下:

R 16L

16

=IP(密文)

R i-1=L

i

,L

i-1

= R

i

⊕f(R

i-1

,K

i

),其中,i =1,2,…,64

明文=IP-1(R0L0)

2.DES类设计

定义一个名为SDES的类,用以实现标准的DES加解密算法。SDES类定义位于SDES.h 文件中,代码如下:

enum {ENCRYPT,DECRYPT};

class SDES {

static char IP_Table[64]; //IP置换表

static char IPR_Table[64];

static char E_Table[48];

static char P_Table[32];

static char PC1_Table[56];

static char PC2_Table[48];

static char LOOP_Table[16];

static char S_Box[8][4][16];

public:

SDES();

virtual ~SDES();

static void S_DES(char Out[8], char In[8], bool Type);//标准DES加/解密static void SetSubKey(const char Key[8]);// 设置子密钥

static void F_func(bool In[32], const bool Ki[48]);// f 函数

static void S_func(bool Out[32], const bool In[48]);// S 盒代替

static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换

static void Xor(bool *InA, const bool *InB, int len);// 异或

static void RotateL(bool *In, int len, int loop);// 循环左移

static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组

static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组

};

SDES类的实现位于SDES.cpp文件中,代码如下:

//SDES.cpp: implementation of the SDES class.

#include "stdafx.h"

#include "DES.h"

#include "SDES.h"

#ifdef _DEBUG

#undef THIS_FILE

static char THIS_FILE[]=__FILE__;

#define new DEBUG_NEW

#endif

SDES::SDES() {

}

SDES::~SDES() {

}

static bool SubKey[16][48];// 16圈子密钥

static char Tmp[256];

// 处理数据,将64位数据按照IP表变换

char SDES::IP_Table[64] = {

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

相关文档
最新文档