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

📄 des.cpp

📁 des加密算法 des加密算法 des加密算法 解密
💻 CPP
字号:
#include<iostream>
#include<cmath>
using namespace std;
int ip[64]={
    58,50,42,34,26,18,10,2,
    60,52,44,36,28,20,12,4,
    62,54,46,38,30,22,10,6,
    64,56,48,40,32,24,16,8,
    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 ip1[64]={
    40,8,48,16,56,34,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 pc1[64]={
    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,
    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 pc2[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 p[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
};
const int sbox_table[8][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},
		},
		{
			{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},
		},
		{
			{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, 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},
		},
		{
			{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},
		},
		{
			{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},
		},
		{
			{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},
		},
		{
			{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 Stable[16]={1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
class Des
{
   public :
       void bytetobit();
       void keytobit();
       void input();
       void lshift(int s);
       void rshift(int s);
       void expand();
       void compress();
       void f();
       void ip2();
       void display();
       void display1();
   private:
       char in[100];
       char key[100];
       char out[100];
       int a[100],bit[100],keybit[100],keybit1[100];
       int keybit2[16][64];
       int R[8][4];
       int b[8][6];
       int keytime;
};
void Des:: input()
{
      int i;
      gets(in);
      cout<<"输入的密钥长度位16 个十六进制字符长度:"<<endl;
      gets(key);
	  if(strlen(key)!=16)
	  {
			cout<<"输入错误!"<<endl;
	  }
      keytime=0;
      for(i=0;i<100;++i)
      {
      a[i]=0;
      keybit[i]=0;
      }
}
void Des:: bytetobit()
{
     int i,j;
     int l=1;
     for(i=0;i<8;++i)
     {
      int s=int(in[i]);
      while(s)
      {
      a[8*(i+1)-l]=s%2;
      s/=2;
      l++;
      }
      l=1;
     }
      for(i=0;i<64;++i)
        bit[i]=a[i];
      for(i=0;i<64;++i)
        a[i]=bit[ip[i]-1];
};
void Des::keytobit()
{
     int i,s;
     int l=1;
     int len=strlen(key);
     for(i=0;i<16;++i)
     {
     if(key[i]>='0'&&key[i]<='9')
       s=key[i]-'0';
       else
      s=key[i]-'A'+10;
      while(s)
      {
       keybit[4*(i+1)-l]=s%2;
      s/=2;
      l++;
      }
      l=1;
     }
     for(i=0;i<64;++i)
     {
        keybit1[i]=keybit[i];
     }
     for(i=0;i<64;++i)
     {
         keybit[i]=keybit1[pc1[i]-1];
     }
}
void Des::lshift(int s)
{
   int i;
   int sf=Stable[s];
   for(i=63;i>=0;--i)
   {
     keybit[i]=keybit[(i+sf)%64];
   }
   for(i=0;i<64;++i)
   keybit1[i]=keybit[i];
   for(i=0;i<48;++i)
   {
   keybit[i]=keybit1[pc2[i]-1];
   keybit2[keytime][i]=keybit[i];
  // cout<<keybit[i]<<" ";
  }
  keytime++;
  //cout<<endl;
}
void Des::rshift(int s)
{
   int i;
   int sf=Stable[s];
   for(i=63;i>=0;--i)
   {
     keybit[i]=keybit[(i+sf)%64];
   }
    for(i=0;i<64;++i)
     keybit1[i]=keybit[i];
    for(i=0;i<48;++i)
   {
   keybit[i]=keybit1[pc2[i]-1];
  // cout<<keybit[i]<<" ";
  }
}
void Des::expand()
{
    int i,j;
    for(i=32;i<64;++i)
    {
       R[i/4-8][i%4]=a[i];
    }
     for(j=0;j<8;++j)
     {
        b[j][0]=R[(j+7)%8][4];
        b[j][1]=R[j][1];
        b[j][2]=R[j][2];
        b[j][3]=R[j][3];
        b[j][4]=R[j][4];
        b[j][5]=R[(j+1)%8][1];
     }
     int s=0;
     for(i=0;i<8;++i)
     for(j=0;j<6;++j)
     {
        b[i][j]&=keybit[s++];
     //   cout<<keybit[s-1]<<" ";
     }
    // cout<<endl;
}
void Des::compress()
{
    int i,j;
    for(i=0;i<8;++i)
    {
        int row=b[i][0]*2+b[i][5];
        int low=b[i][1]*8+b[i][2]*4+b[i][3]*2+b[i][4]*1;
        int s=sbox_table[i][row][low];
        int l=1;
        while(s)
        {
            a[4*(i+9)-l]=s%2;
            s/=2;
            l++;
        }
        l=1;
    }
    for(j=32;j<64;++j)
    {
        bit[j]=a[j];
    }
    for(j=32;j<64;++j)
    {
        a[j]=bit[p[j-1]];
    }
}
void Des::f()
{
    int i;
    for(i=0;i<64;++i)
    bit[i]=a[i];
    for(i=32;i<64;++i)
    {
      a[i]=bit[i-32]|a[i];
    }
    for(i=0;i<32;++i)
    a[i]=bit[32+i];
}
void Des::ip2()
{
   int i;
   for(i=0;i<64;++i)
   bit[i]=a[i];
   for(i=0;i<64;++i)
   a[i]=bit[ip1[i]-1];
   for(i=0;i<64;++i)
   {
		cout<<a[i]<<"("<<i<<")"<<" ";
		if((i+1)%8==0)
		cout<<endl;
	}
}
void Des::display()
{
    int i;
    int s[20]={0};
    char l[20]={0};
    for(i=0;i<64;i++)
    {
        s[i/8]+=a[i]*pow(2.0,(i+7)%8);
    }
    for(i=0;i<8;++i)
    printf("%x ",s[i]); cout<<endl;
    for(i=0;i<8;++i)
    cout<<char(s[i]);
   cout<<"\n";
}
void Des::display1()
{
	int i;
    int s[20]={0};
    char l[20]={0};
    for(i=0;i<64;i++)
    {
        s[i/8]+=a[i]*pow(2.0,(i+7)%8);
    }
    cout<<in<<endl;
}
int main()
{
    Des s;
    int i;
    s.input();
    s.bytetobit();
    s.keytobit();
    s.f();
    s.display();
    for(i=0;i<16;++i)
    {
        s.lshift(i);
        s.expand();
        s.compress();
        s.f();
    }
    s.display1();
    system("pause");
    return 0;
}

⌨️ 快捷键说明

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