首页 > 编程知识 正文

c语言程序设计实验报告,c语言实验报告范文

时间:2023-05-06 21:01:18 阅读:163814 作者:4092

《C语言实现DES算法实验报告》由会员共享,可在线阅读。 更多相关《C语言实现DES算法实验报告(29页珍藏版)》请在人人文库网上搜索。

1、xx工程大学实验报告(2015-2016学年第一学期)报告主题: DES加密算法课程名称:密码学b任课教师:专业:学号:姓名: no一六年一月十八日一、课程简介目的:培养学习者编程能力,提高算法要求:给出DES算法的软件实现,并测试DES的加密速度。 二、设计思路用c语言编程,简化了输入输出语句。 预处理时放了iostream包。 使用了std名称空间。 加密时程序输入的明文用8个ascii码生成16个16进制的密文。 脱密时程序输入的密文为16进制16个,生成8个ascii码的明文。 用于加密的密钥全部由16个十六进制数字组成。 其中的十六进制数全部使用大写字母。 日程。

2、序数使用较多的布尔数组,一个bool型变量只占用1比特的存储空间,比int型、char型变量小得多。 这样可以降低程序空间的复杂性。 三.本程序对由8个ascii码组成的明文数据包进行加密,生成由16个十六进制组成的密文。 或者对十六进制16个构成的密文进行解码,生成由8个ascii码构成的明文。 使用的密钥由16个十六进制数构成。 本实验按照输入数据和初始置换、16圈迭代、子密钥生成、逆初始置换和输出数据4个步骤实现了加密算法的设计。 1、输入数据和初始置换本程序首先提示用户输入加密解扰识别码。 加密输入1、解扰输入0、将该识别码存储在整形变量o中。 根据o的值,要求用户输入8个字符(+ )。

3、密集)或16个十六进制(密集)。 输入的明文或密文将转换为二进制文件并存储在布尔数组m65中。 初始替换由函数IP完成,该函数被输入到原始明文m中,该函数将输出结果保存在布尔型阵列mip65中。 函数思想是查找表,包括整形变量阵列ip64,并保存初始变换表IP。 将mip的第I个位分配给m的第ipi个位。 2、子密钥生成输入16个16进制的密钥后,将密钥保存在16位字符数组c中,用ToEr函数变为2进制。 ToEr函数作为字符数组输入,switch语句逐一检查字符数组中的每个位,并将相应的4位二进制文件存在于64位布尔数组k中。 64位密钥去除每1字节的最高有效位,得到56位密钥输入,通过置换选择1进行变换。

4、通过Zhihuan_1函数实现置换选择1,直到各28位。 Zhihuan_1函数的输入为二进制密钥阵列k64,输出为C0和D0,将C0、D0分别存储在28位的布尔阵列c、d中。 函数通过查找表方式生成C0和D0。 根据迭代的轮数决定C和d位移循环的位数,主程序采用16位的整形排列在每个循环中存储左移的位数。 循环左移通过XunHuan函数实现,函数的输入是循环位数和长度为28的布尔数组(c或d ),函数一次只能更改一个布尔数组的值。 为了降低编程复杂度,程序采用串行方式,分两次进行C、d移位。 每当c和d的移位完成时,进行置换选择2。 置换2用zhihuan_2函数进行。 思想和智华。

5、n_1函数相似。 zhihuan_2函数作为移位后的c、d输入,zhihuan_2函数将循环密钥存储在16*48的二维布尔排列kk1749。 kki48表示第I周的圈键。 原理图如图1所示。 需要更换私密(o=0时)圈密钥。 在这种情况下,kk049可以用作中间变量,不需要定义新变量,从而减少了开销。 图1循环密钥生成算法3、16迭代DES的各迭代使用Feistel模型,需要将初始置换后的明文mip数组首先分为l和r,将r的内容先放入等长的布尔数组t,最后将l的值代入t。 然后进入f函数,f函数的原理如图2所示。 图2 F函数原理图程序中的f函数输入有初始置换结果的右半部分的r、循环密钥kk、迭代。

6、圈数I。 输出保存在r中。 用查找表的方法对之前输入的r进行e展开,并将结果保存到48位的布尔数组a中。 然后,将a和圈密钥k按每个比特模式相加。 结果保存在a中。 接下来把a分成8个组,分别放入8个s箱。 for控制循环8次,每次操作选择6位二进制码的前1位和最后1位变换为10进制,控制s盒的行数,再将6位二进制码的中间4位变换为10进制,控制s盒的列数。 至于进入第几个s盒,迭代次数I已经确定。 获取s盒的十进制数后,将其转换为二进制数存储在32位布尔数组t中,采用查表法完成p盒置换,并将最终结果保存在r中。 最后将l和r按比特模式相加,得到新的r,完成一次迭代。 4、反复反向初始置换16次后,首先连接L16和R16,保存至64。

7、在比特布尔数组m中,m用于存储明文,减少了程序占用的空间。 另外,为了保证加密算法的一贯性,在反复时的最后一个循环中不需要交换l和r,但是在程序中为了简化编程的复杂性,在反复时仍然交换l和r。 因此,在连接时需要再次更换l和r。 因此,m的前32位必须存储r,后32位必须存储l。 逆初始置换的原理与初始置换过程相同,因此省略说明。 四.所获得的成果使用私钥201601211438FBCA加密明文81623317,密文为6B217C871EAE79D2H,结果如图3所示。 图3用加密密钥201601211438FBCA解密des加密结果图密文6B217C871EAE79D2,明文为81623317。 结果如图4所示。 图4 DES脱密结。

8、果图转换不同的明文和私钥均可正常加密解密。 不会在报告中罗列。 五.心得DES算法为一

种分组密码算法,本人通过对一个明文分组的加脱密进行编程,耗时近一个月,独立完成了次算法的C+实现。本人的程序不同于网上找的DES算法程序,网上的大多数程序的密文都是以ASCII码来输出的。但是,这样输出的结果有很多乱码出现。因为ASCII码只有在小范围内输出的结果是正常的字母、数字或者符号(从33至127),如果按ASCII输出乱码密文,脱密者就很难键入这些密文,只能通过复制粘贴进行。而VC6.0的环境在控制台中很难进行复制操作,这样如果不借助文件,就很难完成密文的脱密。而密文按16进制输出就不存在这个问题。。

9、二进制串与ASCII码、16进制数之间的转化也是实验的难点之一。C语言的课上没有讲过位运算的相关知识,本人只能通过除以二取余、查表等笨办法进行转化。同样,密钥选用16进制也是一个道理,如果只用字符输入密钥,密钥的每八位就会局限在00100001(33)至01111111(127)范围之内,超过范围就无法用键盘进行输入密钥,这样破译者如果看到了加密程序源代码,相应的穷尽时间会减少。通过本次编程,我发现我对C/C+语言的掌握还是不够,尤其是涉及到位运算。我也会找机会自学这一部分内容。六、附录程序代码:#include using namespace std;void ToEr(char c,boo。

10、l k)int i,j;j=0;for(i=1;io;coutci;ToEr(c,k);if(o=1)coutasci;MtoEr(asc,m);else coutci;ToEr(c,m);for(i=64;i0;i-) mi=mi-1;IP(m,mip);Zhihuan_1(k,C,D);for (i=0;i16;i+) /用for控制循环16次XunHuan(frdmj,C); XunHuan(frdmj,D);/for(j=1;j=28;j+) coutCj;/coutendl;zhihuan_2(C,D,kk,i);if(o=0)for(i=1;i=8;i+)for(j=1;j=48;j+) kk。

11、0j = kkij;kkij = kk17-ij;kk17-ij = kk0j;for(i=1;i=65;i+) if(i=32) Li = mip i;else Ri-32 = mip i;for(i=1;i=16;i+)for (j=1;j=32;j+) Tj = Rj; F(R,kk,i);for (j=1;j=32;j+) Rj = Lj;for (j=1;j=32;j+) Lj = Tj;for(i=1;i=64;i+) if(i=32) mi = Ri;else mi = Li-32;IP2(m,mip);/for (j=1;j=64;j+) coutmipj;/ coutendl。

12、;if(o=1) cout密文是:;for(i=1;i=16;i+) j = 4*(i-1);mouti = mipj+1 * 8 + mipj+2 * 4 + mipj+3 * 2 + mipj+4;coutuppercasehexmouti;coutHendl;elsecout明文是:;for(j=1;j=8;j+) i = 8 * (j-1);cj = mipi+2*64 + mipi+3*32 + mipi+4*16 + mipi+5*8 + mipi+6*4 + mipi+7*2 + mipi+8;for(j=1;j=8;j+) coutcj;coutendl;28 / 29文档可自由编辑。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。