c语言实现des算法des加密算法实验报告

(23页)

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

19.90 积分

xx 工程大学工程大学实验报告实验报告((2015-2016 学年第一学期)学年第一学期)报告题目:报告题目: DES 加密算法加密算法 课程名称:课程名称: 密码学密码学 B 任课教员:任课教员: 专专 业:业: 学学 号:号: 姓姓 名:名: 二二 O 一六年一月十八日一六年一月十八日一、课程概述一、课程概述目的:培养学员的编程能力,理解算法原理。要求:给出 DES 算法的软件实现,测试 DES 的加密速度。二、设计思路二、设计思路使用 C++语言进行编程,简化了输入输出语句。预处理时加入了 iostream 包。使用了 std 名字空间。加密时程序输入的明文是 8 个 ascii 码,生成一个 16 个 16 进制数的密文。脱密时程序输入的密文是 16 个 16 进制数,生成一个 8 个 ascii 码的明文。加脱密所用密钥均由 16 个 16 进制数组成。其中 16 进制数全部使用大写字母。程序中大量使用了的布尔数组,一个 bool 型变量只占用一位存储空间,比 int 型、char 型变量要小的多。这降低了程序的空间复杂度。三、采取的方案三、采取的方案本程序是将一个由 8 个 ascii 码组成的明文分组加密,生成一个由 16 个 16 进制数组成的密文。或将一个由 16 个 16 进制数组成的密文进行脱密,生成一个由 8 个 ascii 码组成的明文。所用密钥由 16 个 16 进制数组成。本实验按照输入数据及初始置换、16 圈迭代、子密钥生成和逆初始置换及输出数据四个步骤实现加密算法设计。1、输入数据及初始置换 本程序首先会提示用户输入加密脱密识别码,加密输入 1,脱密输入 0,将此识别码存入整形变量 o。根据 o 的不同值,提示用户输入 8 个字符(加密)或 16 个 16 进制数(脱密)。输入的明文或密文转化为二进制数后储存到布尔型数组 m[65]中。初始置换通过函数 IP 完成,函数输入为原始明文 m,函数将输出结果保存到布尔型数组 mip[65]中。函数思想为查表,含有一个整形变量数组 ip[64],保存初始变换表 IP。将 mip 的第 i 位赋值为 m 的第 ip[i]位。2、子密钥生成输入 16 个 16 进制数的密钥后,将密钥保存在一个 16 位字符数组 c 中,通过ToEr 函数将之变为二进制数。ToEr 函数输入为字符数组,通过 switch 语句逐个检查字符数组的每一位,将对应的四位二进制数存在 64 位布尔数组 k 中。64 bit 密钥去掉每个字节的最高位得到 56 bit 密钥输入,通过置换选择 1 变换得到0C和0D各 28 bit,通过 Zhihuan_1 函数实现置换选择一。Zhihuan_1 函数输入为二进制密钥数组 k[64],输出为 C0 和 D0,将 C0、D0 分别储存在 28 位布尔数组 C、D 中。函数采用查表方式生成 C0 和 D0。根据迭代的轮数确定 C 和 D 移位循环的位数,主程序中利用一个 16 位整形数组来存放每一次循环左移的位数。循环左移通过 XunHuan 函数实现,函数输入为循环位数和长度为 28 的布尔数组(C 或者 D),函数运行一次只能改变一个布尔数组的值。为了减低编程复杂度,程序使用串行方法,分两次进行 C、D 的移位。每完成一次 C 和 D 的移位,进行一次置换选择二。置换选择二利用 zhihuan_2 函数完成。思想和 Zhihuan_1 函数类似。zhihuan_2 函数输入为移位后的 C、D,zhihuan_2 函数将圈子密钥存放在 16*48 的二维布尔数组 kk[17][49] 中。kk[i][48]表示第 i 圈的圈子密钥。原理图如图 1 所示。脱密(o=0 时)需要将圈子密钥交换,此时可利用 kk[0][49]充当中间变量,无需定义新的变量减少了系统开销。56 28281置换选择密钥?0C0D移位循环1C1D 2置换选择1k2C2D 2置换选择2k ?484816C16D2置换选择16k48移位循环移位循环移位循环移位循环移位循环图 1 圈子密钥生成算法3、16 圈迭代DES 的每一圈迭代采用的是 Feistel 模型,先将初始置换后的明文 mip 数组分成 L和 R 两部分,先将 R 的内容放在等长的布尔数组 T 中,最后时需要将 L 的值赋为 T。之后进入 F 函数,F 函数原理如图 2。P R=a1 a2 …a32 S1 S8 S2 S7 S6 S4 S3 S5 E a’1 a’2 …a’48 ?K=k1 k2 …k48 图 2 F 函数原理图程序中的 F 函数输入有初始置换结果的右半部分 R、圈子密钥 kk、迭代圈数 i。输出保存在 R 中。先将输入的 R 通过查表的方法进行 E 拓展,结果保存在 48 位布尔数组 a中。再将 a 与圈子密钥 k 按位模二加。结果保存在 a 中。接下来将 a 分成 8 组,分别进入 8 个 S 盒。用 for 控制循环 8 次,每次操作选用 6 位二进制代码的开头一位和最后一位转化成十进制数,控制 S 盒的行数,再将 6 位二进制代码的中间四位转化成十进制数,控制 S 盒的列数。进入第几个 S 盒有迭代圈数 i 确定。取到 S 盒中的十进制数后,将它转化成二进制数,储存在 32 位布尔数组 T 中,在使用查表法完成 P 盒置换,最终结果保存在 R 中。最后将 L 与 R 按位模二加,得到新的 R,完成一次迭代。4、逆初始置换16 次迭代后,先将 L16 和 R16 连接起来,保存到 64 位布尔数组 m 中,m 之前用于保存明文,这样减小了程序占用的空间。另外,为了保证加脱密算法的一致性,迭代时最后一圈不需要交换 L 与 R,但程序中为了简化编程复杂度,在迭代时仍然交换了 L 与R。所以在连接时需要再次交换 L 与 R。所以 m 的高 32 位应储存 R,低 32 位应储存 L。逆初始置换原理同初始置换步骤,不再赘述。四、取得的成果四、取得的成果利用密钥 8FBCA 对明文加密,密文为 6B217C871EAE79D2H 结果如图 3 所示。图 3 DES 加密结果图利用密钥 8FBCA 对密文 6B217C871EAE79D2 脱密,明文为。结果如图 4 所示。图 4 DES 脱密结果图变换不同明文及密钥,均可以正常加脱密。在报告中不再罗列。五、心得体会五、心得体会DES 算法是一种分组密码算法,本人通过对一个明文分组的加脱密进行编程,耗时近一个月,独立完成了次算法的 C++实现。本人的程序不同于网上找的 DES 算法程序,网上的大多数程序的密文都是以 ASCII 码来输出的。但是,这样输出的结果有很多乱码出现。因为 ASCII 码只有在小范围内输出的结果是正常的字母、数字或者符号(从 33 至127),如果按 ASCII 输出乱码密文,脱密者就很难键入这些密文,只能通过复制粘贴进行。而 VC6.0 的环境在控制台中很难进行复制操作,这样如果不借助文件,就很难完成密文的脱密。而密文按 16 进制输出就不存在这个问题。二进制串与 ASCII 码、16 进制数之间的转化也是实验的难点之一。C 语言的课上没有讲过位运算的相关知识,本人只能通过除以二取余、查表等笨办法进行转化。同样,密钥选用 16 进制也是一个道理,如果只用字符输入密钥,密钥的每八位就会局限在(33)至(127)范围之内,超过范围就无法用键盘进行输入密钥,这样破译者如果看到了加密程序源代码,相应的穷尽时间会减少。通过本次编程,我发现我对 C/C++语言的掌握还是不够,尤其是涉及到位运算。我也会找机会自学这一部分内容。六、附录六、附录程序代码:#include using namespace std;void ToEr(char c[],bool k[]){int i,j;j=0;for(i=1;i>o;cout>c[i];ToEr(c,k);if(o==1){cout>asc[i];MtoEr(asc,m);}else {cout>c[i];ToEr(c,m);for(i=64;i>0;i--) m[i]=m[i-1];}IP(m,mip);Zhihuan_1(k,C,D);for (i=0;i<16;i++) //用 for 控制循环 16 次{XunHuan(z[i],C); XunHuan(z[i],D);//for(j=1;j<=28;j++) cout<

 天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

c语言des算法实验报告,c语言实现des算法des加密算法实验报告相关推荐

  1. 银行家算法实验报告c语言版,银行家算法实验报告C语言版.doc

    <操作系统>课程综合性实验报告 姓名: 学号: 2016 年 11 月 20 日 实验题目进程调度算法程序设计一.实验目的 通过对安全性算法和银行家算法的模拟,进一步理解资源分配的基本概念 ...

  2. 密码学实验报告c语言程序,密码学_实验一_古典密码算法_C语言.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp实验设计 密码学_实验一_古典密码算法_C语言.doc8页 本 ...

  3. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt

    算法与程序设计实验最小生成树(c语言).ppt 最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因 ...

  4. c语言龙贝格积分法实验报告,数值作业:龙贝格算法计算积分C语言实现

    数值作业:龙贝格算法计算积分C语言实现 数值作业:龙贝格算法计算积分C语言实现 根据Romberg算法计算定积分,和变步长的Simpson算法的输入都一样.算法基本分析:输入a,b(积分上下限),n为 ...

  5. c语言对分查找实验报告,C语言实验指导.doc

    C语言实验指导.doc C语言实验指导(要求认真填写实验报告中的各项内容,不得空白或填写未发现问题)实验一 顺序结构程序设计实验二 选择结构程序设计实验三 循环结构程序设计实验四 一维数组及其应用实验 ...

  6. c语言消字母游戏实验报告,C语言编程实验报告格式示例

    暨南大学数学系数学系,2011年语言课程设计课程实验项目目录学生姓名: 学生ID: 实验项目名称计划时间和课程每组人数实验属性开放要求要求摘要实验1熟悉使用WinTC / VC验证实验2数据类型,运算 ...

  7. c语言时钟报告,C语言图形时钟课程设计实验报告

    C语言图形时钟课程设计实验报告 目录1.系统功能要求.2. 数据结构设计及说明.3.程序结构(画流程图) .4.各模块的功能.5.试验结果(包括输入数据和输出结果) .6.体会.7.参考文献.8.附录 ...

  8. c语言初步实验报告,c语言实验报告(大一c语言实验报告答案)

    哪位帮我一下啊,我这有个作业,要写C语言程序设计实验报告,包括五个部. 最低0.27元/天开通百度文库会员,可在文库查看完整内容> 原发布者:aming7728081 计算机科学与技术系C语言实 ...

  9. 二叉树的基本运算实验报告C语言,实验三 二叉树基本操作与应用实验

    实验三 二叉树基本操作与应用实验 第三次实验主要包括两部分内容:1.二叉树基本操作实验:2.二叉树应用-赫夫曼树与赫夫曼编码实验.基本操作包括存储结构建立和遍历算法,本文只给出部分参考程序,请大家尽量 ...

最新文章

  1. [转] MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
  2. mysql批量插入:语法
  3. 主管护士需要考计算机和英语吗,2020主管护师改为机考,一定要注意这些问题!...
  4. 字符串之将整数字符串转成整数值
  5. android 线程池
  6. 改动office outlook 2007默认文件夹的存放位置
  7. 在Word中如何实现后退?
  8. EFI下WIN8.1和Ubuntu的双系统安装
  9. SpringCloud工作笔记079---SpringBoot中使用CXF集成SpringWebServices_来创建wsdl_WebServices_服务端_以及客户端
  10. wss3.0 对文档库的一些操作
  11. 千千静听 dfx 音效插件_专业团队的蝰蛇音效,好听就是好软件
  12. 计算机应用基础配书光盘,计算机应用基础配书光盘系统客户端
  13. windows下ruby安装环境配置
  14. IE浏览器兼容性问题!(按alt+x+b不弹出兼容性窗口)
  15. 在python中,计算Sum = m + mm + mmm +mmmm+.....+mmmmm.....,输入两个数m,n。m的位数累加到n的值,列出算式并计算出结果:
  16. sin(ωt),一文和正弦函数、频域、周期的头疼说白白
  17. C#+ArcEgine开发(2)添加shp和lyr文件
  18. 【攻防世界WEB】难度三星9分入门题(上):simple_js、mfw
  19. 关于glew.h / glut.h引用【转】
  20. css公共样式插入音乐,【超全】常用的css公共样式

热门文章

  1. 电脑开机黑屏提示:ERROR 0199:System Security-Security password retry count exceeded(by 星空武哥)
  2. python爬取pubmed的文献_爬虫获取pubmed中文献的标题和摘要
  3. 2018年全国职业院校技能大赛中职组网络空间安全正式赛卷
  4. web前端开发基础教程一
  5. ftpClient读取文件流的偶尔会是空文件
  6. 一直帮助别人,自己的事都做不好 其实也是非常自私的一种行为
  7. 梦幻西游服务器维护,《梦幻西游》12月1日维护公告
  8. collection中cell选中状态下分享图片的快照snapshot
  9. Mac苹果电脑远程的方法和教程
  10. 十个python热门项目,你知道几个