课程设计(论文)DES加密解密的实现 .doc

上传人:laozhun 文档编号:3993339 上传时间:2023-03-30 格式:DOC 页数:15 大小:131.50KB
返回 下载 相关 举报
课程设计(论文)DES加密解密的实现 .doc_第1页
第1页 / 共15页
课程设计(论文)DES加密解密的实现 .doc_第2页
第2页 / 共15页
课程设计(论文)DES加密解密的实现 .doc_第3页
第3页 / 共15页
课程设计(论文)DES加密解密的实现 .doc_第4页
第4页 / 共15页
课程设计(论文)DES加密解密的实现 .doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《课程设计(论文)DES加密解密的实现 .doc》由会员分享,可在线阅读,更多相关《课程设计(论文)DES加密解密的实现 .doc(15页珍藏版)》请在三一办公上搜索。

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

2、平与设计能力201917151310课程设计说明书(论文)撰写质量201917151310设计创新1098764答辩效果302825221915答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表成绩汇总评分项目评分比例分数课程设计总分指导老师评分50%答辩小组评分50%目 录1 背景与意义32. 系统设计42.1系统主要目标42.2主要软件需求(运行环境)42.3功能模块与系统结构42.3.1 密钥模块42.3.2 加密模块52.3.3 解密模块53 系统功能程序设计53.1基本要求部分53.1.1 初始置换IP53.1.2 E盒扩展63.1.3 与密钥进行异或63.1.4 S盒

3、变换63.1.5 P置换运算73.1.6 与左32位进行异或73.1.7 逆IP置换83.1.8 Des加密函数83.1.9 密钥交换93.1.10 Decode()解密函数103.2较高要求部分113.2.1 分组加密实现113.2.2 明文分组最后分组的填充113.3程序界面预览124. 测试报告124.1 密钥中间过程124,2 加密过程中的各步结果134.3 解密过程中的各步结果135 结论14参考文献141 背景与意义 DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。在过去近20年的时间里,

4、DES被广泛应用于美国联邦和各种商业信息的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加汕站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密伟输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用

5、到DES算法。2. 系统设计2.1系统主要目标基本要求部分:1能够对一个明文分组进行加密,加密后能够正确解密。2程序运行时可以输出任一组密钥。因为实现了对任意长度明加密,所以没输出每一轮加密后的结果。因为当明文长度过长时,每一轮加密结果会很多。3程序有良好的人机交互操作;较高要求部分:1如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;2密钥采用ASCII码,明文输入信息可以是文字(可以是汉字或英文,要求不止一个加密分组长度),任意字符。进行加密后,能够进行正确的解密;3. 程序代码有比较好的结构,模块划分合理,用类进行封装,通过调用类的成员函数实现加密解密功

6、能。2.2主要软件需求(运行环境)本软件用C#语言编写,编写时所用的工具主要是Visual Studio。编辑成功后的.EXE文件可以在装有windows系统的任何计算机上使用。测试平台:Windows XP Professional使用软件:Microsoft Visual Studio 20052.3功能模块与系统结构该软件由三个模块构成;2.3.1 密钥模块private void Key(string str) /此函数用来获取密钥的数组str是密钥字符串,最后得到钥密二进制数组.用一个类成员数组key来存放。private void KeyBuild() /此函数用来构造16轮子密钥

7、private void Keycreate(int midkey2,int movebit, int n)/此函数用来实现循环左移,同时进行PC2置换上面二个函数用来产生16轮密钥,最后存放在类成员二维数组keyArray中。private void ShowKey() /此函数用来显示密钥2.3.2 加密模块private void button2_Click(object sender, EventArgs e) /加密事件加密事件包含了ArrayDes()函数;private void ArrayDes() /此函数用来对明文分组加密ArrayDes()包含PlainArray()、K

8、ey()、KeyBuild()、Keycreate()、ShowKey()和Des()函数,private void PlainArray(string str) /此函数用来获取明文字符串的二进制数组。private void Des(int, plain, int key, int n) /DES加密函数2.3.3 解密模块private void button4_Click(object sender, EventArgs e) /解密事件private void Exchange() /此函数用来交换16轮密钥,把第一轮作最后一轮private void ArrayDecode() /

9、此函数用来分组解密private void EncodeArray(string st) /此函数用来对16进制的密文转成二进制private void Decode(ref int, plain,int key,int n) /解密函数3 系统功能程序设计3.1基本要求部分3.1.1 初始置换IP将IP盒分为左32位和右32位,将明文左32位和右32位分别进行IP置换,最后既实现了IP置换,同时还将明文分成了左32位和右32位,为下一步做好了准备。for (i = 0; i 32; i+) lDatai = EncodeIP1i - 1; rDatai = EncodeIP1i+32 - 1

10、;循环变量i用来找到IP盒中下标为i的数,IPi取出该数,由于计算机中下标是从零开始计算的,而IPi表的是明文二进制中第几个数,所以应置换成明文二进制中第IPi-1那个数。3.1.2 E盒扩展private void EChange(ref int rData, ref int rDataP) for (int i = 0; i 48; i+) rDataPi = rDataEi - 1;rData表示要传入的右32位二进制明文,rDataP表示经过E盒变化后的要传回的48位。道理和IP置换差不多。也是找到E盒中相应的数,然后减1找到rData中相应的数,然后存到rDataP中。3.1.3 与

11、密钥进行异或for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; keyArray数组中存放的是16伦密钥,k表示第几伦,是从0开始计数的。rDataP是从E盒中出来的48位二进,变化完后,依然存在rDataP数组中.3.1.4 S盒变换for (i = 0; i 48; i += 6) n =i/6; linex = (rDataPi 1) + rDataPi + 5; liney = (rDataPi + 1 3) + (rDataPi + 2 2) + (rDataPi + 3 1) + rDataPi + 4; FillBin(re

12、f rData, n, Sn, linex, liney); Linex变量指S盒的第几行,liney变量指S盒的第几列.“rDataPi1”表示左移一位。先将rDataPi这个数转成二进制,再左移一位,并在最后加零。相当于乘以2。后面是同样的道理。n=i/6;表示第几个S盒。实例把101101代入:linex=(rDataP0=1)1)+(rDataP0+5=1)=”10”+”1”=2+1=3;同理可以算出liney=6;FillBin()参数rData用来输出S盒变换后的32二进制,n第几个S盒,Sn,linex,liney对应S盒中的相应数.下面是FillBin的具体代码:private

13、 void FillBin(ref int rData, int n, int s) int temp = new int4; int i; for (i = 0; i 4; i+) /将S盒中的数转成四位二制数 tempi = s % 2; s = s / 2; for (i = 0; i 4; i+) /将每次的四位二进制数存32位rData数组中 rDatan * 4 + i = temp3 - i; 3.1.5 P置换运算for (i = 0; i 32; i+) tempi = rDatai; 先将经过S盒代替的32位存入temp数组中,主要原因是这里输入的32位和输出的32位都是存

14、在rData数组中,如果用不同的数组来存放可以不用进行这一步。 for (i = 0; i 32; i+) rDatai = tempPi - 1; 3.1.6 与左32位进行异或for (i = 0; i 32; i+) rDatai = lDatairDatai;左322位与右32位异或后依然存放在rData数组中,作为下一轮的右32位输入.3.1.7 逆IP置换private void IP2Change(ref int lData,ref int rData,ref int Encode) int temp = new int64; int i; for (i=0; i 32; i+)

15、 tempi = rDatai; tempi + 32 = lDatai; for (i = 0; i 64; i+) Encode i = tempIP2i - 1; 本来最后一轮不应该交换左32位与右32位,但之前我们同样将它们交换了,然后在IP逆置换中将它们再交换回来。这里的temp数组就是用实现它们的交换。然后再进行IP逆置换。3.1.8 Des加密函数private void Des(int, plain, int key, int n) int lData = new int32, rData = new int32, temp = new int32, rDataP = new

16、int48; int Encode = new int64; int i; BuildEncode(ref lData, ref rData, ref Encode, n); PlainData(ref lData, ref rData, ref Encode); for (int k = 0; k 16; k+) for (i = 0; i 32; i+) tempi = rDatai; EChange(ref rData, ref rDataP); for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; SChange(ref rData

17、P, ref rData); PChange(ref rData); for (i = 0; i 32; i+) rDatai = lDatairDatai; for (i = 0; i 32; i+) lDatai = tempi; IP2Change(ref lData, ref rData, ref Encode); for (i= 0; i 64; i+) strkeyi = Encodei; BuildEncode(ref lData, ref rData, ref Encode, n)函数所有明文二进制数组中选出64位,并将它们分成左32位和右32位,rData存放右32位,lDa

18、ta存放左32位,Encode存放64位.n表示对文明进行分组加密中的第几组.PlainData(ref lData, ref rData, ref Encode)进行IP置换for (i = 0; i 32; i+) tempi = rDatai;每一轮进行变化之前先将右32位存入temp数组中,作为下一轮的左32位输入。这个循环与下面一起实现该功能for (i = 0; i 32; i+) lDatai = tempi;3.1.9 密钥交换private void Exchange() int, key1 = new int16,48; int i, j; for (i = 0; i 16

19、; i+) for (j=0;j48;j+) key1i,j=keyArray i,j; for (i = 0; i 16; i+) for (j = 0; j 48; j+) keyArray 15-i,j = key1i,j; 解密时先要将16轮密钥进行交换。3.1.10 Decode()解密函数private void Decode(ref int, plain,int key,int n) int lData = new int32, rData = new int32, temp = new int32, rDataP = new int48; int Encode = new in

20、t64; int i; BuildEncode(ref lData, ref rData, ref Encode, n); PlainData(ref lData, ref rData, ref Encode); for (int k = 0; k 16; k+) for (i = 0; i 32; i+) tempi = rDatai; EChange(ref rData, ref rDataP); for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; SChange(ref rDataP, ref rData); PChange(ref

21、 rData); for (i = 0; i 32; i+) rDatai = lDatai rDatai; for (i = 0; i 32; i+) lDatai = tempi; IP2Change(ref lData, ref rData, ref Encode); for (i = 0; i 64; i+) strkeyi = Encodei; 解密函数一开始也是进行IP置换,而不是进行IP逆置换,因为上一轮结束时的IP逆置换和解密开始的IP置换相乘够成单位矩阵。3.2较高要求部分1实现了对任意长度的明文都能加密。最后一个明文长度不足时在后面添加二进制零,补足64明文二进制。密钥部分

22、通过设定密钥输入框的属性来限定密钥长度最长为8个字符,当不足8个字符时,弹出友好的提示框,提醒用户输入8个字符。2密钥用ASCII码,即一个字符用8位二进制数表示。明文可以是任意字符(汉字和英文),明文一个字符用16位二进制数表示。3程序代码有比较好的结构,模块划分合理,所有功能都用类成员函数实现,整个软件用一个类实现。4界面友好,各种输入输出方便。3.2.1 分组加密实现对明文用电码本模式进行分组加密,每一个字符16位二进制,4个字符一个明文分组。相同的明文分组,将得到相同的十六进制字符。3.2.2 明文分组最后分组的填充在明文字符串转二进制时,就在一个大数组后面加零,最后计算加密轮数时分二

23、种情况,一种情况是刚好最后一个分组明文就完了,另外一种情况是最后一个分组不足时,加密轮数为:明文字符串长度/4+1。实现代码如下:if (richTextBox1.TextLength % 4!= 0) for (int n = 0; n 4 * (richTextBox1.TextLength / 4 + 1); n = n + 4) Des(a, key, n); ShowCiphertext(); else for (int n = 0; n 2(i&4)&1;因为在做这个软件的时候看了很多别人的代码,所以学到了不少东西,我看到了有人将什么E盒变换、S盒变换、IP置换、P变换等用一个函数就实现了。再看我代码,我就感觉我的代码重用率很差。还有一些编程方面的习惯也不太好。通过此次实践我发现很多不足,以后还要去弥补这些不足。参考文献1 谭浩强C程序设计(第二版) 清华大学出版社19992杨波现代密码学清华大学出版社20033 郑 莉 C+语言程序设计(第三版) 20044 杨晓光 Visual C#.NET程序设计(修订本) 2006

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号