收藏 分销(赏)

DES算法实现-课程设计.doc

上传人:胜**** 文档编号:2522983 上传时间:2024-05-31 格式:DOC 页数:16 大小:372.50KB
下载 相关 举报
DES算法实现-课程设计.doc_第1页
第1页 / 共16页
DES算法实现-课程设计.doc_第2页
第2页 / 共16页
DES算法实现-课程设计.doc_第3页
第3页 / 共16页
DES算法实现-课程设计.doc_第4页
第4页 / 共16页
DES算法实现-课程设计.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

1、通达学院课程设计报告( 2016/ 2017学年 第 1 学期)题 目: DES算法实现 专 业 计算机科学与技术(信息安全)学 生 姓 名 班 级 学 号 指 导 教 师 王 波 指 导 单 位 计算机学院信息安全系 日 期 评 分 细 则评分项优秀良好中等差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度回答问题准确度简 短 评 语教师签名: 年 月 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格DES算法的实现一、 课题内容和要求对称加密就是加密和解密所用的密钥是一

2、样的,加密的强度很大程度上在于密钥的强度以及加密算法的保密,最常见的对称加密算法有DES、IDEA、RC4、RC5等。本设计题要求实现DES加密和解密算法,能对文件实现加解密。二、对设计要求的理解DES是一个分组密码算法,使用64位密钥(除去8位奇偶校验,实际密钥长度为56位)对64比特的数据分组(二进制数据)加密,产生64位密文数据。DES是一个对称密码体制,加密和解密使用同意密钥,解密和加密使用同一算法(这样,在硬件与软件设计时有利于加密单元的重用)。DES的所有的保密性均依赖于密钥。程序主要采取对数据的位操作的形式,把明密文文件中的内容以字节为单位读取,每次读取8个byte共65bits

3、,然后使用标准DES的算法依次对读取的64bits明密文进出加解密处理。文件的路径的输入有比较严格的格式约束。如:盘符名:文件名.txt 格式错误则会导致文件打开失败,不能进行加解密操作。三、概要设计 这个程序主要是 DES算法部分的 加密和解密,还有后面对文件的操作。 程序主要流程图如下: 图-1 程序流程图这个程序的关键在DES算法的操作,主要有下的主要步骤:1.初始置换 IP;2.子密钥 Ki 的获取;3.密码函数 f ;4.尾置换 IP-1 ;下面是具体的几个过程:1) 初始置换IP这一部分很简单,IP(initial permutation)是一个 8x8 的置换表:int IP =

4、 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 ; 根据表中的规定,将输入的 64 位明文重新进行排序,即将第 58 位放到第 1 位,第 50 位放到第

5、 2 位以此类推。初始置换以后得到的是一个 64 位的输出。 2) 子密钥 Ki 的获取用户输出的密钥是 64 位的,根据密钥置换表PC-1,将 64 位变成 56 位密钥。(去掉了奇偶校验位)将 PC-1 置换得到的 56 位密钥,分为前28位 C0 和后28位 D0,分别对它们进行循环左移,C0左移得到 C1,D0 左移得到 D1。将 C1 和 D1 合并成 56 位,然后通过PC-2表进行压缩置换,得到当前这一轮的 48 位子密钥 K1 。然后对 C1 和 D1 进行左移和压缩置换,获取下一轮的子密钥一共进行16轮,得到 16 个 48 位的子密钥。 3) 密码函数 fl 密码函数f(R

6、, K)接受两个输入:32 位的数据和 48 位的子密钥。然后:l 通过表 E 进行扩展置换,将输入的 32 位数据扩展为 48 位;l 将扩展后的 48 位数据与 48 位的子密钥进行异或运算;l 将异或得到的 48 位数据分成 8 个 6 位的块,每一个块通过对应的一个 S 表产生一个 4 位的输出。其中,每个 S 表都是 4 行 16 列。具体的置换过程如下:把 6 位输入中的第 1 位和第 6 位取出来行成一个两位的二进制数 x ,作为 Si 表中的行数(03);把 6 位输入的中间 4 位构成另外一个二进制数 y,作为 Si 表的列数(015);查出 Si 表中 x 行 y 列所对应

7、的整数,将该整数转换为一个 4 位的二进制数。把通过 S 表置换得到的 8 个 4 位连在一起,形成一个 32 位的数据。然后将该 32 位数据通过表 P 进行置换(称为P-置换),置换后得到一个仍然是 32 位的结果数据,这就是f(R, K)函数的输出。4) 尾置换IP-1合并 L16 和 R16 得到一个 64 位的数据,再经过尾置换后得到的就是 64 位的密文。注意:要将 L16和 R16 合并成 R16L16(即左右互换)。尾置换表IP-1如下:int IP_1 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31

8、, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25; 四、关键技术难点分析 在 DES 算法的实现中,我用 C+ STL 中的bitset来操作二进制位。下面是对一个 64 位数据进行加密解密的源代码:bitset key; / 64位密钥 bitset subKey16; /

9、存放16轮子密钥 / 初始置换表 int IP = 58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6,64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3,61, 53, 45, 37, 29, 21, 13, 5,63, 55, 47, 39, 31, 23, 15, 7 ;/ 结尾置换表 int IP_1 = 40, 8, 48, 16,

10、56, 24, 64, 32,39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30,37, 5, 45, 13, 53, 21, 61, 29,36, 4, 44, 12, 52, 20, 60, 28,35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25 ;/*-下面是生成密钥所用表-*/ 密钥置换表,将64位密钥变成56位 int PC_1 = 57, 49, 41, 33, 25, 17, 9,1,

11、58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27,19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15,7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29,21, 13, 5, 28, 20, 12, 4 ;/ 压缩置换,将56位密钥压缩成48位子密钥 int PC_2 = 14, 17, 11, 24, 1, 5,3, 28, 15, 6, 21, 10,23, 19, 12, 4, 26, 8,16, 7, 27, 20, 13, 2,41

12、, 52, 31, 37, 47, 55,30, 40, 51, 45, 33, 48,44, 49, 39, 56, 34, 53,46, 42, 50, 36, 29, 32 ;/ 每轮左移的位数 int shiftBits = 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 ;/*-下面是密码函数 f 所用表-*/ 扩展置换表,将 32位 扩展至 48位 int E = 32, 1, 2, 3, 4, 5,4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17,

13、18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1 ;/ S盒,每个S盒是4x16的置换表,6位 - 4位 int S_BOX8416 = 14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7 , 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8 , 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0 , 15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13 , 15,1,8,14,6,1

14、1,3,4,9,7,2,13,12,0,5,10 , 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5 , 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15 , 13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9 , 10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8 , 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1 , 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7 , 1,10,13,0,6,9,8,7,4,15,14,3,11,5,

15、2,12 , 7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15 , 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9 , 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4 , 3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 , 2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9 , 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6 , 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14 , 11,8,12,7,1,1

16、4,2,13,6,15,0,9,10,4,5,3 , 12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11 , 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8 , 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6 , 4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 , 4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1 , 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6 , 1,4,11,13,12,3,7,14,10,15,6,8,0,5

17、,9,2 , 6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 , 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7 , 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2 , 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8 , 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 ;/ P置换,32位 - 32位 int P = 16, 7, 20, 21,29, 12, 28, 17,1, 15, 23, 26,5, 18, 31, 10,2, 8, 24, 14,

18、32, 27, 3, 9,19, 13, 30, 6,22, 11, 4, 25 ;/*/* */* 下面是DES算法实现 */* */*/* 密码函数f,接收32位数据和48位子密钥,产生一个32位的输出*/bitset f(bitset R, bitset k)bitset expandR;/ 第一步:扩展置换,32 - 48 for (int i = 0; i48; +i)expandR47 - i = R32 - Ei;/ 第二步:异或 expandR = expandR k;/ 第三步:查找S_BOX置换表 bitset output;int x = 0;for (int i = 0

19、; i48; i = i + 6)int row = expandR47 - i * 2 + expandR47 - i - 5;int col = expandR47 - i - 1 * 8 + expandR47 - i - 2 * 4 + expandR47 - i - 3 * 2 + expandR47 - i - 4;int num = S_BOXi / 6rowcol;bitset binary(num);output31 - x = binary3;output31 - x - 1 = binary2;output31 - x - 2 = binary1;output31 - x

20、 - 3 = binary0;x += 4;/ 第四步:P-置换,32 - 32 bitset tmp = output;for (int i = 0; i32; +i)output31 - i = tmp32 - Pi;return output;/* 对56位密钥的前后部分进行左移*/bitset leftShift(bitset k, int shift)bitset tmp = k;for (int i = 27; i = 0; -i)if (i - shift0)ki = tmpi - shift + 28;elseki = tmpi - shift;return k;/* 生成16

21、个48位的子密钥*/void generateKeys()bitset realKey;bitset left;bitset right;bitset compressKey;/ 去掉奇偶标记位,将64位密钥变成56位 for (int i = 0; i56; +i)realKey55 - i = key64 - PC_1i;/ 生成子密钥,保存在 subKeys16 中 for (int round = 0; round16; +round)/ 前28位与后28位 for (int i = 28; i56; +i)lefti - 28 = realKeyi;for (int i = 0; i

22、28; +i)righti = realKeyi;/ 左移 left = leftShift(left, shiftBitsround);right = leftShift(right, shiftBitsround);/ 压缩置换,由56位得到48位子密钥 for (int i = 28; i56; +i)realKeyi = lefti - 28;for (int i = 0; i28; +i)realKeyi = righti;for (int i = 0; i48; +i)compressKey47 - i = realKey56 - PC_2i;subKeyround = compr

23、essKey;/* 工具函数:将char字符数组转为二进制*/bitset charToBitset(const char s8)bitset bits;for (int i = 0; i8; +i)for (int j = 0; j j) & 1);return bits;/* DES加密*/bitset encrypt(bitset& plain)bitset cipher;bitset currentBits;bitset left;bitset right;bitset newLeft;/ 第一步:初始置换IP for (int i = 0; i64; +i)currentBits63

24、 - i = plain64 - IPi;/ 第二步:获取 Li 和 Ri for (int i = 32; i64; +i)lefti - 32 = currentBitsi;for (int i = 0; i32; +i)righti = currentBitsi;/ 第三步:共16轮迭代 for (int round = 0; round16; +round)newLeft = right;right = left f(right, subKeyround);left = newLeft;/ 第四步:合并L16和R16,注意合并为 R16L16 for (int i = 0; i32;

25、+i)cipheri = lefti;for (int i = 32; i64; +i)cipheri = righti - 32;/ 第五步:结尾置换IP-1 currentBits = cipher;for (int i = 0; i64; +i)cipher63 - i = currentBits64 - IP_1i;/ 返回密文 return cipher;/* DES解密*/bitset decrypt(bitset& cipher)bitset plain;bitset currentBits;bitset left;bitset right;bitset newLeft;/ 第一

26、步:初始置换IP for (int i = 0; i64; +i)currentBits63 - i = cipher64 - IPi;/ 第二步:获取 Li 和 Ri for (int i = 32; i64; +i)lefti - 32 = currentBitsi;for (int i = 0; i32; +i)righti = currentBitsi;/ 第三步:共16轮迭代(子密钥逆序应用) for (int round = 0; round16; +round)newLeft = right;right = left f(right, subKey15 - round);left

27、 = newLeft;/ 第四步:合并L16和R16,注意合并为 R16L16 for (int i = 0; i32; +i)plaini = lefti;for (int i = 32; i64; +i)plaini = righti - 32;/ 第五步:结尾置换IP-1 currentBits = plain;for (int i = 0; i64; +i)plain63 - i = currentBits64 - IP_1i;/ 返回明文 return plain;下面是对于文件的函数实现: void encryptfile()string a, b, k;cout 请输入待加密文件

28、名(完整路径): a;cout 请输入密钥: k;cout 请输入密文文件名(完整路径): b;key = charToBitset(k.c_str();generateKeys(); / 生成16个子密钥 ifstream in;ofstream out;in.open(a, ios:binary);out.open(b, ios:binary);bitset plain;while (in.read(char*)&plain, sizeof(plain)bitset cipher = encrypt(plain);out.write(char*)&cipher, sizeof(cipher

29、);plain.reset(); / 置0 in.close();out.close();cout 加密成功,密文文件在 b endl;void decodefile() string a, b, k;cout 请输入密文文件名(完整路径): a;cout 请输入密钥: k;cout 请输入解密后文件名(完整路径): b;key = charToBitset(k.c_str();generateKeys(); / 生成16个子密钥 ifstream in;ofstream out;in.open(a, ios:binary);out.open(b, ios:binary);bitset pla

30、in;while (in.read(char*)&plain, sizeof(plain)bitset temp = decrypt(plain);out.write(char*)&temp, sizeof(temp);plain.reset(); / 置0 in.close();out.close();cout 解密成功,明文文件在 b endl;五、测试数据及其结果分析设计结果和性能分析这个程序通过循环来对文件加密,每64位进行加密,直到文件结束,不足64位补足加密。 现在对一个文本文件13001528.txt进行加密 文件内容为图-2 待加密明文文件13001528.txt进行加密操作:

31、图-3 加密操作界面显示加密成功。 密文文件为:图-4 密文文件再通过解密:图-5 解密界面打开明文文件 :图-6 解密后明文文件通过以上的结果可以看出解密后的明文和原文件是相同的,这个程序满足的设计的需求。六、课程设计总结 这次的课程设计是我不太熟悉的关于加密DES算法的相关的程序,这一次通过查阅之前的书本,和在网上看一些大牛写的文章,写出了这个程序,通过这次的学习对于密码学的DES算法的部分算是有了一些的掌握,但是这个程序没有对时间和空间进行优化,对于加密数据大的文件,加密解密速度很慢。这也需要在以后的学习中解决。总之这次的程序设计收获很多。1. 基于C8051F单片机直流电动机反馈控制系

32、统的设计与研究2. 基于单片机的嵌入式Web服务器的研究 3. MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究 4. 基于模糊控制的电阻钎焊单片机温度控制系统的研制 5. 基于MCS-51系列单片机的通用控制模块的研究 6. 基于单片机实现的供暖系统最佳启停自校正(STR)调节器7. 单片机控制的二级倒立摆系统的研究8. 基于增强型51系列单片机的TCP/IP协议栈的实现 9. 基于单片机的蓄电池自动监测系统 10. 基于32位嵌入式单片机系统的图像采集与处理技术的研究11. 基于单片机的作物营养诊断专家系统的研究 12. 基于单片机的

33、交流伺服电机运动控制系统研究与开发 13. 基于单片机的泵管内壁硬度测试仪的研制 14. 基于单片机的自动找平控制系统研究 15. 基于C8051F040单片机的嵌入式系统开发 16. 基于单片机的液压动力系统状态监测仪开发 17. 模糊Smith智能控制方法的研究及其单片机实现 18. 一种基于单片机的轴快流CO,2激光器的手持控制面板的研制 19. 基于双单片机冲床数控系统的研究 20. 基于CYGNAL单片机的在线间歇式浊度仪的研制 21. 基于单片机的喷油泵试验台控制器的研制 22. 基于单片机的软起动器的研究和设计 23. 基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究

34、 24. 基于单片机的机电产品控制系统开发 25. 基于PIC单片机的智能手机充电器 26. 基于单片机的实时内核设计及其应用研究 27. 基于单片机的远程抄表系统的设计与研究 28. 基于单片机的烟气二氧化硫浓度检测仪的研制 29. 基于微型光谱仪的单片机系统 30. 单片机系统软件构件开发的技术研究 31. 基于单片机的液体点滴速度自动检测仪的研制32. 基于单片机系统的多功能温度测量仪的研制 33. 基于PIC单片机的电能采集终端的设计和应用 34. 基于单片机的光纤光栅解调仪的研制 35. 气压式线性摩擦焊机单片机控制系统的研制 36. 基于单片机的数字磁通门传感器 37. 基于单片机

35、的旋转变压器-数字转换器的研究 38. 基于单片机的光纤Bragg光栅解调系统的研究 39. 单片机控制的便携式多功能乳腺治疗仪的研制 40. 基于C8051F020单片机的多生理信号检测仪 41. 基于单片机的电机运动控制系统设计 42. Pico专用单片机核的可测性设计研究 43. 基于MCS-51单片机的热量计 44. 基于双单片机的智能遥测微型气象站 45. MCS-51单片机构建机器人的实践研究 46. 基于单片机的轮轨力检测 47. 基于单片机的GPS定位仪的研究与实现 48. 基于单片机的电液伺服控制系统 49. 用于单片机系统的MMC卡文件系统研制 50. 基于单片机的时控和计

36、数系统性能优化的研究 51. 基于单片机和CPLD的粗光栅位移测量系统研究 52. 单片机控制的后备式方波UPS 53. 提升高职学生单片机应用能力的探究 54. 基于单片机控制的自动低频减载装置研究 55. 基于单片机控制的水下焊接电源的研究 56. 基于单片机的多通道数据采集系统 57. 基于uPSD3234单片机的氚表面污染测量仪的研制 58. 基于单片机的红外测油仪的研究 59. 96系列单片机仿真器研究与设计 60. 基于单片机的单晶金刚石刀具刃磨设备的数控改造 61. 基于单片机的温度智能控制系统的设计与实现 62. 基于MSP430单片机的电梯门机控制器的研制 63. 基于单片机

37、的气体测漏仪的研究 64. 基于三菱M16C/6N系列单片机的CAN/USB协议转换器 65. 基于单片机和DSP的变压器油色谱在线监测技术研究 66. 基于单片机的膛壁温度报警系统设计 67. 基于AVR单片机的低压无功补偿控制器的设计 68. 基于单片机船舶电力推进电机监测系统 69. 基于单片机网络的振动信号的采集系统 70. 基于单片机的大容量数据存储技术的应用研究 71. 基于单片机的叠图机研究与教学方法实践 72. 基于单片机嵌入式Web服务器技术的研究及实现 73. 基于AT89S52单片机的通用数据采集系统 74. 基于单片机的多道脉冲幅度分析仪研究 75. 机器人旋转电弧传感

38、角焊缝跟踪单片机控制系统 76. 基于单片机的控制系统在PLC虚拟教学实验中的应用研究77. 基于单片机系统的网络通信研究与应用 78. 基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究79. 基于单片机的模糊控制器在工业电阻炉上的应用研究 80. 基于双单片机冲床数控系统的研究与开发 81. 基于Cygnal单片机的C/OS-的研究82. 基于单片机的一体化智能差示扫描量热仪系统研究 83. 基于TCP/IP协议的单片机与Internet互联的研究与实现 84. 变频调速液压电梯单片机控制器的研究 85. 基于单片机-免疫计数器自动换样功能的研究与实现 86. 基于单片机的倒立摆控制系统设计与实现 87. 单片机嵌入式以太网防盗报警系统 88. 基于51单片机的嵌入式Internet系统的设计与实现 89. 单片机监测系统在挤压机上的应用 90. MSP430单片机在智能水表系统上的研究与应用 91. 基于单片机的嵌入式系统中TCP/IP协议栈的实现与应用92. 单片机在高楼恒压供水系统中的应用 93. 基于ATmega16单片机的流量控制器的开发 94. 基于MSP430单片机的远程抄表系统及智能网络水表的设计95. 基于MSP430单片机具有数据存储与回放功能的嵌入式电子血压计的设计 96. 基于单片机的氨分解率检测系统的研究与开发 97.

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服