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