广东工业大学网络工程实验报告-对称密码算法DES.doc

广东工业大学网络工程实验报告-对称密码算法DES.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
广东工业大学网络工程实验报告-对称密码算法DES

一.实验目的 通过用DES算法对实际的数据进行加密和解密来深刻了解DES的运行原理。 运行Windows或Linux操作系统的PC机,具有gcc(Linux)、VC(Windows)等C语言编译环境。 1.算法分析 根据所提供的程序分析DES算法的实现过程。DES程序包括一个头文件和一个实现DES算法的C文件。头文件里主要是一些宏定义和函数声明,其中还包括保证可移植性的一些定义。DES程序通过宏定义可选择小代码模式(#define small code)或者选择大代码模式。在大代码模式下,程序定义了多个表,从而使DES算法中的很多运算都可以通过查表实现,速度较快,但要求有较多的存储空间;在小代码模式运行时,可以不查表,从而节省了存储空间,但是速度较慢。读者可以根据自己的需求来选择不同的运行模式。 加密解密时主要用到下面5个函数。 (l)it 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) 函数名称:解密函数。 参数说明: t是指向待解密的密文数组的指针。 pt是指向存储解密结果的指针。 key是调用密钥生成函数后存储每一轮子密钥的结构体变量。 解密成功时,返回CRYPT_OK。 加密和解密时,pt和t可以指向同一块内存。 (4)int des_test(void) 函数名称:测试函数。 这个函数用来对加密算法进行测试。函数体内部定义了对应的明文和密文数组,并且进行了多轮加密和解密。这个函数还可以用来测试函数的运行时间。 (5)nit des_keysize(int *desired_keysize) 函数名称:密钥长度检验函数。 参数说明: desired_keysize是使用者所想要的密钥长度。 当密钥长度小于所需密钥长度时,返回值为CRYPT_INVALID_KEYSIZE,否则,desired_keysize指向的变量被置为 8。 2. 使用实例分析 #include des.h int main(int argc, char *argv[]) { unsigned char t[9]=abcdefg,ct[9],key[8]= { a,b,c,d,a,b,c,d }; des_key skey; pt[9l=ct[9]=\0; des_setup(key,8,0,skey); des_ecb_encrypt(pt.ct,skey); des_ecb_decrypt(ct.pt,skey); printf(%s\n,pt); prinif(%s\n,ct); system(PAUSE); retun 0; } 说明:这个程序演示了对一组8Byte的数据进行加密和解密的过程。t指向明文数组,ct指向密文数组,skey是密钥数组。pt和t数组长度设为9,是为了方便控制台字符串输出。对文件加密时,可以指定读取和写入的字符数,这两个数组长度应该定义为8。(1)使用附录提供的程序对一个文件进行加密和解密,提交程序代码和执行结果。int main(int argc, char *argv[]) { int choic

文档评论(0)

zhanghc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档