ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:260.25KB ,
资源ID:2649354      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-2649354.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(徐文兵123067 3DES加密解密软件的实现.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

徐文兵123067 3DES加密解密软件的实现.docx

1、徐文兵123067 3DES加密解密软件的实现成都信息工程学院课程设计报告3DES加密解密的实现课程名称: 密码算法程序设计 学生姓名: 徐文兵 学生学号: 2009123067 专业班级: 信息对抗技术09级2班 任课教师: 万武南 2011年 6 月 3 日附件:课程设计成绩评价表指导老师评阅成绩表学习与工作态度(30%)选题意义(10%)文献综述(10%)研究水平与设计能力(20%)课程设计说明说(论文)撰写质量(20%)设计创新(10%)总分指导老师签名: 年 月 日课程设计答辩记录及评价表学生讲述情况教师主要提问记录学生回答问题情况答辩评分评分项目分值评价参考标准评分总分优良中及格差

2、选题意义1098764文献综述1098764研究水平与设计能力201917151310课程设计说明书(论文)撰写质量201917151310设计创新1098764答辩效果302825221915答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表成绩汇总评分项目评分比例分数课程设计总分指导老师评分50%答辩小组评分50%目 录1. 背景与意义 12. 系统设计 22.1系统主要目标 22.2主要软件需求(运行环境) 22.3功能模块与系统结构 23. 系统功能程序设计 33.1基本要求部分 33.1.1 初始置换(IP) 33.1.2轮结构 43.1.3逆初始置换(IP-1) 93

3、.1.4子密钥产生 93.1.5加密 123.1.6解密 133.2较高要求部分 143.2.1 明文分组实现 143.2.2 明文最后分组的填充(ECB模式) 153.2.3 明文分组去掉填充 153.2.4 单个分组的判断(中间过程) 163.2.5 加解密所用时间 173.3程序界面预览 174. 测试报告 185. 结论 19参考文献 201. 背景与意义DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一

4、下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域,她仍然发挥着余热。DES 是一个对称密码体制,加密和解密使用同一密钥,有效密钥的长度为56 位。同时,一个分组密码,分组长度为64 位,明文和密文的长度相同,及64 位的明文从算法的一端输入,从另一端输出64 位密文;由于DES 算法保密性强,到目前为止,除了穷举法外,还没有找到更好的方法破解,因此DES 得到了广泛的应用,并成为其他加密方法的典范。DES-EDE2模式,使用两个互不相同的密钥K1、K2,实现的方式是加密-解密-加密算法,简记EDE。此

5、方案已在ANS X.9.17和ISO8732中被采用。DES 算法主要研究的是加密与解密算法,解密是加密的逆过程,从加密过的信息中得到明文。密钥是一串适当长度的字符或数字串,它可以控制加密和解密过程。通过这次课程设计让我真正的理解了DES加密算法的魅力,它那完全对称的模型让我着迷,同时也让我学到了很多关于密码学相关的知识,加深了对密码学理论中的保密通信模型、各种对称密钥算法的理解和掌握,实现密码理论的应用,为学习后续信息安全方向的课程打下了坚实的基础。2. 系统设计2.1系统主要目标基本要求部分:1完成一个明文分组的加解密,明文和密钥是ASCII码,且都从文本文件读取。2单个分组加密时,输出每

6、次调用DES算法后的值,即加密一组明文输出两组中间值和一组密文,输出同加密,输出的过程保存在文件“加解密过程.txt中”。较高要求部分:1密钥长度不足时填充字符0,过长时自动截取前面8字节部分。2明文不止一个分组时,程序自动填充字符0完成分组,在解密时能够根据算法正确的去掉填充的字符。3可以对文本文档以及任意文件进行正确的加解密,且长度不止一个分组。4粗略计算程序加解密各种文件所需的时间。5程序自动判断文件的大小,如是单个分组即8个字节,就自动输出加解密中间过程。2.2主要软件需求(运行环境)本软件使用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。测试平台

7、:Windows XP Professional使用软件:Visual C+ 6.02.3功能模块与系统结构根据DES对称加密算法的实现,对程序进行了一些功能划分:1、头文件“Printf.h”:主要负责程序的界面功能,被主函数调用;2、头文件“key.h”:由函数“get_key”组成,被主函数调用,从文件获取初始密钥;3、头文件“IP_zhi_huan.h”:分别由函数“iP_zhi_huan”和“ip_1_zhi_huan”组成,被头文件“jia_mi.h”中的“E”函数调用,分别实现初始置换和逆初始置换;4、头文件“jia_mi.h”:分别由函数“E”和“shi_jz”组成。函数“E”

8、是核心,被“En_De_crypt.h”中的函数“En”和“De”调用,主要负责单个分组的加解密。函数“shi_jz”是被函数“E”调用,把二进制转化为十进制以便输出中间过程;5、头文件“LUN_jie_gou.h”:由函数“lun_jie_gou”组成,被“jia_mi.h”中的“E”函数调用,主要功能是DES加解密算法中的轮结构;6、头文件“F_han_shu.h”:由函数“R_f_han_shu”组成,被“LUN_jie_gou.h”的“lun_jie_gou”函数调用,主要实现轮结构中的F函数部分;7、头文件“lun_key.h”:由函数“lun_k”组成,被“LUN_jie_gou.

9、h”中的“lun_jie_gou”函数调用,以实现轮密钥的产生;8、头文件“En_De_crypt.h”:由函数“En”和“De”组成,被主函数调用,分别实现多个分组的加密和解密;9、主函数:主要负责判断是加密还是解密然后调用不同的函数;3. 系统功能程序设计 3.1基本要求部分3.1.1 初始置换(IP)原理:待加密的64比特明文串m,经过IP置换后,得到的64比特串的下标列表如下:IP初始置换定义表代码实现:(IP_zhi_huan.h)两个数组之间通过一个中间值赋值实现IP初始置换,关键代码如下: for(i=0;i64;i+) flag=ipi-1; goi=fromflag; 此处需

10、要注意的是IP初始置换定义表默认下标是从1开始的,以后的定义表都是如此。3.1.2轮结构原理:以第一轮为例,经过IP初始置换得到的64比特串,前32比特分为左半部分,记为L0,后32比特分为右半部分,记为R0。R0部分首先根据F函数计算过程给出右半部分的变换过程,即先将R0进行E盒变换,将32比特扩展为48比特。然后将E盒输出的48比特作为输入与子密钥进行异或(XOR)操作。然后将输出的48比特作为S盒的输入,进行S盒变换,将48比特压缩为32比特,最后将S盒输出的32比特输入P盒进行置换。左半部分L0的32比特为上一轮右半部分的32比特L1=R0,而下一轮右半部分为经过P盒作用之后输出的32

11、比特与左半部分L0进行异或(XOR),得到最终的R1的32比特。一共进行16轮这样的变换。其图示分别如下图:轮结构示意图由图中所示结构可得到每一轮变换可由下面的公式表示:L i=Ri1Ri =L i-1F(R i-1,K i)F函数的结构E盒定义表P盒定义表S盒一共有8个,每个S盒的使用方法如下:S盒接收到6比特的输入,其中第1个比特和最后1个比特构成的2位二进制为该S盒的行号,中间的4位二进制为该S盒的列号,然后由该S盒的定义表根据行号和列号查表得到对应的值(十进制),转换为二进制即为S盒变换的输出(其定义表省略)。代码实现:(LUN_jie_gou.h)轮结构:for(i=1;i=16;i

12、+)/十六轮加解密 if(flag1=0)/加密 R_f_han_shu(R,f_R,i,k,0);/F函数 else/解密 R_f_han_shu(R,f_R,i,k,1);/F函数 for(j=0;j32;j+) /求左边部分 Lij=Ri-1j; /求右边部分 if(Li-1j=f_Rj) Rij=0; else Rij=1; F函数: /判断加解密,并根据判断调整密钥 if(flag2=0) FLAG=num; else FLAG=17-num; /E盒扩充 for(i=0;i48;i+) flag=f_e_hei-1; e_hei=from_Rnum-1flag; /E盒输出与轮密钥

13、异或 for(i=0;i48;i+) if(e_hei=from2_keyFLAGi) f_XORi=0; else f_XORi=1; /S盒变换压缩 for(i=0;i48;i+) flag=i/6; f_XOR_6flag+1i%6=f_XORi; for(i=1;i=8;i+) r=2*f_XOR_6i0+f_XOR_6i5; c=8*f_XOR_6i1+4*f_XOR_6i2+2*f_XOR_6i3+f_XOR_6i4; s_hei=f_s_hei-1rc; for(j=0;j4;j+) flag=(i-1)*4+3-j; f_s_he_ejzflag=s_hei%2; s_hei=

14、s_hei/2; /P盒置换 for(i=0;i32;i+) flag=f_p_hei-1; go_fi=f_s_he_ejzflag; 3.1.3逆初始置换(IP-1)原理:DES算法进行完16轮运算之后,需要进行逆初始置换,逆初始置换正好为初始置换的逆,若一个矩阵进行初始置换之后输出,再进行一次逆初始置换的输出结果为初始置换。DES的逆初始置换定义表如下:DES的逆初始置换定义表代码实现:(IP_zhi_huan.h)两个数组之间通过一个中间值赋值实现IP-1逆初始置换,关键代码如下:for(i=0;i64;i+) flag=ip_1i-1; goi=fromflag; 3.1.4子密钥产

15、生原理:子密钥产生过程的输入,为用户持有的64比特初始密钥,但若用户只提供56比特,其余8比特由算法提供,分别放在8、16、24、32、40、48、56和64位上。因此初始密钥中每8位的密钥包含用户提供的7位和DES确定的1位。用户将初始密钥64位输入到子密钥产生流程中,首先经过密钥置换PC-1,将初始密钥的8比特奇偶校验码去掉。留下真正的56比特初始密钥。接着,分为两个28比特分组C0及D0,再分别经过一个循环左移函数,每一半左移1或2位,连接成56比特数据,再按密钥置换PC-2做重排,进行压缩,抛弃8位后,便可输出子密钥的48比特,作为轮结构F函数的密钥输入部分。该过程如下图所示:DES轮

16、密钥的产生PC-1置换选择定义表循环左移位定义表注意:在循环左移位定义表中的迭代顺序是指轮的次序。置换选择PC-2定义表代码实现:(lun_key.h)for(i=0;i56;i+) /置换PC-1 flag=k_pc_1i-1; pc_1i=from_kflag; /分为左右两半 if(i28) C0i=pc_1i; else D0i-28=pc_1i; /循环左移位 for(j=1;j17;j+) if(xun_huan_biaoj=1) Cj27=Cj-10; Dj27=Dj-10; for(i=0;i27;i+) Cji=Cj-1i+1; Dji=Dj-1i+1; else Cj27=

17、Cj-11; Cj26=Cj-10; Dj27=Dj-11; Dj26=Dj-10; for(i=0;i26;i+) Cji=Cj-1i+2; Dji=Dj-1i+2; /合并并置换选择PC-2 for(i=0;i28;i+) xun_huani=Cji; xun_huan28+i=Dji; for(i=0;i48;i+) flag=k_pc_2i-1; go_kji=xun_huanflag; 3.1.5加密原理:前面已经就单个分组的加解密进行了说明,由于本系统是DES-EDE2模式的DES加解密,故下面两节就DES-EDE2加解密模式进行说明。如下图所示,使用两个互不相同的密钥K1、K2,

18、实现方式为加密解密加密算法,简记为EDE。此方案已在密钥管理标准ANS X.9.17和ISO 8732中被采用。密钥分别为K1=K3,其密文为:C=EK1(DK2(EK1(P)其示意图如下:三重DESEDE2模式加密代码实现:(En_De_crypt.h)一重DES的加密:if(Flag=0)/(加密过程,其中Flag=0表明是加密) ip_zhi_huan(From,p_ip);/初始置换(IP) lun_jie_gou(p_ip,lun,k,0);/轮结构加密 ip_1_zhi_huan(lun,Go);/逆初始置换 三重DES的加密:E(p,A,K1,0,go);/加密算法EE(A,B,

19、K2,1,go);/解密算法DE(B,C,K1,0,go);/加密算法E3.1.6解密原理:在三重DES-EDE2模式中,解密时,密钥顺序正好与加密密钥顺序相反,依次采用解密加密解密的顺序,即:P=DK1(EK2(DK1(C)其示意图如下:三重DESEDE2模式解密代码实现:(En_De_crypt.h)一重解密的实现:/(解密过程,即Flag=1) else ip_zhi_huan(From,p_ip);/初始置换(IP) lun_jie_gou(p_ip,lun,k,1);/轮结构 ip_1_zhi_huan(lun,Go);/逆初始置换 三重DES的实现:E(p,B,K1,1,go);/

20、解密算法DE(B,A,K2,0,go);/加密算法EE(A,p,K1,1,go);/解密算法D3.2较高要求部分3.2.1 明文分组实现原理:由于DES是以8个字节(64比特)为一个分组进行加解密的,故在对多于8个字节的信息加解密时,需要对信息进行进行正确的分组。最简单的方法便是依照信息的顺序依次以8个字节为单位进行加解密。代码实现:(En_De_crypt.h)/每次读8个字节加密 while(!feof(fp) count=fread(P,1,8,fp);/按信息的顺序读取字节 if(count=8)/按照读取信息的顺序进行加解密(每次都刚好8字节) 3.2.2 明文最后分组的填充(ECB

21、模式)原理:由于对于任意文件来说,文件的大小是未知不固定的,所以难免遇到最后一个一个分组不是刚好8字节的情况,这时就要对最后一个消息块进行填充。填充本身是很简单的事情,问题在于有很多种可行的填充方式,如果加密时以某种方式填充,解密时就得理解这种填充方式并去除填充内容,否则很可能解密出来得到的数据就是脏数据。网上有许多的填充方案,在这里我们选择的是X923填充方式。即填充为“0”的字节序列,最后一个字节记录填充的总字节数。代码实现:(En_De_crypt.h)count=fread(P,1,8,fp);/按信息的顺序读取字节.if(count)/最后一个分组填充 /填充 memset(P+co

22、unt,0,7 - count);/调用字符串函数完成填充 P7 = 8 - count;/最后填充共填充的字节位数 3.2.3 明文分组去掉填充原理:由于密文最后8字节可能有填充的内容,故在解密时,需要对密文的最后8字节(最后一个密文分组)进行一定的判断。判断方法为:当检测到是密文的最后一个分组时,先判断最后一个字节,然后根据最后一个字节数来判断需要检查后几个字节位,在判断时,检查后几位字节是否是连续的“0”字符,如是就代表是填充的内容,或者不是填充的内容。虽然这样会有一定的误差,但是误差比较小,可忽略不计。代码实现:(En_De_crypt.h)先记录整个密文的长度,以判断是否是最后一个密

23、文分组。/取文件长度 fseek(fp,0,SEEK_END); /将文件指针置尾 fileLen = ftell(fp); /取文件指针当前位置 rewind(fp); /回到文件头. 判断填充:/最后一个分组的解密 if(go7 8)/判断末尾是否被填充 for(count = 8 - go7; count 7; count+) if(gocount != 0) break; /当中间不是连续的“0”字符时,结束判断 /有填充(即中间是连续的0) if(count = 7) fwrite(go,1,8-go7,fp2); else/无填充 fwrite(go,1,8,fp2);3.2.4

24、单个分组的判断(中间过程)原理:由于在加解密单个分组时,要求输出3DES的加解密过程,故设计此方案。在此方案中,将把加解密的中间过程全部显示在“加解密过程.txt”文件中,以便查看。代码实现:(En_De_crypt.h)./取文件长度 fseek(fp,0,SEEK_END); /将文件指针置尾 fileLen = ftell(fp); /取文件指针当前位置 rewind(fp); /回到文件头. /单个分组输出中间过程 if(fileLen=8) fp3=fopen(加解密过程.txt,a);/格式化输出到文件 if(fp3=NULL) printf(cannot open file!n)

25、; exit(0); .3.2.5 加解密所用时间原理:调用“memory.h”中的clock函数来大致记录程序运行的时间。精确度为毫秒。代码实现:(En_De_crypt.h)clock_t a,b; a = clock(); /加解密过程 b = clock();3.3程序界面预览4. 测试报告1、单个分组的测试:K1=comp;K2=computtrewtw;P=learning;测试结果:C=剿M瞵y;P=learning;测试过程(加解密过程.txt):加密过程解密过程5. 结论应用密码学课程设计是在学习密码学理论的基础上,对所学知识加以实践的最好平台。通过这次课程设计加深了我对密码

26、学理论中有关的对称算法和对称算法的实现模式有了进一步的了解和掌握,以及对密码学理论的应用,为以后信息安全方向的课程打下了坚实的基础。同时也让我更加熟悉了用C语言开发一个程序的知识,巩固了我的C的理论基础,使我的编程能力有进一步的提升。在完成程序的过程中,遇到了很多的问题,各式各样的问题都有,但是正是因为这样,所以让我加强了对问题的认识,任何问题成功的坚决掉都需要几步:发现问题、分析问题、坚决问题和总结问题!参考文献1 刘城霞,蔡英 .DES加密技术研究中填充方法的探讨.北京:北京信息科技大学,2008.2 张仕斌,万武南,张金全,孙宣东.应用密码学M.西安:西安电子科技大学出版社,2009.3 谭浩强.C程序设计(第三版)M.北京:清华大学出版社.2008.4 朱彦军.DES算法及其在VC+6.0下的实现.航天医学工程研究所四室. 5 Harry. 数据块填充模式.6 XX贴吧.C语言吧. 7 将任意文件转换成C语言的数组.

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2