DES的加密C++小白版

折腾了好几天之后,我终于搞出来了输入字符的加密,结果老师说直接输入64位二进制就可。(我就不删,我就留着。)然后意识到直接输入1010是需要加空格的,然后就简单的用了char型变量,间接改变一下,就可以输入一长串101010101010啦!

以下是很low的代码

注释部分是输入8个字符的加密方式,现在的是输入64位二进制的方式,我真棒!

#include <bits/stdc++.h>
using namespace std;
    int int_sk[10];
    int bin_sk[8][8];
    int Plaintext[64];
    int Fin_SKey[64];     //置换1中密钥合为64位
    int my_num=0;           //置换1中密钥合并数目


    int zh1_C0[28]={57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,
                    19,11,3,60,52,44,36};
    int zh1_D0[28]={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 CD_Union[56]={0};
    int zh1_Ki[48]={14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,
                52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32};
    int K[17][48];
    int IP_Sort_L0[32]={58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,
                        56,48,40,32,24,16,8};
    int IP_Sort_R0[32]={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,39,31,23,15,7};
    int L[17][32];
    int R[17][32];
    int b[6];
    int S_box[8][32];      //8个S盒
    int P_Sort[32]={16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,
                    3,9,19,13,30,6,22,11,4,25};
    int Inverse_IP_Sort[64]={40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,
                    22,62,30,37,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};
    int zhP[32];
    int S1[4][16]={{14,4,13,1,2,15,11,8,3,10,6,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}};
    int S2[4][16]={{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,2,15},
                    {13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}};
    int S3[4][16]={{10,0,9,14,6,13,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}};
    int S4[4][16]={{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},
                    {13,8,11,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}};
    int S5[4][16]={{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,13,6,15,0,9,10,4,5,3}};
    int S6[4][16]={{12,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}};
    int S7[4][16]={{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,12,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}};
    int S8[4][16]={{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,11}};
    int re[4];
    int C[17][28];
    int D[17][28];
    int E[48]={32,1,2,3,4,5,
                4,5,6,7,8,9,
                8,9,10,11,12,13,
                12,13,14,15,16,17,
                16,17,18,19,20,21,
                20,21,22,23,24,25,
                24,25,26,27,28,29,
                28,29,30,31,32,1};
    int *R_MidResult=new int[48];        //选择运算E与Ri-1产生的中间结果
    int S_Box_Output[32];
    int Final_Ctext[64];
    int S_Box_Merge[32];        //八个S盒输出合并
    int D2B_Temp[8][8];                       //十进制转二进制函数中的数组变量
    ///S盒
    void S_box_Cal(int n,int *b)
    {
        int result;
        int col=b[0]*2+b[5];
        int rol=b[1]*8+b[2]*4+b[3]*2+b[4];        //下角标都加一
        if(n==1)
             result=S1[col][rol];
        else if(n==2)
             result=S2[col][rol];
        else if(n==3)
             result=S3[col][rol];
         else if(n==4)
             result=S4[col][rol];
         else if(n==5)
             result=S5[col][rol];
         else if(n==6)
             result=S6[col][rol];
        else if(n==7)
             result=S7[col][rol];
         else if(n==8)
              result=S8[col][rol];
       int temp=result;
       int i=3;
       while(i>=0)
       {
           re[i--]=temp%2;
           temp/=2;
       }
    }
    ///循环左移
    void Move_Left(int n,int m)
    {
        //n为Cn  m为左移m位
        for(int i=0;i<28;i++)
        {
            C[n][i]=C[n-1][(i+m)%28];
            D[n][i]=D[n-1][(i+m)%28];
        }
        return ;
    }
    void Dec2Bin(char *text)            //十进制转二进制
    {
        int f=0;
        for(int i=0;i<8;i++)
        {
             int temp=text[i];
             int j=7;
             while(j>=0)
             {
                 D2B_Temp[i][j]=temp%2;
                 temp/=2;
                 j--;
             }
        }
    }
    int main()
{
   // freopen("in.txt","r",stdin);
   /* char Ch_Plaintext[10];              //明文字符
    char secret_key[10];                //密钥字符
    cin.getline(Ch_Plaintext,10);        //输入明文
    cin.getline(secret_key,10);          //输入密文

    Dec2Bin(secret_key);                  //密钥字符转为二进制
    int te=0;
    for(int i=0;i<8;i++)
      for(int j=0;j<8;j++)
        Fin_SKey[te++]=D2B_Temp[i][j];

    te=0;
    Dec2Bin(Ch_Plaintext);                   //明文字符转为二进制
    for(int i=0;i<8;i++)
      for(int j=0;j<8;j++)
        Plaintext[te++]=D2B_Temp[i][j];
    */
    //for(int i=0;i<64;i++)
   //     cout<<Plaintext[i];
   // cout<<endl;
   char temp10;
   cout<<"请输入64位明文:"<<endl;
   for(int i=0;i<64;i++)
   {
       cin>>temp10;
       Plaintext[i]=temp10-'0';
   }
   cout<<"请输入64位密钥:"<<endl;
   getchar();
    for(int i=0;i<64;i++)
    {
         cin>>temp10;
        Fin_SKey[i]=temp10-'0';
    }

    ///子密钥生成

     for(int i=0;i<28;i++)                  //置换选择1    C0D0构造
    {
        C[0][i]=Fin_SKey[zh1_C0[i]-1];
        D[0][i]=Fin_SKey[zh1_D0[i]-1];
    }

     for(int w=1;w<=16;w++)
     {
         if(w==1||w==2||w==9||w==16)        //循环左移
            Move_Left(w,1);
        else
            Move_Left(w,2);

        for(int i=0;i<56;i++)               //合并C D,计算子密钥Ki
        {
            if(i<28)
                CD_Union[i]=C[w][i];
            else
                CD_Union[i]=D[w][i-28];
        }
        for(int j=0;j<48;j++)
            K[w][j]=CD_Union[zh1_Ki[j]-1];

     }

    ///-------子密钥生成--------

        for(int i=0;i<32;i++)                   //初始置换IP   生成L0 R0
        {
            R[0][i]=Plaintext[IP_Sort_R0[i]-1];
        }
        for(int i=0;i<32;i++)
        {
            L[0][i]=Plaintext[IP_Sort_L0[i]-1];
        }

        ///明文加密的十六次迭代
        for(int w=1;w<=16;w++)
         {
            for(int i=0;i<48;i++)
            {
                R_MidResult[i]=R[w-1][E[i]-1];        //选择运算E与R的运算结果
            }
            for(int i=0;i<48;i++)
            {
                R_MidResult[i]=(R_MidResult[i]+K[w][i])%2;  //选择运算E后的结果与Ki模2加
            }
            int R_temp=0;
            int m=0;

            for(int i=0;i<8;i++)                     //S盒
            {
                for(int j=0;j<6;j++)
                    b[j]=R_MidResult[R_temp++];       //b[i]即第i个盒子的6个输入
                S_box_Cal(i+1,b);                     //S盒输出
                for(int b=0;b<4;b++)
                    S_Box_Merge[m++]=re[b];           //S盒输出合并

            }
              ///置换运算P
            for(int i=0;i<32;i++)
            {
                zhP[i]= S_Box_Merge[P_Sort[i]-1];       //这里得到的就是f(Ri-1,Ki)

            }

            for(int i=0;i<32;i++)
            {
                zhP[i]=zhP[i]^L[w-1][i];            //f(Ri-1,Ki)与Li-1的异或
            }

            ///-----置换运算-----------
            for(int i=0;i<32;i++)
            {
                L[w][i]=R[w-1][i];                  //Li=R(i-1)
                R[w][i]=zhP[i];                     //R[i]=L(i-1)^f(R(i-1),Ki)
            }
         }

         for(int i=0;i<64;i++)                      //对R[16]L[16]进行逆初始置换IP
         {
            if(Inverse_IP_Sort[i]<=33)
                Final_Ctext[i]=R[16][Inverse_IP_Sort[i]-1];              //逆矩阵里是1-64
            else
                 Final_Ctext[i]=L[16][Inverse_IP_Sort[i]-33];
         }
         cout<<"密文是:"<<endl;
        for(int i=0;i<64;i++)                       //输出密文
            if((i+1)%8==0)
                cout<<Final_Ctext[i]<<" ";
            else
                cout<<Final_Ctext[i];
}



没有运行结果,我懒,不加了。。。
感谢给予我帮助的以下大佬!
https://www.doc88.com/p-776450371659.html
https://blog.csdn.net/qq_34838643/article/details/80007992

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值