📄 des.cpp
字号:
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,//s6
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,//s7
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};//s8
////////////////////////////////////////////////////////////////////
//经过s置换后,将得到的数据再次置换时所用的表tmp
int tmp[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};
/////// / ////////////////////////////////////////////////////////////
//根据下面表格扩充32位数据R[0][i]为48位数据RR[j]。
int kch[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 kkk,jj;
int RR[48];
int gg[48];//保存异或运算产生的值
int b1,b2,b3,b4,b5,b6,b7;
int ss[8];//保存由s盒替换得到的值
/////////////////////////////////////////////////
//由转换表转换后的64位数据块data[64]
int DATA[64]={1,0,1,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,
0,1,0,0,0,0,0,1,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
int data[64];
int n,chk;
/*cout<<"请输入64位的0,1数据"<<endl;
for(i=0;i<64;i++)
{
cin>>n;
DATA[i]=n;
}*/
for(i=0;i<64;i++)
{
chk=change[i];
data[i]=DATA[chk-1];//change中的最小值为1
chk=0;
}
////////////////////////////////////////////////////////////
//将变换后的数据块分成前后两部分,前32位记为L[0][32],后32位记为R[0][32].
int L[17][32];
int R[17][32];
for(i=0;i<32;i++)
{
L[0][i]=data[i];
R[0][i]=data[i+32];
}
/////用RR[48]与子密钥sonkey[i][48]作异或运算。
int uj;
for(uj=0;uj<16;uj++)
{ for(i=0;i<48;i++)
{
kkk=kch[i];
RR[i]=R[uj][kkk];//扩充的48位数据RR[j]。
jj=RR[i]+sonkey[uj][i];//以一轮进行异或运算
if(jj==2)
{gg[i]=0;}
else
{gg[i]=jj;}
}
////////////////////////////////////////
///把所得的gg[i]48位数分成8个6位数B[8][6]。1-6位为B[0][6],7-12位为B[1][6],……,43-48位为B[7][6]。
int B[8][6];
for(i=0;i<6;i++)
{
B[0][i]=gg[i];
B[1][i]=gg[i+6];
B[2][i]=gg[i+12];
B[3][i]=gg[i+18];
B[4][i]=gg[i+24];
B[5][i]=gg[i+30];
B[6][i]=gg[i+36];
B[7][i]=gg[i+42];
}
//////////////////////////////////////////////////
//用S密箱里的值替换B[][],保存在ss[]里
for(i=0;i<8;i++)
{
b1=2*B[i][0]+B[i][5];//b1对应s盒行值
b2=2*2*2*B[i][1]+2*2*B[i][2]+2*B[i][3]+B[i][4];//b2对应s盒列值
//用S密箱里的值S[j][m][n]替换B[][]
b3=S[i][b1][b2];
ss[i]=b3;
b1=0;b2=0;
cout<<ss[i]<<" ";
}
int yuan[32];//将ss[i]化为二进制
for(i=0;i<8;i++)
{
b3=ss[i];
b4=b3-8;
if(b4>0)
{yuan[4*i]=1;}
else {yuan[4*i]=0;}
b5=b4-4;
if(b5>0)
{yuan[4*i+1]=1;}
else {yuan[4*i+1]=0;}
b6=b5-2;
if(b6>0)
{yuan[4*i+2]=1;}
else {yuan[4*i+2]=0;}
b7=b6-1;
if(b7>0)
{yuan[4*i+3]=1;}
else {yuan[4*i+3]=0;}
}
//////////////////////////////////////////////////////////////////////
//对yuan[32]做作换位变换为tmp1[32]
int fb;
int tmp1[32];
for(i=0;i<32;i++)
{
fb=tmp[i];//置换表中的数值
tmp1[i]=yuan[fb];
}////到此产生了加密函数f///
/////////////////////////把得到的结果tmp1[32]与L[i][32]作异或运算.把计算结果賦给R[i+1][32]。
for(i=0;i<32;i++)
{
jj=tmp1[i]+L[uj][i];//以一轮进行异或运算
if(jj==2)
{gg[i]=0;}
else
{gg[i]=jj;}
}
for(i=0;i<32;i++)
{
R[uj+1][i]=gg[i];
L[uj+1][i]=R[uj][i];
}
cout<<endl;
for(i=0;i<32;i++)
cout<< L[uj+1][i]<<" ";
cout<<endl;
for(i=0;i<32;i++)
cout<< R[uj+1][i]<<" ";
cout<<endl;
}
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
//////把R[16]和L[16] 顺序串联起来得到一个64位数tmp2[64]。
int tmp2[64];
for(i=0;i<32;i++)
{
tmp2[i]=R[16][i];
tmp2[i+32]=L[16][i];
}
for(i=0;i<64;i++)
cout<<tmp2[i]<<" ";
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
int out[64];
for(i=0;i<64;i++)
{
kkk=nibiao[i];
out[kkk-1]=tmp2[i];//nibiao中的最小值为1
}
cout<<"加密过的64位数据为:"<<endl;
for(i=0;i<64;i++)
cout<<out[i]<<" ";
cout<<endl;
//////以上是对一个64位的明文进行的加密过程/////////////////////////////////////
/* ////////////////////////////////////////////////////
for(i=0;i<32;i++)
{
L[0][i]=tmp2[i+32];
R[0][i]=tmp2[i];
}
/////用RR[48]与子密钥sonkey[i][48]作异或运算。
for(uj=0;uj<16;uj++)
{
for(i=0;i<48;i++)
{
kkk=kch[i];
RR[i]=L[uj][kkk];//扩充的48位数据RR[j]。
cout<<RR[i];
jj=RR[i]+sonkey[15-uj][i];//以一轮进行异或运算
if(jj==2)
{gg[i]=0;}
else
{gg[i]=jj;}
}
////////////////////////////////////////
///把所得的gg[i]48位数分成8个6位数B[8][6]。1-6位为B[0][6],7-12位为B[1][6],……,43-48位为B[7][6]。
int B[8][6];
for(i=0;i<6;i++)
{
B[0][i]=gg[i];
B[1][i]=gg[i+6];
B[2][i]=gg[i+12];
B[3][i]=gg[i+18];
B[4][i]=gg[i+24];
B[5][i]=gg[i+30];
B[6][i]=gg[i+36];
B[7][i]=gg[i+42];
}
//////////////////////////////////////////////////
//用S密箱里的值替换B[][],保存在ss[]里
for(i=0;i<8;i++)
{
b1=2*B[i][0]+B[i][5];//b1对应s盒行值
b2=2*2*2*B[i][1]+2*2*B[i][2]+2*B[i][3]+B[i][4];//b2对应s盒列值
//用S密箱里的值S[j][m][n]替换B[][]
b3=S[i][b1][b2];
ss[i]=b3;
b1=0;b2=0;
cout<<ss[i]<<" ";
}
int yuan[32];//将ss[i]化为二进制
for(i=0;i<8;i++)
{
b3=ss[i];
b4=b3-8;
if(b4>0)
{yuan[4*i]=1;}
else {yuan[4*i]=0;}
b5=b4-4;
if(b5>0)
{yuan[4*i+1]=1;}
else {yuan[4*i+1]=0;}
b6=b5-2;
if(b6>0)
{yuan[4*i+2]=1;}
else {yuan[4*i+2]=0;}
b7=b6-1;
if(b7>0)
{yuan[4*i+3]=1;}
else {yuan[4*i+3]=0;}
}
//////////////////////////////////////////////////////////////////////
//对yuan[32]做作换位变换为tmp1[32]
int fb;
int tmp1[32];
for(i=0;i<32;i++)
{
fb=tmp[i];//置换表中的数值
tmp1[i]=yuan[fb];
}
/////////////////////////把得到的结果tmp1[32]与R[i][32]作异或运算.把计算结果賦给L[i-1][32]。
for(i=0;i<32;i++)
{
jj=tmp1[i]+R[uj][i];//以一轮进行异或运算
if(jj==2)
{gg[i]=0;}
else
{gg[i]=jj;}
}
for(i=0;i<32;i++)
{
L[uj+1][i]=gg[i];
R[uj+1][i]=L[uj][i];
}
cout<<endl;
for(i=0;i<32;i++)
cout<< L[uj+1][i]<<" ";
cout<<endl;
for(i=0;i<32;i++)
cout<< R[uj+1][i]<<" ";
cout<<endl;
}
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
//////把R[16]和L[16] 顺序串联起来得到一个64位数tmp2[64]。
for(i=0;i<32;i++)
{
tmp2[i+32]=R[16][i];
tmp2[i]=L[16][i];
}
for(i=0;i<64;i++)
cout<<tmp2[i]<<" ";
cout<<endl;cout<<endl;cout<<endl;cout<<endl;
int yout[64];
for(i=0;i<64;i++)
{
kkk=nibiao[i];
yout[kkk-1]=tmp2[i];
}
cout<<"明文为:"<<endl;
for(i=0;i<64;i++)
cout<<yout[i]<<" ";*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -