您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > DES加密算法实现报告(四川大学)
四川大学计算机学院实验报告学号:姓名:班级:第试验课程名称信息安全课程设计实验课时2实验项目DES加密算法的实现实验时间2013.04.28实验目的1.加深对分组密码原理的理解2.对经典DES加密算法加密过程的理解实验环境Windows8eclipse实验内容(算法、程序、步骤和方法)一试验原理DES的特点是:一个对称密钥体制,加密盒解密使用同一秘钥、同一算法,区别是:加密子密钥顺序:k1,k2,.....k16,解密子密钥顺序k16,k15,...k2,k1。它在具体算法中属于分组乘法密码,使用56位的密钥对64位的明文进行加解密,获取密文为64位。其中密钥总长度实际为64位,另外八位作为奇偶校验位。1.1DES算法描述DES体制简化示意图如图1.1所示,整个过程由三个阶段来完成:设m=m1m2.....m64为64位待加密明文,其中mi∈{0,1},1≤i≤64,DES先执行初始置换IP来对m进行换位处理:然后通过子密钥k1~k16进行16次乘积变换,即进行16次迭代处理;最终经过逆初始值换IP-1的处理,得到64位密文:C=c1c2c3.......c64,图1.1DES简化示意图其中ci∈{0,1},1≤i≤64.16轮迭代目的是使明文增加混乱性和扩散性。避免输出密文残留统计规律,使得破译者无法反向推算出密钥。第一步:初始置换IP初始置换IP如图1—2所示,主要用于对明文m中的各位进行换位,目的在于打乱明文m中各位的排列次序。经过初始置换后,m的映射为m→IP→m’。初始置换IP逆初始换位IP-1即m’=m1’m2’m3’.....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轮迭代过程如图3—3图3—3(迭代过程)5850423426181026052443628201246254443628201466456484032241685749413325179159514335271911361534537292113563554739312315740848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725设密钥k=k1k2k3....k64,ki∈{0,1},1≤i≤64。DES加密算法过程与密钥K一起作用的16轮乘积变换可以表示为:Li=Ri-1Ri=Li-1⊕f(Ri-1,Ki)I≤1≤16其中Li,RI长度均为32位。L0=m1’m2’m2’m3’......m32’R0=m33’m34’m35’.....m64’符号⊕为模2加,f为加密函数(如图3-2),Ki是由密钥k分解产生并经变化后的一个48位的子密钥。整个16轮迭代过程简洁明了,既适用于加密算法也适用于解密算法。第三步:逆初始置换IP-1这是DES算法的随后一步,将比特串RL16应用初始置换IP的逆初始置换IP-1处理后就获得密文C,即C=IP-1(R16L16)=C1,C2,C3.....C64。由于DES解密过程是一个加密过程的逆过程在此就不做过多解释二.代码函数实现1、明文与密钥的输入首先8位ACSII字符的明文与密钥的输入,存放在mingwen[8]和miyao[8]中,然后将这些8位的ASCII字符转换成二进制的64位的明文和密钥,分别存放在mingwenB[64]和miyaoB[64]中,并将二进制的明文和密钥放在文件中intstr[8],i,j,ch,k;FILE*fp4;fp4=fopen(明文二进制.txt,w);k=0;for(i=0;i8;i++){ch=mingwen[i];for(j=0;j8;j++){str[j]=ch%2;ch=ch/2;}for(j=7;j=0;j--){mingwenB[k]=str[j];k++;fprintf(fp4,%d,str[j]);}}2、密钥的产生1)、64位miyaoB[64]经过pc-1置换,生成56位的比特串。定义pc1_Table[56],存放在afterpc1[56]中。for(i=0;i56;i++)afterpc1[i]=miyaoB[pc1_Table[i]-1];2)、56位比特串分组,生成C0[28]和D0[28]for(i=0;i28;i++)C0[i]=afterpc1[i];for(j=0,i=28;i56;i++,j++)D0[j]=afterpc1[i];3)、C0[28]、D0[28]进行左移,产生C[16][28]和D[16][28],为进行pc-2置换产生密钥做准备。for(i=0;i27;i++)//第一轮数据生成C[0][28]与D[0][28]{C[0][i]=C0[i+1];D[0][i]=D0[i+1];}C[0][27]=C0[0];D[0][27]=D0[0];for(i=1;i16;i++)//第二轮数据至第十六轮数据生成{if(i==1||i==8||i==15){for(j=0;j27;j++)//左移1位{C[i][j]=C[i-1][j+1];D[i][j]=D[i-1][j+1];}C[i][27]=C[i-1][0];D[i][27]=D[i-1][0];}else//左移2位{for(j=0;j26;j++){C[i][j]=C[i-1][j+2];D[i][j]=D[i-1][j+2];}C[i][26]=C[i-1][0];C[i][27]=C[i-1][1];D[i][26]=D[i-1][0];D[i][27]=D[i-1][1];}}//产生16轮左右数据,为pc-2置换准备。4)、左右两部分比特串合并,存放在intbeforekey[16][56]中k=0;for(i=0;i16;i++){for(j=0;j28;j++)beforekey[i][j]=C[i][j];for(k=0;k28;k++,j++)beforekey[i][j]=D[i][k];}5)、beforekey[16][56]经过pc-2置换,产生16轮密钥keys[16][48],for(i=0;i16;i++)for(j=0;j48;j++)keys[i][j]=beforekey[i][pc_2table[j]-1];至此,16轮子密钥产生完毕,为keys[16][48]。3、密文的产生1)、明文经过初始置换IP置换。结果放在afterIP[64]中。for(j=0;j64;j++){afterIP[j]=mingwenB[IP_table[j]-1];}2)、明文的第0次分组,左部分L0[32],右部分R0[32]。for(i=0;i32;i++)L0[i]=afterIP[i];for(j=0,i=32;i64;i++,j++)R0[j]=afterIP[i];3)、为产生密文,要进行16轮的循环,每次循环生成一个L[i][32]和R[i][32],下面进行第一次循环,生成L[0][32]和R[0][32]。for(i=0;i32;i++)//Li=R(i-1)L[0][i]=R0[i];4)、至于R[0][32]的生成,R[0][32]=L0[32]^f(R0,keys[0])。因此,要首先计算出f值。R0[32]经过E变换,由32位扩展为48位,然后与子密钥进行异或,为进入S盒做准备。结果放在afterER0[48]中for(i=0;i48;i++)afterER0[i]=R0[E_table[i]-1];5)、E扩展后,与子密钥进行异或,生成进入S盒前的数据。存放在beforeS[48].for(i=0;i48;i++)if(afterER0[i]==keys[0][i])beforeS[i]=0;elsebeforeS[i]=1;6)、要进入S盒的48位比特串要经过8个不同的S盒,因此,将48位比特串分在8个数组中,放在beforeSBox[8][6].for(k=0,i=0;i8;i++)for(j=0;j6;j++){beforeSBox[i][j]=beforeS[k];k++;}7)、进入S盒后,进过8个S盒,每个S盒产生一个十进制的数字,在0~15之间。beforeSBox[i][6]中的6个数字,第0、5位组成了S盒的行号,第1、2、3、4,4位组成了S盒的列号,根据行列选中S盒中的数据作为输出,存放在afterSBox[8]中。inthang,lie;for(i=0;i8;i++){hang=beforeSBox[i][0]*2+beforeSBox[i][5];lie=beforeSBox[i][1]*8+beforeSBox[i][2]*4+beforeSBox[i][3]*2+beforeSBox[i][4];afterSBox[i]=SBox[i][hang][lie];}8)、由S盒出来的8个十进制数字转换成32位的二进制比特串,存放在beroreP[32]中,为接下来的P置换做准备。k=0;inttemp;intstr1[4];for(i=0;i8;i++){temp=afterSBox[i];for(j=0;j4;j++){str1[j]=temp%2;temp=temp/2;}for(j=3;j=0;j--){beforep[k]=str1[j];k++;}}9)、转换为二进制的32位比特串进行P置换,生成新的32位比特串,也就是f的值。存放在P[32]中。for(i=0;i32;i++)p[i]=beforep[p_table[i]-1];至此,第一轮的循环已经完成,成功产生了L[0][32]和R[0][32]。10)、对于剩下的15轮循环,用一个循环语句进行控制,生成余下的15轮中间数据的左部和右部,最后产生L[15][32]和R[15][32]。11)、得到的最后一轮左部32位比特串和右部32位比特串进行合并,但是,合并的时候,右部32位比特串在前,R[15][32]在前,而L[15][32]在后。结果存放在beforeoutput[64]中for(i=0;i32;i++)//数据合并,R[15][32]在前,L[15][32]在后面beforeoutput[i]=R[15][i];for(i=32,j=0;i64;i++,j++)beforeoutput[i]=L[15][j];12)、左右数据合并后的比特串进行最后的逆置换,生成64位的二进制密文。存放在output[64]中。for(i=0;i64;i++)output[i]=beforeoutput[IPR_tabel[i]-1];//得到64位密文13)、将得到的64位密文转换为8位的ASCII字符。intcharB[8][8];k=0;charmiwen[8];for(i=0;i8;i++)for(j=0;j8;j++){charB[i][j]=output[k];k++;}for(i=0;i8;i++){str[i]=0;if(charB[i][0]==1)str[i]=str[i]+128;if(charB[i][1]==1)str[i]=str[i]+64;if(charB[i][2]==1)str[i]=str[i]+32;if(charB[i][3]==1)str[i]=str[i]+16;if(charB[i][4]==1)str[i]=str[i]+8;if(charB[i][5]==1)str[i]=str[i]+4;if(charB[i][6]==1)str[i]=str[i]+2;if
本文标题:DES加密算法实现报告(四川大学)
链接地址:https://www.777doc.com/doc-7880226 .html