📄 des.cpp
字号:
#include<math.h>
#include<iostream.h>
void main()
{
//////////////////////ketT[]是书中45页的表pc-1
int ketT[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 } ;
cout<<ketT[22]<<endl; // 对密钥key[64]实施换位变换得密钥keyT[56].
//把变换后的密钥等分成两部分,前28位记为C, 后28位记为D.
int C[28];
int D[28];
int i,j;
cout<<"C:"<<endl;
for(i=0;i<28;i++)
{C[i]=ketT[i];cout<<C[i]<<" ";}
cout<<endl;
cout<<"D:"<<endl;
for(i=0;i<28;i++)
{D[i]=ketT[i+28];cout<<D[i]<<" ";}
cout<<endl;
// 串联C,D,得到一个56位数K[56]
int hj;
int E[28];
int F[28];
int K[16][56];
for(hj=0;hj<16;hj++)
{
switch (hj)
{
case 0:
for(j=0;j<28;j++)
{
E[j]=C[j];
F[j]=D[j];
}
for(j=0;j<28;j++)
{
if(j==27)
{C[j]=E[0];D[j]=F[0];}
else
{C[j]=E[j+1];D[j]=F[j+1];}
}
///.//////////////////////////
for(i=0;i<28;i++)
{
K[0][i]=C[i];
}
for(j=0;j<28;j++)
{
K[0][j+28]=D[j];
}
cout<<"k0::";
for(i=0;i<56;i++)
{cout<<K[0][i]<<" ";}
/*cout<<"C:"<<endl;
for(j=0;j<28;j++)
{
cout<<C[j]<<" ";}
cout<<endl;
cout<<"D:"<<endl;
for(j=0;j<28;j++)
{
cout<<D[j]<<" ";}*/
cout<<endl;break;
case 1:
for(j=0;j<28;j++)
{
E[j]=C[j];
F[j]=D[j];
}
for(j=0;j<28;j++)
{
if(j==27)
{C[j]=E[0];D[j]=F[0];}
else
{C[j]=E[j+1];D[j]=F[j+1];}
}
cout<<"k1::";
for(i=0;i<28;i++)
{
K[1][i]=C[i];
}
for(j=0;j<28;j++)
{
K[1][j+28]=D[j];
}
for(i=0;i<56;i++)
{cout<<K[1][i]<<" ";}
//for(i=0;i<56;i++)
/*cout<<"C:"<<endl;
for(j=0;j<28;j++)
{
cout<<C[j]<<" ";}
cout<<endl;
cout<<"D:"<<endl;
for(j=0;j<28;j++)
{
cout<<D[j]<<" ";}*/
cout<<endl;break;
case 8:
for(j=0;j<28;j++)
{
E[j]=C[j];
F[j]=D[j];
}
for(j=0;j<28;j++)
{
if(j==27)
{C[j]=E[0];D[j]=F[0];}
else
{C[j]=E[j+1];D[j]=F[j+1];}
}
cout<<"k8::";
for(i=0;i<28;i++)
{
K[8][i]=C[i];
}
for(j=0;j<28;j++)
{
K[8][j+28]=D[j];
}
for(i=0;i<56;i++)
{cout<<K[8][i]<<" ";}
/* cout<<"C:"<<endl;
for(j=0;j<28;j++)
{
cout<<C[j]<<" ";}
cout<<endl;
cout<<"D:"<<endl;
for(j=0;j<28;j++)
{
cout<<D[j]<<" ";}*/
cout<<endl;break;
case 15:
for(j=0;j<28;j++)
{
E[j]=C[j];
F[j]=D[j];
}
for(j=0;j<28;j++)
{
if(j==27)
{C[j]=E[0];D[j]=F[0];}
else
{C[j]=E[j+1];D[j]=F[j+1];}
}
cout<<"k15::";
for(i=0;i<28;i++)
{
K[15][i]=C[i];
}
for(j=0;j<28;j++)
{
K[15][j+28]=D[j];
}
for(i=0;i<56;i++)
{cout<<K[15][i]<<" ";}
/* cout<<"C:"<<endl;
for(j=0;j<28;j++)
{
cout<<C[j]<<" ";}
cout<<endl;
cout<<"D:"<<endl;
for(j=0;j<28;j++)
{
cout<<D[j]<<" ";}*/
cout<<endl;break;
default:
for(j=0;j<28;j++)
{
E[j]=C[j];F[j]=D[j];
}
for(j=0;j<28;j++)
{
if(j==26)
{C[j]=E[0];D[j]=F[0];}
else
{if(j==27)
{C[j]=E[1];D[j]=F[1];}
else
{C[j]=E[j+2];D[j]=F[j+2];}}
}
cout<<"k"<<hj<<"::";
for(j=0;j<28;j++)
{
K[hj][j]=C[j];
}
for(j=0;j<28;j++)
{
K[hj][j+28]=D[j];
}
for(j=0;j<56;j++)
{cout<<K[hj][j]<<" ";}
/*for(j=0;j<28;j++)
cout<<C[j]<<" ";
cout<<endl;
for(j=0;j<28;j++)
cout<<D[j]<<" ";*/
cout<<endl;break;
}
}
cout<<endl;cout<<endl;
cout<<"as"<<endl;
for(i=0;i<16;i++)
{for(j=0;j<56;j++)
{cout<<K[i][j]<<" ";}
cout<<endl;}
cout<<endl;cout<<endl;
////产生48位子密钥sonkey[i][48],zmy[i][j]是保存密钥初始表中的j位置
//hg[]是书中45页的表pc-2
int hg[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 zmy[16][48];
int r;
cout<<"产生16个48位子密钥的位置置换为:"<<endl;
for(i=0;i<16;i++)
{
for(j=0;j<48;j++)
{
r=hg[j];
zmy[i][j]=K[i][r];
cout<<zmy[i][j]<<" ";
}
cout<<endl;
}
int miyao[64]={0,0,1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};;
int sonkey[16][48];
int myao;
int zhong;
/*cout<<"请输入一个64位的初始密钥:"<<endl;
for(i=0;i<64;i++)
{
cin>>myao;
miyao[i]=myao;
}*/
cout<<"产生的16个密钥是:(二进制数)"<<endl;
for(i=0;i<16;i++)
{
cout<<"K"<<i<<endl;
for(j=0;j<48;j++)
{
zhong=zmy[i][j];
sonkey[i][j]=miyao[zhong];
zhong=0;
cout<<sonkey[i][j]<<" ";
}
cout<<endl;
}
///////////////////////////////对待加密的数据块DATA[64]置换位变换表(书43页IP表)
int change[64]={ 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, //->L[0]
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 }; //->R[0]
////////////////逆初始置换表nibiao[](书43页IP~表)
int nibiao[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};
////////////////////////////////////////////////////////////////////
//构造8个s 盒
int S[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,//s1
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,//s2
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,//s3
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,//s4
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,//s5
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -