DES加密解密的实现(课程设计报告)

proof 贡献于2014-02-03

作者 USER  创建于2010-11-17 08:26:00   修改者kuchi  修改于2011-02-24 14:50:00字数8858

文档摘要: DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。在过去近20年的时间里,DES被广泛应用于美国联邦和各种商业信息的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加汕站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密伟输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。
关键词:

本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 成都信息工程学院 课程设计报告 DES加密解密的实现 课程名称:应用密码算法程序设计 学生姓名: 曾 胜 学生学号: 2008122112 专业班级: 信息安全2008级3班 任课教师: 张 金 全 2010年 11 月 5 日 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 附件:课程设计成绩评价表 指导老师评阅成绩表 学习与工作态度(30%) 选题意义(10%) 文献综述(10%) 研究水平与设计能力(20%) 课程设计说明说(论文)撰写质量(20%) 设计创新(10%) 总分 指导老师签名: 年 月 日 课程设计答辩记录及评价表 学生 讲述情况 教师主要 提问记录 学生回答 问题情况 答辩评分 评分项目 分值 评价参考标准 评分 总分 优 良 中 及格 差 选题意义 10 9 8 7 6 4 文献综述 10 9 8 7 6 4 研究水平与设计能力 20 19 17 15 13 10 课程设计说明书(论文)撰写质量 20 19 17 15 13 10 设计创新 10 9 8 7 6 4 答辩效果 30 28 25 22 19 15 答辩小组成员签名 答辩小组组长签名: 年 月 日 课程设计成绩评定表 成绩汇总 评分项目 评分 比例 分数 课程设计总分 指导老师评分 50% 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 答辩小组评分 50% 目 录 1. 背景与意义 3 2. 系统设计 4 2.1系统主要目标 4 2.2主要软件需求(运行环境) 4 2.3功能模块与系统结构 4 2.3.1 密钥模块 4 2.3.2 加密模块 5 2.3.3 解密模块 5 3 系统功能程序设计 5 3.1基本要求部分 5 3.1.1 初始置换IP 5 3.1.2 E盒扩展 6 3.1.3 与密钥进行异或 6 3.1.4 S盒变换 6 3.1.5 P置换运算 7 3.1.6 与左32位进行异或 7 3.1.7 逆IP置换 8 3.1.8 Des加密函数 8 3.1.9 密钥交换 9 3.1.10 Decode()解密函数 10 3.2较高要求部分 11 3.2.1 分组加密实现 11 3.2.2 明文分组最后分组的填充 11 3.3程序界面预览 12 4. 测试报告 12 4.1 密钥中间过程 12 4,2 加密过程中的各步结果 13 4.3 解密过程中的各步结果 13 5 结论 14 参考文献 14 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 1. 背景与意义 DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。在过去近20年的时间里,DES被广泛应用于美国联邦和各种商业信息的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加汕站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密伟输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 2. 系统设计 2.1系统主要目标 基本要求部分: 1.能够对一个明文分组进行加密,加密后能够正确解密。 2.程序运行时可以输出任一组密钥。因为实现了对任意长度明加密,所以没输出每一轮加密后的结果。因为当明文长度过长时,每一轮加密结果会很多。 3.程序有良好的人机交互操作; 较高要求部分: 1.如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充; 2.密钥采用ASCII码,明文输入信息可以是文字(可以是汉字或英文,要求不止一个加密分组长度),任意字符。进行加密后,能够进行正确的解密; 3. 程序代码有比较好的结构,模块划分合理,用类进行封装,通过调用类的成员函数实现加密解密功能。 2.2主要软件需求(运行环境) 本软件用C#语言编写,编写时所用的工具主要是Visual Studio。编辑成功后的.EXE文件可以在装有windows系统的任何计算机上使用。 测试平台:Windows XP Professional 使用软件:Microsoft Visual Studio 2005 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 2.3功能模块与系统结构 该软件由三个模块构成; 2.3.1 密钥模块 private void Key(string str) //此函数用来获取密钥的数组 str是密钥字符串,最后得到钥密二进制数组.用一个类成员数组key来存放。 private void KeyBuild() //此函数用来构造16轮子密钥 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()、Key()、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() //此函数用来分组解密 private void EncodeArray(string st) //此函数用来对16进制的密文转成二进制 private void Decode(ref int[,] plain,int[] key,int n) //解密函数 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 3 系统功能程序设计 3.1基本要求部分 3.1.1 初始置换IP 将IP盒分为左32位和 右32位,将明文左32位和右32位分别进行IP置换,最后既实现了IP置换,同时还将明文分成了左32位和右32位,为下一步做好了准备。 for (i = 0; i < 32; i++) { lData[i] = Encode[IP1[i] - 1]; rData[i] = Encode[IP1[i+32] - 1]; } 循环变量i用来找到IP盒中下标为i的数,IP[i]取出该数,由于计算机中下标是从零开始计算的,而IP[i]表的是明文二进制中第几个数,所以应置换成明文二进制中第IP[i]-1那个数。 3.1.2 E盒扩展 private void EChange(ref int[] rData, ref int[] rDataP) { for (int i = 0; i < 48; i++) { rDataP[i] = rData[E[i] - 1]; } } rData表示要传入的右32位二进制明文,rDataP表示经过E盒变化后的要传回的48位。道理和IP置换差不多。也是找到E盒中相应的数,然后减1找到rData中相应的数,然后存到rDataP中。 3.1.3 与密钥进行异或 for (i = 0; i < 48; i++) { rDataP[i] = rDataP[i] ^ keyArray[k, i]; } keyArray数组中存放的是16伦密钥,k表示第几伦,是从0开始计数的。rDataP是从E盒中出来的48位二进,变化完后,依然存在rDataP数组中. 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 3.1.4 S盒变换 for (i = 0; i < 48; i += 6) { n =i/6; linex = (rDataP[i] << 1) + rDataP[i + 5]; liney = (rDataP[i + 1] << 3) + (rDataP[i + 2] << 2) + (rDataP[i + 3] << 1) + rDataP[i + 4]; FillBin(ref rData, n, S[n, linex, liney]); } Linex变量指S盒的第几行,liney变量指S盒的第几列.“rDataP[i]<<1”表示左移一位。先将rDataP[i]这个数转成二进制,再左移一位,并在最后加零。相当于乘以2。后面是同样的道理。 n=i/6;表示第几个S盒。 实例把101101代入: linex=((rDataP[0]=1)<<1)+(rDataP[0+5]=1)=”10”+”1”=2+1=3; 同理可以算出liney=6; FillBin()参数rData用来输出S盒变换后的32二进制,n第几个S盒,S[n,linex,liney]对应S盒中的相应数. 下面是FillBin的具体代码: private void FillBin(ref int[] rData, int n, int s) { int[] temp = new int[4]; int i; for (i = 0; i < 4; i++) //将S盒中的数转成四位二制数 { temp[i] = s % 2; s = s / 2; } for (i = 0; i < 4; i++) //将每次的四位二进制数存32位rData数组中 { rData[n * 4 + i] = temp[3 - i]; } } 3.1.5 P置换运算 for (i = 0; i < 32; i++) { temp[i] = rData[i]; } 先将经过S盒代替的32位存入temp[]数组中,主要原因是这里输入的32位和输出的32位都是存在rData[]数组中,如果用不同的数组来存放可以不用进行这一步。 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ for (i = 0; i < 32; i++) { rData[i] = temp[P[i] - 1]; } 3.1.6 与左32位进行异或 for (i = 0; i < 32; i++) { rData[i] = lData[i]^rData[i]; } 左322位与右32位异或后依然存放在rData[]数组中,作为下一轮的右32位输入. 3.1.7 逆IP置换 private void IP2Change(ref int[] lData,ref int[] rData,ref int[] Encode) { int[] temp = new int[64]; int i; for (i=0; i < 32; i++) { temp[i] = rData[i]; temp[i + 32] = lData[i]; } for (i = 0; i < 64; i++) { Encode [i] = temp[IP2[i] - 1]; } } 本来最后一轮不应该交换左32位与右32位,但之前我们同样将它们交换了,然后在IP逆置换中将它们再交换回来。这里的temp[]数组就是用实现它们的交换。然后再进行IP逆置换。 3.1.8 Des加密函数 private void Des(int[,] plain, int[] key, int n) { int[] lData = new int[32], rData = new int[32], temp = new int[32], rDataP = new int[48]; int[] Encode = new int[64]; 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 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++) { temp[i] = rData[i]; } EChange(ref rData, ref rDataP); for (i = 0; i < 48; i++) { rDataP[i] = rDataP[i] ^ keyArray[k, i]; } SChange(ref rDataP, ref rData); PChange(ref rData); for (i = 0; i < 32; i++) { rData[i] = lData[i]^rData[i]; } for (i = 0; i < 32; i++) { lData[i] = temp[i]; } } IP2Change(ref lData, ref rData, ref Encode); for (i= 0; i< 64; i++) { strkey[i] = Encode[i]; } } BuildEncode(ref lData, ref rData, ref Encode, n)函数所有明文二进制数组中选出64位,并将它们分成左32位和右32位,rData[]存放右32位,lData存放左32位,Encode[]存放64位.n表示对文明进行分组加密中的第几组. PlainData(ref lData, ref rData, ref Encode)进行IP置换 for (i = 0; i < 32; i++) { temp[i] = rData[i]; } 每一轮进行变化之前先将右32位存入temp[]数组中,作为下一轮的左32位输入。这个循环与下面一起实现该功能 for (i = 0; i < 32; i++) { 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ lData[i] = temp[i]; } 3.1.9 密钥交换 private void Exchange() { int[,] key1 = new int[16,48]; int i, j; for (i = 0; i < 16; i++) { for (j=0;j<48;j++) { key1[i,j]=keyArray [i,j]; } } for (i = 0; i < 16; i++) { for (j = 0; j < 48; j++) { keyArray [15-i,j] = key1[i,j]; } } } 解密时先要将16轮密钥进行交换。 3.1.10 Decode()解密函数 private void Decode(ref int[,] plain,int[] key,int n) { int[] lData = new int[32], rData = new int[32], temp = new int[32], rDataP = new int[48]; int[] Encode = new int[64]; 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++) { temp[i] = rData[i]; } 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ EChange(ref rData, ref rDataP); for (i = 0; i < 48; i++) { rDataP[i] = rDataP[i] ^ keyArray[k, i]; } SChange(ref rDataP, ref rData); PChange(ref rData); for (i = 0; i < 32; i++) { rData[i] = lData[i] ^ rData[i]; } for (i = 0; i < 32; i++) { lData[i] = temp[i]; } } IP2Change(ref lData, ref rData, ref Encode); for (i = 0; i < 64; i++) { strkey[i] = Encode[i]; } } 解密函数一开始也是进行IP置换,而不是进行IP逆置换,因为上一轮结束时的IP逆置换和解密开始的IP置换相乘够成单位矩阵。 3.2较高要求部分 1.实现了对任意长度的明文都能加密。最后一个明文长度不足时在后面添加二进制零,补足64明文二进制。密钥部分通过设定密钥输入框的属性来限定密钥长度最长为8个字符,当不足8个字符时,弹出友好的提示框,提醒用户输入8个字符。 2.密钥用ASCII码,即一个字符用8位二进制数表示。明文可以是任意字符(汉字和英文),明文一个字符用16位二进制数表示。 3.程序代码有比较好的结构,模块划分合理,所有功能都用类成员函数实现,整个软件用一个类实现。 4.界面友好,各种输入输出方便。 3.2.1 分组加密实现 对明文用电码本模式进行分组加密,每一个字符16位二进制,4个字符一个明文分组。相同的明文分组,将得到相同的十六进制字符。 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 3.2.2 明文分组最后分组的填充 在明文字符串转二进制时,就在一个大数组后面加零,最后计算加密轮数时分二种情况,一种情况是刚好最后一个分组明文就完了,另外一种情况是最后一个分组不足时,加密轮数为:明文字符串长度/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 < richTextBox1.TextLength; n = n + 4){ Des(a, key, n); ShowCiphertext(); } } 3.3程序界面预览 每一轮子密钥 密文或明文字符串 密钥字符 明文字符串 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 单击清空时,光标聚焦在明文输入处,同时清空所有框类的信息。单击加密事件时,先判断是否有明文存,不存在则提醒用户。然后进行密钥判断,如果密钥存在则进行加密,不存在则提醒用户。其中密文显示框和密钥显示框用户是不能操作的。单击 时用密文字符代替明文字符框中的明文,同时将密文字符框中的清空。同样单击解密时也要对各框有无内容进行判断。单击演示时会自动在明文框和密钥框中加入字符。 4. 测试报告 测试明文用为:成都信息工程学院. 测试密钥为:12345678 4.1 密钥中间过程 被始密钥的64位: 0011000100110010001100110011010000110101001101100011011100111000 16轮子密钥: 第0轮子密钥010100000010110010101100010101110000101011000010 第1轮子密钥010100001010110010100100010100001010001101000110 第2轮子密钥110100001010110000100110111101001000010010001100 第3轮子密钥111000001010011000100110010010000011011011001011 第4轮子密钥111000001001011000100110001111101111000000101001 第5轮子密钥111000001001001001110010001000100101110101100010 第6轮子密钥101001001101001001110010100011001010100100110010 第7轮子密钥101001100101001101010010111001010100111001010000 第8轮子密钥001001100101001101010011110000111001101001000000 第9轮子密钥001011110101000101010001110100001000011100111100 第10轮子密钥000011110100000111011001000110010001111010001100 第11轮子密钥000111110100000110011001010110000111000010110001 第12轮子密钥000111110000100110001001001000110110100000101101 第13轮子密钥000110110010100010001101101000100011100110010010 第14轮子密钥000110010010110010001100101001010000001100110111 第15轮子密钥010100010010110010001100101001110100001101000000 4,2 加密过程中的各步结果 第一个明文分组: 0110001000010000100100001111110101001111111000010110000001101111 E盒变化后的48位: 100101011001011101010011110011110001010010100010 S盒出来的32位: 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料 本资料由-校园大学生创业网-提供http://www.chuangyw.com/ 01011001011111101011101011100111 P盒变换后的32位: 00110101011110111101110011100111 IP逆置换: 1100101001100110111010011011100011110100000111000000000101101110 经过黑盒测试这些函数,各个步变换都能按要求输出。 4.3 解密过程中的各步结果 密钥还是加密时的密钥,得到16轮子密后,将顺序全部颠倒一下。因为解密过程与加密过相返。 密文第一个分组: 1100101001100110111010011011100011110100000111000000000101101110 E盒出来的48位: 100011111011110011111101010101011011110000000110 S盒出来的32位: 11100011110110010000101000110100 P盒出来32位: 110101101010000111000111011000005 结论 通过做这处软件,我学到了很多东西,首先是更加了解DES算法了,和如何用编程语言去实现各个步骤,例如S盒变变,以前只知道怎么做题,现在可以去实现S变化了。其次是又将以前的C、C**、C#几门语言熟悉了一遍,并且将以前书本上的一些技术自已去用了。最后是我学到了几种不同的方法去实现同一个问题,这也是我认为学习到最重要的地方。比如以前将一个字符转二进制都是先对2求余,再除以2。而我学到另一种方法,比如一个十六进制数如何转成四位二制:y[i]=(x[i>>2]>>(i&4))&1; 因为在做这个软件的时候看了很多别人的代码,所以学到了不少东西,我看到了有人将什么E盒变换、S盒变换、IP置换、P变换等用一个函数就实现了。再看我代码,我就感觉我的代码重用率很差。还有一些编程方面的习惯也不太好。通过此次实践我发现很多不足,以后还要去弥补这些不足。 参考文献 [1] 谭浩强 C程序设计(第二版) 清华大学出版社 1999 [2] 杨波  现代密码学 清华大学出版社 2003 [3] 郑 莉 C++语言程序设计(第三版) 2004 [4] 杨晓光 Visual C#.NET程序设计(修订本) 2006 在线代理http://www.dailiav.com/提供部分资料减肥药排行榜http://pigproxy.cn/提供部分资料

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 2 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档