实验10 加密与解密算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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,