📄 des.cpp
字号:
#include <iostream>
#include <string>
using namespace std;
void dd(int aa[6],int &hang,int &lie)
{
hang=aa[0]*2+aa[5];
lie=aa[1]*8+aa[2]*4+aa[3]*2+aa[4];
}
int main()
{
int cnt=0;
char mingwen[9];
cout<<"请输入8位明文:";
cin>>mingwen;
char key[9];
cout<<"请输入8位密钥:";
cin>>key;
int minint[64];
int keyint[64];
int miwen[64];
int i=0,j=0,m=0,n=0;
for(i=0;i<64;i++)
minint[i]=0;
for(i=0;i<64;i++)
keyint[i]=0;
for(i=0;i<8;i++)
{
int temp=(int)mingwen[i];
int z=0;
for(z=7;z>=0;z--)
{
minint[8*i+z]=temp%2;
temp=temp/2;
cnt++;
}
}
for(i=0;i<8;i++)
{
int temp=(int)key[i];
int z;
for(z=7;z>=0;z--)
{
keyint[8*i+z]=temp%2;
temp=temp/2;
}
}
int pc1[56]={
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,
9 , 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21,
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3};
int pc2[48]={
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 };
int beginip[64]={
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,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6 };
int zhihuane[48]={ 31, 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8, 9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31,0 };
int zhihuanp[32]={ 15, 6,19,20,
28,11,27,16,
0,14,22,25,
4,17,30, 9,
1, 7,23,13,
31,26, 2, 8,
18,12,29, 5,
21,10, 3,24 };
int zhihuanpp[64]={ 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,
32,0,40,8,48,16,56,24};
int ss[8][64]={14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,//s盒
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 pc1key[56];
for(i=0;i<56;i++)
{
pc1key[i]=keyint[pc1[i]];
}
int leftkey[28];
int rightkey[28];
for(j=0;j<28;j++)
{
leftkey[j]=pc1key[j];
rightkey[j]=pc1key[j+28];
}
int lun=1;
int movleft[17]={ 0,1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
int ww[64];
for(i=0;i<64;i++)
{
ww[i]=minint[i];
}
for(i=0;i<64;i++)
minint[i]=ww[beginip[i]];
int leftmin[32];
int rightmin[32];
for(j=0;j<32;j++)
{
leftmin[j]=minint[j];
rightmin[j]=minint[j+32];
}
int keykey[16][48];
int s=0;
for(s=0;s<16;s++)
{
int temp=0;
int temp1[28],temp2[28];
for(j=0;j<28;j++)
{
temp1[j]=leftkey[j];
temp2[j]=rightkey[j];
}
for(j=0;j<28;j++)
{
leftkey[j]=temp1[(j+movleft[lun]+28)%28];
rightkey[j]=temp2[(j+movleft[lun]+28)%28];
}
int pc2keytemp[56];
for(i=0;i<28;i++)
{
pc2keytemp[i]=leftkey[i];
pc2keytemp[i+28]=rightkey[i];
}
int pc2key[48];
for(i=0;i<48;i++)
{
pc2key[i]=pc2keytemp[pc2[i]];
keykey[s][i]=pc2keytemp[pc2[i]];
}
int lefttemp[32];
int righttemp[32];
for(i=0;i<32;i++)
{
lefttemp[i]=leftmin[i];
righttemp[i]=rightmin[i];
}
int kk[48];
for(i=0;i<48;i++)
kk[i]=rightmin[zhihuane[i]];
for(i=0;i<48;i++)
kk[i]=pc2key[i]^kk[i];
int cc[8][6];
n=0;
for(i=0;i<8;i++)
{
for(j=0;j<6;j++)
{
cc[i][j]=kk[n++];
}
}
int tt[32];
int coutt=0;
int hang=0,lie=0;
for(i=0;i<8;i++)
{
dd(cc[i],hang,lie);
int xx=ss[i][hang*16+lie];
int z=3;
for(z=3;z>=0;z--)
{
tt[i*4+z]=xx%2;
xx=xx/2;
}
}
int dd[32];
for(i=0;i<32;i++)
{
dd[i]=tt[zhihuanp[i]];
}
for(i=0;i<32;i++)
dd[i]=dd[i]^leftmin[i];
for(i=0;i<32;i++)
{
leftmin[i]=righttemp[i];
rightmin[i]=dd[i];
}
lun++;
}
int o;
for(i=0;i<32;i++)
{
o=leftmin[i];
leftmin[i]=rightmin[i];
rightmin[i]=o;
}
for(i=0;i<32;i++)
{
minint[i]=leftmin[i];
minint[i+32]=rightmin[i];
}
for(i=0;i<64;i++)
{
miwen[i]=minint[zhihuanpp[i]];
}
for(i=0;i<64;i++)
cout<<miwen[i];
cout<<endl;
char michar[8];
for(i=0;i<8;i++)
{
long int qq=0;
for(j=0;j<8;j++)
{
qq=(miwen[j+8*i]+qq)*2;
}
qq=qq/2;
michar[i]=(char)(qq);
}
cout<<"加密得到的密文为: ";
for(i=0;i<8;i++)
cout<<michar[i];
cout<<endl;
lun=1;
s=0;
for(i=0;i<8;i++)
mingwen[i]=michar[i];
for(s=0;s<16;s++)
{
int lefttemp[32];
int righttemp[32];
for(i=0;i<32;i++)
{
lefttemp[i]=leftmin[i];
righttemp[i]=rightmin[i];
}
int kk[48];
for(i=0;i<48;i++)
kk[i]=rightmin[zhihuane[i]];
for(i=0;i<48;i++)
kk[i]=keykey[16-lun][i]^kk[i];
int cc[8][6];
n=0;
for(i=0;i<8;i++)
{
for(j=0;j<6;j++)
{
cc[i][j]=kk[n++];
}
}
int tt[32];
int coutt=0;
int hang=0,lie=0;
for(i=0;i<8;i++)
{
dd(cc[i],hang,lie);
int xx=ss[i][hang*16+lie];
int z=3;
for(z=3;z>=0;z--)
{
tt[i*4+z]=xx%2;
xx=xx/2;
}
}
int dd[32];
for(i=0;i<32;i++)
{
dd[i]=tt[zhihuanp[i]];
}
for(i=0;i<32;i++)
dd[i]=dd[i]^leftmin[i];
for(i=0;i<32;i++)
{
leftmin[i]=righttemp[i];
rightmin[i]=dd[i];
}
lun++;
}
for(i=0;i<32;i++)
{
o=leftmin[i];
leftmin[i]=rightmin[i];
rightmin[i]=o;
}
for(i=0;i<32;i++)
{
minint[i]=leftmin[i];
minint[i+32]=rightmin[i];
}
for(i=0;i<64;i++)
{
miwen[i]=minint[zhihuanpp[i]];
}
char jiemichar[8];
for(i=0;i<8;i++)
{
long int qq=0;
for(j=0;j<8;j++)
{
qq=(miwen[j+8*i]+qq)*2;
}
qq=qq/2;
jiemichar[i]=(char)(qq);
}
cout<<"解密得到的明文为: ";
for(i=0;i<8;i++)
cout<<jiemichar[i];
cout<<endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -