广东工业大学网络工程实验报告-对称密码算法DES
一.实验目的
通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。
二.实验软件环境
运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。
三.实验内容
1.算法分析
根据所提供的程序分析DES算法的实现过程。DES程序包括一个头文件和一个实现DES算法的C文件。头文件里主要是一些宏定义和函数声明,其中还包括保证可移植性的一些定义。DES程序通过宏定义可选择小代码模式(#define small code)或者选择大代码模式。在大代码模式下,程序定义了多个表,从而使DES算法中的很多运算都可以通过查表实现,速度较快,但要求有较多的存储空间;在小代码模式运行时,可以不查表,从而节省了存储空间,但是速度较慢。读者可以根据自己的需求来选择不同的运行模式。
加密解密时主要用到下面5个函数。
(l)int des_setup(const unsigned char *key,int keylen,int num_rounds,des_key *skey)
函数名称:密钥生成函数。
参数说明:
key是一个指针,指向用户输入的初始密钥。
keylen是输入密钥的长度,以字节为单位。
num_rounds是加密轮数,当输入0时,使用算法默认的轮数。
skey是一个指向结构体变量的指针,变量里面存储加密和解密时每轮使用的子密钥。
当密钥生成时,返回值为CRYPT_OK(0),结果保留在Skey指向的结构体。
des_key的定义如下:
typedef struct des_key{
ulong32 ek[32], dk[32];
}des_key
结构体里的ek存储加密时用的子密钥,dk存储解密时用的子密钥。
结构体中用2个32位的整数来存储一轮的48位密钥,每一个32位整数被分成4个8位,每个8位的第6位存储密钥。如果把48位密钥分成8组,则这8组按存储的顺序从高到低分别为1、3、5、7、2、4、6、8。这样做是为了加密时可以把扩展和查表运算结合起来。
(2)void des_ecb_encrypt(const unsigned char *pt, unsigned char *ct, des_key *key)
函数名称:加密函数。
参数说明;
pt是指向待加密的明文数组的指针。
ct是指向存储加密结果的指针。
key是调用密钥生成函数后存储每一轮子密钥的结构体变量。
加密成功时,返回CRYPT_OK。
(3)void des_ecb_decrypt(const unsigned char *ct,unsigned char *pt,des_key *key)
函数名称:解密函数。
参数说明:
ct是指向待解密的密文数组的指针。