📄 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 + -