《DES加密算法实现报告(四川大学)(共9页).doc》由会员分享,可在线阅读,更多相关《DES加密算法实现报告(四川大学)(共9页).doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上四 川 大 学 计 算 机 学 院实 验 报 告学号: 姓名: 班级: 第 试验课程名称信息安全课程设计实验课时2实验项目DES加密算法的实现实验时间2013.04.28实验目的1. 加深对分组密码原理的理解2. 对经典DES加密算法加密过程的理解实验环境Windows 8 eclipse 实验内容(算法、程序、步骤和方法)一 试验原理 DES的特点是:一个对称密钥体制,加密盒解密使用同一秘钥、同一算法,区别是:加密子密钥顺序:k1,k2,.k16,解密子密钥顺序k16,k15,.k2,k1。它在具体算法中属于分组乘法密码,使用56位的密钥对64位的明文进行加解密,获
2、取密文为64位。其中密钥总长度实际为64位,另外八位作为奇偶校验位。 1.1 DES算法描述 DES体制简化示意图如图1.1所示,整个过程由三个阶段来完成:设m=m1m2.m64为64位待加密明文,其中mi0,1,1i64,DES先执行初始置换IP来对m进行换位处理:然后通过子密钥k1k16进行16次乘积变换,即进行16次迭代处理;最终经过逆初始值换IP -1 的处理,得到64位密文:C=c1c2c3.c64,图1.1 DES简化示意图其中ci0,1,1 i 64. 16轮迭代目的是使明文增加混乱性和扩散性。避免输出密文残留统计规律,使得破译者无法反向推算出密钥。 第一步:初始置换IP 初始置
3、换IP如图12所示,主要用于对明文m中的各位进行换位,目的在于打乱明文m中各位的排列次序。经过初始置换后,m的映射为mIPm 。40 8 48 16 56 24 64 3239 7 47 15 55 23 63 3138 6 46 14 54 22 62 3037 5 45 13 53 21 61 2936 4 44 12 52 20 60 2835 3 43 11 51 19 59 2734 2 42 10 50 18 58 2633 1 41 9 49 17 57 2558 50 42 34 26 18 10 260 52 44 36 28 20 12 462 54 44 36 28 20
4、 14 664 56 48 40 32 24 16 857 49 41 33 25 17 9 159 51 43 35 27 19 11 361 53 45 37 29 21 13 563 55 47 39 31 23 15 7 初始置换IP 逆初始换位IP- 1即m = m1m2m3.m64=m58m50.m7其中可以叙述为:m中第58位变为m中第一位,m中的第50位变为m中第二位.m中的第7位变为m中第64位。第二步:DES迭代过程(乘积变换) DES第二步是将第一步得到的64位结果分为两半,L0 =m1,m2,.m32,R0=m33,m34.m64,其中16轮迭代过程如图33图33(迭代
5、过程)设密钥k=k1k2k3.k64,ki0,1,1 i 64。DES加密算法过程与密钥K一起作用的16轮乘积变换可以表示为: Li = R i-1 Ri = Li-1f(Ri-1,Ki) I 1 16 其中Li,RI长度均为32位。 L0 = m1m2m2m3.m32 R0 = m33m34m35.m64 符号为模2加,f为加密函数(如图3-2),Ki是由密钥k分解产生并经变化后的一个48位的子密钥。整个16轮迭代过程简洁明了,既适用于加密算法也适用于解密算法。 第三步:逆初始置换IP -1 这是DES算法的随后一步,将比特串RL16应用初始置换IP的逆初始置换IP -1处理后就获得密文C,
6、即C = IP -1 (R16L16) = C1,C2,C3.C64。由于DES解密过程是一个加密过程的逆过程在此就不做过多解释2 代码函数实现 1、明文与密钥的输入首先8位ACSII字符的明文与密钥的输入,存放在mingwen8和miyao8中,然后将这些8位的ASCII字符转换成二进制的64位的明文和密钥,分别存放在mingwenB64和miyaoB64中,并将二进制的明文和密钥放在文件中int str8,i,j,ch,k;FILE *fp4;fp4=fopen(明文二进制.txt,w);k=0;for(i=0;i8;i+)ch=mingweni;for(j=0;j=0;j-)mingwe
7、nBk=strj;k+;fprintf(fp4,%d,strj); 2、密钥的产生1)、64位miyaoB64经过pc-1置换,生成56位的比特串。定义pc1_Table56,存放在afterpc156中。for(i=0;i56;i+) afterpc1i=miyaoBpc1_Tablei-1;2)、56位比特串分组,生成C028和D028for(i=0;i28;i+) C0i=afterpc1i;for(j=0,i=28;i56;i+,j+) D0j=afterpc1i;3)、C028、D028进行左移,产生C1628和D1628,为进行pc-2置换产生密钥做准备。for(i=0;i27;i
8、+)/第一轮数据生成C028与D028C0i=C0i+1;D0i=D0i+1;C027=C00;D027=D00;for(i=1;i16;i+)/第二轮数据至第十六轮数据生成if(i=1|i=8|i=15)for(j=0;j27;j+)/左移1位Cij=Ci-1j+1;Dij=Di-1j+1;Ci27=Ci-10;Di27=Di-10;else/左移2位for(j=0;j26;j+)Cij=Ci-1j+2;Dij=Di-1j+2;Ci26=Ci-10;Ci27=Ci-11;Di26=Di-10;Di27=Di-11;/产生16轮左右数据,为pc-2置换准备。4)、左右两部分比特串合并,存放在i
9、nt beforekey1656中k=0;for(i=0;i16;i+)for(j=0;j28;j+)beforekeyij=Cij;for(k=0;k28;k+,j+)beforekeyij=Dik;5)、beforekey1656经过pc-2置换,产生16轮密钥keys1648,for(i=0;i16;i+)for(j=0;j48;j+)keysij=beforekeyipc_2tablej-1;至此,16轮子密钥产生完毕,为keys1648。3、密文的产生1)、明文经过初始置换IP置换。结果放在afterIP64中。for(j=0;j64;j+) afterIPj=mingwenBIP_
10、tablej-1; 2)、明文的第0次分组,左部分L032,右部分R032。for(i=0;i32;i+)L0i=afterIPi;for(j=0,i=32;i64;i+,j+)R0j=afterIPi;3)、为产生密文,要进行16轮的循环,每次循环生成一个Li32和Ri32,下面进行第一次循环,生成L032和R032。for(i=0;i32;i+)/Li=R(i-1)L0i=R0i;4)、至于R032的生成,R032=L032f(R0,keys0)。因此,要首先计算出f值。R032经过E变换,由32位扩展为48位,然后与子密钥进行异或,为进入S盒做准备。结果放在afterER048中for(
11、i=0;i48;i+)afterER0i=R0E_tablei-1;5)、E扩展后,与子密钥进行异或,生成进入S盒前的数据。存放在beforeS48.for(i=0;i48;i+)if(afterER0i=keys0i)beforeSi=0;elsebeforeSi=1;6)、要进入S盒的48位比特串要经过8个不同的S盒,因此,将48位比特串分在8个数组中,放在beforeSBox86.for(k=0,i=0;i8;i+)for(j=0;j6;j+)beforeSBoxij=beforeSk;k+;7)、进入S盒后,进过8个S盒,每个S盒产生一个十进制的数字,在015之间。beforeSBox
12、i6中的6个数字,第0、5位组成了S盒的行号,第1、2、3、4,4位组成了S盒的列号,根据行列选中S盒中的数据作为输出,存放在afterSBox8中。int hang,lie;for(i=0;i8;i+)hang=beforeSBoxi0*2+beforeSBoxi5;lie=beforeSBoxi1*8+beforeSBoxi2*4+beforeSBoxi3*2+beforeSBoxi4;afterSBoxi=SBoxihanglie;8)、由S盒出来的8个十进制数字转换成32位的二进制比特串,存放在beroreP32中,为接下来的P置换做准备。k=0;int temp;int str14;
13、for(i=0;i8;i+)temp=afterSBoxi;for(j=0;j=0;j-)beforepk=str1j;k+;9)、转换为二进制的32位比特串进行P置换,生成新的32位比特串,也就是f的值。存放在P32中。for(i=0;i32;i+)pi=beforepp_tablei-1;至此,第一轮的循环已经完成,成功产生了L032和R032。10)、对于剩下的15轮循环,用一个循环语句进行控制,生成余下的15轮中间数据的左部和右部,最后产生L1532和R1532。11)、得到的最后一轮左部32位比特串和右部32位比特串进行合并,但是,合并的时候,右部32位比特串在前,R1532在前,而
14、L1532在后。结果存放在beforeoutput64中for(i=0;i32;i+)/数据合并,R1532在前,L1532在后面beforeoutputi=R15i;for(i=32,j=0;i64;i+,j+)beforeoutputi=L15j;12)、左右数据合并后的比特串进行最后的逆置换,生成64位的二进制密文。存放在output64中。for(i=0;i64;i+)outputi=beforeoutputIPR_tabeli-1;/得到64位密文13)、将得到的64位密文转换为8位的ASCII字符。int charB88;k=0; char miwen8;for(i=0;i8;i+
15、)for(j=0;j8;j+)charBij=outputk;k+;for(i=0;i8;i+)stri=0;if(charBi0=1)stri=stri+128;if(charBi1=1)stri=stri+64;if(charBi2=1)stri=stri+32;if(charBi3=1)stri=stri+16;if(charBi4=1)stri=stri+8;if(charBi5=1)stri=stri+4;if(charBi6=1)stri=stri+2;if(charBi7=1)stri=stri+1;m_outputMiwen=;for(i=0;i8;i+)miweni=stri;/得到密文miwen8解密过程和加密过程几乎一样,在此不详细做解释。 三.算法运行测试结果 实验数据记录和计算结论(结果)指导教师评议成绩评定: 指导教师签名:专心-专注-专业