1、1成 都 信 息 工 程 学 院课 程 设 计 报 告DES算法加密与解密的设计与实现课程名称: 密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: XX 年 XX 月 XX 日2指导老师评阅成绩表学习与工作态度(30%)选题意义(10%)研究水平与设计能力(25%)课程设计说明说(论文)撰写质量(25%)设计创新(10%) 总分指导老师签名: 年 月 日课程设计答辩记录及评价表学生讲述情况教师主要提问记录学生回答问题情况评价参考标准评分项目 分值 优 良 中 及格 差 评分 总分选题意义 10 9 8 7 6 4研究水平与设计能力 25 23 20 18 15 10课程设计说明
2、书(论文)撰写质量 25 23 20 18 15 10设计创新 10 9 8 7 6 4答辩评分答辩效果 30 28 25 22 19 15答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表评分项目 评分 比例 分数 课程设计总分成绩汇总 指导老师评分 50%3答辩小组评分 50%4目录1 背景 .11.1 DES 算法概述 .11.2 DES 算法描述 .12 系统设计 .32.1 系统主要目标 32.2 系统运行环境 43 功能需求分析 .43.1 整体功能分析 43.2 DES 算法一轮的功能分析 .44 模块划分 .54.1 初始置换 .54.2 轮结构 .64.2.1
3、E 盒扩充变换 .64.2.2 S 盒压缩变换 .74.2.3 P 盒置换 .74.3 逆初始置换 .85 程序分模块实现 .85.1 将字符串转换成二进制流 85.2 子密钥的产生 95.3F 函数的计算 .95.4 16 轮加密的实现 .105.5 把密钥,密文,明文的二进制转换为 10 进制 115.6 解密的实现 115.7 程序运行界面预览 116 测试报告 .116.1 程序总体运行情况 126.2 密钥中间过程 126.3 加密过程的中间结果 136.4 解密过程的中间结果 147 课程报告总结 .1411 背景1.1 DES 算法概述DES(Data Encryption St
4、andard)是由美国 IBM 公司于 20 世纪 70 年代中期的一个密码算(LUCIFER)发展而来,在 1977 年 1 月 15 日,美国国家标准局正式公布实施,并得到了 ISO 的认可,在过去的 20 多年时间里,DES 被广泛应用于美国联邦和各种商业信息的保密工作中,经受住了各种密码分析和攻击,有很好的安全性。然而,目前 DES 算法已经被更为安全的 Rijndael 算法取代,但是 DES 加密算法还没有被彻底的破解掉,仍是目前使用最为普遍的对称密码算法。所以对 DES 的研究还有很大价值,在国内 DES 算法在 POS、ATM 、磁卡及智能卡(IC 卡) 、加油站、高速公路收费
5、站等领域被广泛应用,以此来实现关键的数据保密,如信用卡持卡人的PIN 码加密传输,IC 卡与 POS 机之间的双向认证、金融交易数据包的 MAC校验等,均用到 DES 算法。DES 算法是一种采用传统的代替和置换操作加密的分组密码,明文以64 比特为分组,密钥长度为 64 比特,有效密钥长度是 56 比特,其中加密密钥有 8 比特是奇偶校验,DES 的加密和解密用的是同一算法,它的安全性依赖于所用的密钥。它首先把需要加密的明文划分为每 64 比特的二进制的数据块,用 56 比特有效密钥对 64 比特二进制数据块进行加密,每次加密可对 64 比特的明文输入进行 16 轮的替换和移位后,输出完全不
6、同的 64 比特密文数据。由于 DES 算法仅使用最大为 64 比特的标准算法和逻辑运算,运算速度快,密钥容易产生,适合于在大多数计算机上用软件快速实现,同样也适合于在专用芯片上实现。1.2 DES 算法描述DES 算法的加密过程首先对明文分组进行操作,需要加密的明文分组固定为 64 比特的块。图 1-1 是 DES 加密算法的加密流程。图 1-2 是密钥扩展处理过程。2图 1-1DES 加密算法流程3图 1-2 子密钥产生流程2 系统设计2.1 系统主要目标(1)用 C+设计一个 DES 加密/解密软件系统;(2)完成一个明文分组的加解密,明文和密钥是 ASCII 码,长度都为 8 个字符,
7、输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;(3)程序运行时,要求输出第 15、16 轮的密钥,以及第 15、16 轮加密或解密之后的值,16 进制表示;(4)程序有良好的人机交互操作;(5)要求从两个文件分别读取明文和密钥,并在程序中输出明文及密钥;(6)要求提供所设计系统的报告及完整的软件。42.2 系统运行环境本软件用 C语言编写,编写时所用的工具主要是 Microsoft Visual C+6.0。编辑成功后的.EXE 文件可以在装有 windows系统的任何计算机上使用。测试平台:Windows 7 旗舰版使用软件:Microsoft Visual C+6.03 功能需
8、求分析3.1 整体功能分析3.2 DES 算法一轮的功能分析54 模块划分4.1 初始置换首先输入 64 比特的明文块,按照初始置换(IP)表进行置换,DES 初始置换表如图 3-1 所示。6图 4-1 初始置换表4.2 轮结构经过 DES 算法第一阶段的初始置换得到的 64 比特块分为两部分,前 32 位为左半部分,后 32 位为右半部分,如上面图 3-2 所示,DES 算法的论结构分为左右两部分 32 比特在每一轮中被独立处理。具体过程为:下一轮左半部分 32 比特 等于上一轮右半部分 32 比特;而下一轮右半部分的 32 比特 的计算则是由上一轮右半部分 和轮密钥 输入到1 1 F 函数
9、中进行变换,变换结果与上一轮左半部分 进行异或运算,得到 。因此每一轮的变 换可由下面公式表示: =11=1(1,)4.2.1 E 盒扩充变换将右半部分的 32 比特,进行 E 盒扩展,扩展成为 48 比特。具体变换过程为把输入的32 比特按照 8 行 4 列方式依次排列,形成一个 8*4 矩阵,然后 E 盒扩展之后输出 8*6 矩阵。图 4-2 E 盒扩展74.2.2 S 盒压缩变换将 E 盒的输出与子密钥进行异或得到的 48 比特作为 S 盒的输入,进入 S 盒变换,48比特压缩为 32 比特。S 盒的安全性能是保证 DES 算法安全性的源泉,DES 算法共有 8 个不同的 S 盒,每个
10、S 盒接受 6 位输入,输出 4 位。8 个 S 盒如下:4.2.3 P 盒置换S 盒输出的 32 比特经过 P 盒置换,重新编排 32 比特的位置。下图为 P 盒置换过程。8图 4-3P 盒置换4.3 逆初始置换DES 算法进行完 16 轮运算之后,需要进行逆初始置换,逆初始置换正好为初始置换的逆,如一个矩阵进行初始置换之后输出,在进行依次逆初始置换的输出结果为初始矩阵。5 程序分模块实现5.1 将字符串转换成二进制流用 ToBin()函数把输入的明文、密钥、密文转换为二进制流,其中 p 是输入的字符串,b 是转换后的二进制流。void To2Bin(char p,int b) int i=
11、0,k=0;for(i=0;i=1) if(j else bk+=0; 9 5.2 子密钥的产生子密钥产生函数:SubKey() ,其中参数 K0 为输入的密钥。用到 Replacement()函数,此函数实现密钥 PC_1 置换,和 PC_2 置换。Lif_move() 函数实现每一轮的左移位功能。void SubKey(int K0) /子密钥产生函数int i=0;int K156,K256;int C1728,D1728;Replacement(K0,PC_1,K1,56); /密钥置换 PC_1for(i=0;i28;i+) /将 PC_1 输出的 56 比特分为左右两部分C0i=K
12、1i;D0i=K1i+28;i=0;while(i16)int j;lif_move(Ci,Ci+1,move_timesi);lif_move(Di,Di+1,move_timesi);for(j=0;j28;j+)K2j=Ci+1j;K2j+28=Di+1j;Replacement(K2,PC_2,Ki,48); /密钥置换 PC_2i+;5.3F 函数的计算F 函数为加密做准备,其中的 Replacement()实现 E 盒扩展, P 盒置换。S_compress()函数实现 S 盒的压缩变化。void F_Function(int a32,int b32,int n) /F 函数10i
13、nt i;int tmp48;int tep32;Replacement(a,E_Table,tmp,48);for(i=0;i48;i+)tmpi=tmpiKni;S_compress(tmp,tep);Replacement(tep,P_Table,b,32);5.4 16 轮加密的实现Encryption()函数实现 16 轮加密,其中 F_Function()函数即为 F 函数。void Encryption(int m064,int c164)int i,k;int arry32;int c064,m164;Replacement(m0,IP_Table,m1,64); /初始置换
14、IPfor(i=0;i32;i+)L0i=m1i;R0i=m1i+32;k=1;while(k17)F_Function(Rk-1,arry,k-1);for(i=0;i32;i+)Lki=Rk-1i;Rki=Lk-1iarryi;k+;for(i=0;i32;i+)c0i=R16i;11c0i+32=L16i;Replacement(c0,IP_1_Table,c1,64); /逆初始置换5.5 把二进制转换为 10 进制转换为十进制是为输出 16 进制做准备,To10()函数把每四个字节转换成一个 10 进制数。5.6 解密的实现解密函数 Decryption() ,解密过程中先有 cha
15、nge()函数把密钥互换,然后用和加密相同的算法则可正确解密。5.7 程序运行界面预览可根据需要选择加密和解密,加密又可选择直接输入明文和密钥或是从文件读取明文和密钥。126 测试报告测试明文:12345678测试密钥:123456786.1 程序总体运行情况加密情况:6.2 密钥中间过程16 轮子密钥如下:13子密钥生成过程中的值:14经过测试这些函数,能够得到正确的 16 轮密钥6.3 加密过程的中间结果初始二进制明文和密钥:初始 IP:第一轮 E 盒扩展结果:第一轮 S 盒输出:第一轮 P 盒置换结果:IP 逆置换:经过对个函数的测试,能正确加密。6.4 解密过程的中间结果解密的密钥还是
16、加密时的密钥,得到 16 轮子密后,将顺序全部颠倒一下。因为解密过程与加密过相返。准备解密的密文:15初始 IP:第一次 E 盒扩展:第一次 S 盒压缩:第一次 P 盒置换:解密后的二进制结果:经过对个函数的测试,能正确加密。7 课程报告总结通过这次程序设计,我学到了很多东西,首先更深入的理解了 DES 算法,不仅完完全全弄懂了 DES 算法的各个过程,像密钥产生过程中的左移位、S 盒的压缩变换等,也能一一实现。其次也提高了编程技巧,在处理一些问题时能选择较佳的方法。因为在做这个软件的时候看了很多别人的代码,所以我还是学到了不少东西,我看到别人的封装更好,代码也整洁,使用一些更好的实现方法。再看我代码,我就感觉我的代码重用率很差。还有一些编程方面的习惯也不太好。通过此次实践我发现很多不足,以后还要去弥补这些不足。参考文献:1 谭浩强 C 程序设计(第三版) 清华大学出版社 20092 张世斌 万武南 张金全 孙宣东 现代密码学 西安电子科技大学出版社 2009