C语言实现DES算法实验报告_第1页
C语言实现DES算法实验报告_第2页
C语言实现DES算法实验报告_第3页
C语言实现DES算法实验报告_第4页
C语言实现DES算法实验报告_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、xx 大学实验报告报告题目:课程名称:任课教员:专学姓业:号:名:DES 加密算法密码学 B年 月 日一、课程概述目的:培养学员的编程能力,理解算法原理。要求:给出 DES 算法的软件实现,测试DES 的加密速度。二、设计思路使用 C+ 语言进行编程,简化了输入输出语句。预处理时加入了用了 std 名字空间。加密时程序输入的明文是脱密时程序输入的密文是8 个 ascii 码,生成一个 16 个 16 进制数的密文。16 个 16 进制数,生成一个 8 个 ascii 码的明文。iostream 包。使加脱密所用密钥均由 16 个 16 进制数组成。其中 16 进制数全部使用大写字母。程序中大量

2、使用了的布尔数组,一个bool 型变量只占用一位存储空间,比int 型、char 型变量要小的多。这降低了程序的空间复杂度。三、采取的方案本程序是将一个由 8 个 ascii 码组成的明文分组加密,生成一个由组成的密文。或将一个由码组成的明文。所用密钥由16 个 16 进制数8 个 ascii16 个 16 进制数组成的密文进行脱密,生成一个由16 个 16 进制数组成。本实验按照输入数据及初始置换、据四个步骤实现加密算法设计。1、输入数据及初始置换16 圈迭代、子密钥生成和逆初始置换及输出数本程序首先会提示用户输入加密脱密识别码,加密输入1,脱密输入 0,将此识别码存入整形变量 o。根据 o

3、 的不同值,提示用户输入 8 个字符(加密)或 16 个 16 进制数(脱密)。输入的明文或密文转化为二进制数后储存到布尔型数组初始置换通过函数 IP 完成,函数输入为原始明文m65 中。m,函数将输出结果保存到布尔型数组 mip65 中。函数思想为查表, 含有一个整形变量数组 ip64 ,保存初始变换表 IP。将 mip 的第 i 位赋值为 m 的第 ipi 位。2、子密钥生成输入 16 个 16 进制数的密钥后,将密钥保存在一个16 位字符数组 c 中,通过ToEr 函数将之变为二进制数。 ToEr 函数输入为字符数组, 通过 switch 语句逐个检查字符数组的每一位,将对应的四位二进制

4、数存在64 bit 密钥去掉每个字节的最高位得到C0和D064 位布尔数组 k 中。56 bit 密钥输入,通过置换选择1 变换得到各 28 bit,通过 Zhihuan_1 函数实现置换选择一。 Zhihuan_1 函数输入为二进制密钥数组 k64 ,输出为 C0 和 D0 ,将 C0、 D0 分别储存在 28 位布尔数组 C、 D 中。函数采用查表方式生成C0 和 D0 。根据迭代的轮数确定 C 和 D 移位循环的位数, 主程序中利用一个 16 位整形数组来存放每一次循环左移的位数。循环左移通过XunHuan 函数实现,函数输入为循环位数和长度为 28 的布尔数组( C 或者 D),函数运

5、行一次只能改变一个布尔数组的值。为了减低编程复杂度,程序使用串行方法,分两次进行C、 D 的移位。zhihuan_2 函每完成一次 C 和 D 的移位,进行一次置换选择二。置换选择二利用数完成。思想和 Zhihuan_1 函数类似。zhihuan_2 函数输入为移位后的 C、 zhihuan_2D,函数将圈子密钥存放在16*48 的二维布尔数组 kk1749 中。 kki48 表示第 i 圈的圈子密钥。原理图如图 1 所示。脱密( o=0 时)需要将圈子密钥交换,此时可利用义新的变量减少了系统开销。kk049 充当中间变量,无需定密钥置换选择5628281C0D0移位循环C移位循环D11置换选

6、择移位循环C2248k1移位循环D2置换选择248k2移位循环C移位循环D1616置换选择248k 16图 1 圈子密钥生成算法3、16 圈迭代DES 的每一圈迭代采用的是Feistel 模型,先将初始置换后的明文mip 数组分成 L和 R 两部分,先将 R 的内容放在等长的布尔数组之后进入 F 函数, F 函数原理如图 2。R=a 1 a 2 32T 中,最后时需要将 L 的值赋为 T。Ea a a1248K=k1k 2 48S1S2S3S4S5S6S7S8P图2F 函数原理图R、圈子密钥 kk、迭代圈数 i。输程序中的 F 函数输入有初始置换结果的右半部分出保存在 R 中。先将输入的 R

7、通过查表的方法进行 E 拓展,结果保存在 48 位布尔数组a 中。再将 a 与圈子密钥 k 按位模二加。结果保存在a 中。接下来将 a 分成 8 组,分别进入 8 个 S 盒。用 for 控制循环 8 次,每次操作选用 6位二进制代码的开头一位和最后一位转化成十进制数,制代码的中间四位转化成十进制数,控制控制 S 盒的行数, 再将 6 位二进S 盒有迭代圈数 iS 盒的列数。进入第几个确定。取到 S 盒中的十进制数后,将它转化成二进制数,储存在在使用查表法完成 P 盒置换,最终结果保存在R 中。32 位布尔数组 T 中,最后将 L 与 R 按位模二加,得到新的 R,完成一次迭代。4、逆初始置换

8、16 次迭代后,先将 L16 和 R16 连接起来,保存到 64 位布尔数组 m 中,m 之前用于保存明文,这样减小了程序占用的空间。另外,为了保证加脱密算法的一致性,迭代时最后一圈不需要交换L 与 R,但程序中为了简化编程复杂度,在迭代时仍然交换了L与 R。所以在连接时需要再次交换存 L。L 与 R。所以 m 的高 32 位应储存 R,低 32 位应储逆初始置换原理同初始置换步骤,不再赘述。四、取得的成果利用密钥201601211438FBCA对明文81623317加密,密文为6B217C871EAE79D2H 结果如图 3 所示。图 3 DES 加密结果图利 用 密 钥 201601211

9、438FBCA81623317 。结果如图 4 所示。对 密文 6B217C871EAE79D2脱密 , 明 文 为图4DES 脱密结果图变换不同明文及密钥,均可以正常加脱密。在报告中不再罗列。五、心得体会DES 算法是一种分组密码算法,本人通过对一个明文分组的加脱密进行编程,耗时近一个月,独立完成了次算法的序,网上的大多数程序的密文都是以C+ 实现。本人的程序不同于网上找的DES 算法程ASCII 码来输出的。但是,这样输出的结果有很多乱码出现。因为 ASCII 码只有在小范围内输出的结果是正常的字母、数字或者符号(从33 至 127 ),如果按 ASCII 输出乱码密文,脱密者就很难键入这

10、些密文,只能通过复制粘贴进行。 而 VC6.0 的环境在控制台中很难进行复制操作,难完成密文的脱密。而密文按这样如果不借助文件, 就很ASCII 码、16 进制输出就不存在这个问题。二进制串与16 进制数之间的转化也是实验的难点之一。C 语言的课上没有讲过位运算的相关知识,16 进制也是一个本人只能通过除以二取余、查表等笨办法进行转化。同样,密钥选用道理,如果只用字符输入密钥, 密钥的每八位就会局限在00100001 ( 33)至 01111111( 127 )范围之内,超过范围就无法用键盘进行输入密钥,这样破译者如果看到了加密程序源代码,相应的穷尽时间会减少。通过本次编程,我发现我对也会找机

11、会自学这一部分内容。C/C+ 语言的掌握还是不够,尤其是涉及到位运算。我六、附录程序代码:#include using namespace std;void ToEr(char c,bool k)int i,j;j=0;for(i=1;i=16;i+)switch (ci)case 0:kj+=0;kj+=0;kj+=0;kj+=0;break;case 1:kj+=0;kj+=0;kj+=0;kj+=1;break;case 2:kj+=0;kj+=0;kj+=1;kj+=0;break;case 3:kj+=0;kj+=0;kj+=1;kj+=1;break;case 4:kj+=0;kj

12、+=1;kj+=0;kj+=0;break;case 5:kj+=0;kj+=1;kj+=0;kj+=1;break;case 6:kj+=0;kj+=1;kj+=1;kj+=0;break;case 7:kj+=0;kj+=1;kj+=1;kj+=1;break;case 8:kj+=1;kj+=0;kj+=0;kj+=0;break;case 9:kj+=1;kj+=0;kj+=0;kj+=1;break;case A:kj+=1;kj+=0;kj+=1;kj+=0;break;case B:kj+=1;kj+=0;kj+=1;kj+=1;break;case C:kj+=1;kj+=1;

13、kj+=0;kj+=0;break;case D:kj+=1;kj+=1;kj+=0;kj+=1;break;case E:kj+=1;kj+=1;kj+=1;kj+=0;break;case F:kj+=1;kj+=1;kj+=1;kj+=1;break;/for (i=0;i64;i+)coutendl;coutki;void MtoEr(char asc,bool m)int i,j,flag,f;int as9;bool z9=0,t;for(i=1;i=8;i+) asi = (int)asci;for (i=1;i=8;i+)f=1;flag = 8 * (i-1);while(a

14、si!=0)zf = asi % 2;asi /= 2;f+;/for(j=1;j=8;j+) coutzj;coutendl;for(j=1;j=4;j+) t = zj;zj = z9-j;z9-j = t;/z1 = 0;for(j=1;j=8;j+) mflag+j = zj;for(j=1;j=8;j+) zj=0;/void IP(bool m,bool mip)int ip64=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, 3

15、9, 31, 23, 15, 7,56, 48, 40, 32, 24, 16, 8, 0,58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6;for (int i=1;i=64;i+)mipi=mipi-1+1;for(j=1;j=64;j+) coutmj;coutendl;void IP2(bool m,bool mip)int ip64=39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30,37

16、, 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,32, 0, 40, 8, 48, 16, 56, 24;for (int i=1;i=64;i+)mipi=mipi-1+1;void Zhihuan_1(bool k,bool C,bool D)int a28=57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,

17、59,51,43,35,27,19,11,3,60,52,44,36;int b28=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;int i;for(i=1;i=28;i+) Ci=kai-1;for(i=1;i=28;i+) Di=kbi-1;/for(i=1;i=28;i+) coutCi;for(i=1;i=28;i+) coutDi;coutendl;coutendl;void zhihuan_2(bool C,bool D,bool k49,int q)int a48=

18、13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31;int i;bool T57;for (i=1;i=56;i+)if(i=28) Ti = Ci;else Ti = Di-28;for(i=1;i=48;i+)kq+1i=Tai-1+1;/for (i=1;i=48;i+) coutkq+1i;coutendl;void XunHuan(int x,bool C)int i;

19、bool T29;for(i=1;i29;i+)for(i=1;i29;i+)Ti = C(i+x)%28+1;Ci = Ti;void F(bool R,bool kk49,int x)int E48=31,3,7,4,5,0,6,1,7,2,8,3,4,8, 9, 10, 11, 12,11, 12, 13, 14, 15, 16,15, 16, 17, 18, 19, 20,19, 20, 21, 22, 23, 24,23, 24, 25, 26, 27, 28,27, 28, 29, 30, 31,int S8416=14, 4,13, 1, 2,15,11, 8, 3,10, 6,

20、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,0;15, 1, 8,14, 6,11, 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,

21、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, 2,12, 7,13,14, 3, 0, 6, 9,10, 1, 2, 8, 5,11,12, 4,15,13, 8,1

22、1, 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,14, 2

23、,13,6,15, 0, 9,10, 4, 5, 312, 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,1

24、2, 2,15, 8, 6, 1, 4,11,13,12, 3, 7,14,10,15, 6, 8, 0, 5, 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,1

25、1;int i,j,p,a1,a2,k8;bool a49,b33;for (i=1;i=48;i+) ai = REi-1+1;/for (i=1;i=48;i+) coutai;for (i=1;i=48;i+) ai= kkxi;/for (i=1;i=48;i+) coutai;p=1;for (i=0;i8;i+)a1 = ap*2+ap+5;/ 左右两位换成十进制数a2 = ap+1*8+ap+2*4+ap+3*2+ap+4;/couta1endl;couta2endl;p += 6;ki = Sia1a2;/coutkiendl;/中间 4 位换成十进制数p=1;for (i=0

26、;i8;i+)switch (ki)case 0: bp+ = 0;bp+ = 0;bp+ = 0;bp+ = 0;break;case 1: bp+ = 0;bp+ = 0;bp+ = 0;bp+ = 1;break;case 2: bp+ = 0;bp+ = 0;bp+ = 1;bp+ = 0;break;case 3: bp+ = 0;bp+ = 0;bp+ = 1;bp+ = 1;break;case 4: bp+ = 0;bp+ = 1;bp+ = 0;bp+ = 0;break;case 5: bp+ = 0;bp+ = 1;bp+ = 0;bp+ = 1;break;case 6

27、: bp+ = 0;bp+ = 1;bp+ = 1;bp+ = 0;break;case 7: bp+ = 0;bp+ = 1;bp+ = 1;bp+ = 1;break;case 8: bp+ = 1;bp+ = 0;bp+ = 0;bp+ = 0;break;case 9: bp+ = 1;bp+ = 0;bp+ = 0;bp+ = 1;break;case 10: bp+ = 1;bp+ = 0;bp+ = 1;bp+ = 0;break;case 11: bp+ = 1;bp+ = 0;bp+ = 1;bp+ = 1;break;case 12: bp+ = 1;bp+ = 1;bp+

28、 = 0;bp+ = 0;break;case 13: bp+ = 1;bp+ = 1;bp+ = 0;bp+ = 1;break;case 14: bp+ = 1;bp+ = 1;bp+ = 1;bp+ = 0;break;case 15: bp+ = 1;bp+ = 1;bp+ = 1;bp+ = 1;break;bool T33;for(i=1;i=32;i+) Ti=bi;int P32=15,6,19,20,28,11,27,16,0,14,22,25,4,17,30,9,1,7,23,13,31,26,2,8,18,12,29,5,21,10,3,24;for(i=1;i=32;i+) Ri=TPi-1+1;void main()char c17,asc9;int i,j,mout17;bool k65,kk1749,C29,D29,m65,mip65,L33,R33,T33;钥 ,kk 存放 16 圈的圈子密钥, m 存放明文, mip 存放明文初始变换后int z16=1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/k 存放二进制密int o;钥生产算法的左右两个部分。z 为圈子密钥每次循环左移的次数/C 、 D 存放圈子密couto;co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论