⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 (clanguage).txt

📁 CBC模式的DES加密解密程序源代码(C语言)
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    RE0[i]=R0[E[i]-1];

    //printf("RE0\n");
    //for(i=0;i<48;i++)
    //printf("%d,",RE0[i]);

     for(i=0;i<48;i++)      //RE与K异或运算
     RK[i]=RE0[i]^K[t][i];


    //printf("\n");
    //for(i=0;i<48;i++)
    //printf("%d,",RK[i]);

    for(i=0;i<8;i++)        //将R和K异或运算的结果通过S位移表
    {
     r[i]=RK[(i*6)+0]*2+RK[(i*6)+5];
     c[i]=RK[(i*6)+1]*8+RK[(i*6)+2]*4+RK[(i*6)+3]*2+RK[(i*6)+4];
    }
    RKS[0]=S1[r[0]][c[0]]; 
    RKS[1]=S2[r[1]][c[1]];
    RKS[2]=S3[r[2]][c[2]];
    RKS[3]=S4[r[3]][c[3]];
    RKS[4]=S5[r[4]][c[4]];
    RKS[5]=S6[r[5]][c[5]];
    RKS[6]=S7[r[6]][c[6]];
    RKS[7]=S8[r[7]][c[7]];

    for(i=0;i<8;i++)        //把结果转成32位二进制储存在数组SP中
    {
     int b[4]={0,0,0,0};
     m=RKS[i];
     for(j=3;m!=0;j--)
     {
      b[j]=m%2;
      m=m/2;
     }
     for(j=0;j<4;j++)
      SP[j+(i*4)]=b[j];
    }

    for(i=0;i<32;i++)        //将二进制结果再经过一个P盒换位
     RKSP[i]=SP[P[i]-1];

    for(i=0;i<32;i++)        //与前一次的左部异或运算,得到本次迭代的右部
     Ri[i]=L0[i]^RKSP[i];

    for(i=0;i<32;i++)
    {
     L0[i]=R0[i];
     R0[i]=Ri[i];
    }
   }

      //一个左右32位交换

      for(i=0;i<32;i++)
   Li[i]=R0[i];
      for(i=0;i<32;i++)
          R0[i]=L0[i];
      for(i=0;i<32;i++)
          L0[i]=Li[i];


      //初始换位的逆过程

      for(i=0;i<32;i++)         //把左右两部分合起来存到text_end中
    text_end[i]=L0[i];
      for(i=32;i<64;i++)
    text_end[i]=R0[i-32];

      for(i=0;i<64;i++)          //进行初始换位的逆过程
    text_out[l+1][IP[i]-1]=text_end[i];

      for(i=0;i<64;i++)
    result[l][i]=text_out[l+1][i];

      //for(i=0;i<64;i++)
   //printf("%d,",result[l][i]);
      //printf("\n");
  }

for(j=0;j<n;j++)                  //把result中的二进制密文转成十进制存到数组H中
for(i=0;i<16;i++)
H[i+(j*16)]=result[j][0+(i*4)]*8+result[j][1+(i*4)]*4+result[j][2+(i*4)]*2+result[j][3+(i*4)];

//for(i=0;i<l*16;i++)
//printf("%d,",H[i]);

for(i=0;i<n*16;i++)
{
 if(H[i]<10)
  MiWen[i]=H[i]+48;
 else if(H[i]==10)
  MiWen[i]='a';
 else if(H[i]==11)
  MiWen[i]='b';
 else if(H[i]==12)
  MiWen[i]='c';
 else if(H[i]==13)
  MiWen[i]='d';
 else if(H[i]==14)
  MiWen[i]='e';
 else if(H[i]==15)
  MiWen[i]='f';
 //else MiWen[i]='\0';
}
 for(i=l*16;i<224;i++)
 MiWen[i]='\0';

printf("您的文件经过DES加密后的密文是:\n");
printf("%s\n",MiWen);
printf("\n\n");
}

 


//解密程序
else if(choice=='B'||choice=='b')
{
 printf("请输入密文内容:\n");
 gets(MiWen);

 for(i=0;i<208;i++)
  H[i]=0;

        for(i=0;MiWen[i]!='\0';i++)                  //将十六进制密文转化成十进制存放在数组H中
 {
  if(MiWen[i]>='0'&&MiWen[i]<='9')
   H[i]=MiWen[i]-'0';
                else if(MiWen[i]>='A'&&MiWen[i]<='F')
                        H[i]=MiWen[i]-'A'+10;
                else if(MiWen[i]>='a'&&MiWen[i]<='f')
                        H[i]=MiWen[i]-'a'+10;
                else 
  {
   printf("请输入用十六进制表示的密文内容:\n");
             gets(MiWen);
                        i=0;
  }
 }
        n=i;                          //密文中共有n个字符
 if(n%16!=0)
 {
  printf("对不起,您输入的密文不正确,请确认密文的内容,密文的字符数应是16的倍数。\n");
  printf("请输入密文内容:\n");
                gets(MiWen);

  for(i=0;i<208;i++)
   H[i]=0;
  for(i=0;MiWen[i]!='\0';i++)                  //将十六进制密文转化成十进制存放在数组H中
  {
   if(MiWen[i]>='0'&&MiWen[i]<='9')
    H[i]=MiWen[i]-'0';
   else if(MiWen[i]>='A'&&MiWen[i]<='F')
    H[i]=MiWen[i]-'A'+10;
   else if(MiWen[i]>='a'&&MiWen[i]<='f')
    H[i]=MiWen[i]-'a'+10;
  }
 }

 for(i=0;i<n;i++)              //将十进制密文转化成二进制存放在数组C中
 {
  int he[4]={0,0,0,0};
  for(j=3;H[i]!=0;j--)
  {
   he[j]=H[i]%2;
                        H[i]=H[i]/2;
  }
  for(j=0;j<4;j++)
   C[j+(i*4)]=he[j];
 }

        //for(i=0;i<130;i++)
 //    printf("%d,",C[i]);
        //printf("\n");

 k=n/16;
 for(l=0;l<k;l++)
 {
  for(i=0;i<64;i++)           //将每个分组对应的64位二进制密文放到text_out中
   text_out[l+1][i]=C[i+(l*64)];             

                //for(i=0;i<64;i++)
                //   printf("%d,",text_out[l][i]);
                //printf("\n"); 

                //对每个text进行DES解密
 
                for(i=0;i<64;i++)          //进行初始换位
   text_ip[i]=text_out[l+1][IP[i]-1];
                            
                //for(i=0;i<64;i++)
                //printf("%d,",text_ip[i]);
                //printf("\n");

  for(i=0;i<32;i++)         //分成左右两部分,各32位
  {
   L0[i]=text_ip[i];
   R0[i]=text_ip[i+32];
  }
               //for(i=0;i<32;i++)
               //  printf("%d,",L0[i]);
               //for(i=0;i<32;i++)
               //  printf("%d,",R0[i]);

 
  //十六次迭代

  for(t=0;t<16;t++)
  {
   for(i=0;i<48;i++)        //将右半部分通过扩展换位表E从32位扩展成48位
    RE0[i]=R0[E[i]-1];

                        //printf("RE0\n");
                        //for(i=0;i<48;i++)
                        //printf("%d,",RE0[i]);

   for(i=0;i<48;i++)      //RE与K异或运算
    RK[i]=RE0[i]^K[15-t][i];

                        //printf("\n");
                        //for(i=0;i<48;i++)
                        //printf("%d,",RK[i]);

   for(i=0;i<8;i++)        //将R和K异或运算的结果通过S位移表
   {
    r[i]=RK[(i*6)+0]*2+RK[(i*6)+5];
    c[i]=RK[(i*6)+1]*8+RK[(i*6)+2]*4+RK[(i*6)+3]*2+RK[(i*6)+4];
   }

   RKS[0]=S1[r[0]][c[0]]; 
                        RKS[1]=S2[r[1]][c[1]];
                        RKS[2]=S3[r[2]][c[2]];
                        RKS[3]=S4[r[3]][c[3]];
                        RKS[4]=S5[r[4]][c[4]];
                        RKS[5]=S6[r[5]][c[5]];
                        RKS[6]=S7[r[6]][c[6]];
                        RKS[7]=S8[r[7]][c[7]]; 

                        for(i=0;i<8;i++)        //把结果转成32位二进制储存在数组SP中
   {
    int b[4]={0,0,0,0};
    m=RKS[i];
    for(j=3;m!=0;j--)
    {
     b[j]=m%2;
                                        m=m/2;
    }
                                for(j=0;j<4;j++)
                                        SP[j+(i*4)]=b[j];
   }

                        for(i=0;i<32;i++)        //将二进制结果再经过一个P盒换位
    RKSP[i]=SP[P[i]-1];

                        for(i=0;i<32;i++)        //与前一次的左部异或运算,得到本次迭代的右部
    Ri[i]=L0[i]^RKSP[i];

   for(i=0;i<32;i++)
   {
    L0[i]=R0[i];
    R0[i]=Ri[i];
   }
  }

                //一个左右32位交换

                for(i=0;i<32;i++)
   Li[i]=R0[i];
  for(i=0;i<32;i++)
   R0[i]=L0[i];
  for(i=0;i<32;i++)
   L0[i]=Li[i];

                //初始换位的逆过程

  for(i=0;i<32;i++)         //把左右两部分合起来存到text_end中
   text_end[i]=L0[i];
  for(i=32;i<64;i++)
   text_end[i]=R0[i-32];
 
  for(i=0;i<64;i++)          //进行初始换位的逆过程  
   text[IP[i]-1]=text_end[i];

  
  //CBC模式下的解密

  for(i=0;i<64;i++)          //前一分组的密文异或当前分组所得明文的二进制放到result中
   result[l][i]=text_out[l][i]^text[i];

          }

          for(i=0;i<(n/16);i++)           //将二进制转成十进制
   for(j=0;j<8;j++)
    M[i][j]=result[i][(j*8)+0]*128+result[i][(j*8)+1]*64+result[i][(j*8)+2]*32+result[i][(j*8)+3]*16+result[i][(j*8)+4]*8+result[i][(j*8)+5]*4+result[i][(j*8)+6]*2+result[i][(j*8)+7];

   printf("您的文件经过DES解密后的明文是:\n");
   for(i=0;i<(n/16);i++)
    for(j=0;j<8;j++)
     printf("%c",M[i][j]);
    printf("\n\n\n");
  }
flag=0;
printf("是否继续?\n");
printf("Y继续,N退出,请选择:\n");
scanf("%c",&choice);

while(choice!='Y'&&choice!='N'&&choice!='y'&&choice!='n')
{printf("对不起,您的输入不合法。请选择Y或N,Y表示继续使用本程序,N表示退出。\n");
 scanf("%c",&choice);
}
getchar();
if(choice=='Y'||choice=='y')
   flag=1;
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -