{
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 s1,s3,s2[8];
for(i=0;i<8;i++)
{
s1=in[i*6]*2+in[i*6+5]*1;s3=in[i*6+1]*8+in[i*6+2]*4+in[i*6+3]*2+in[i*6+4]*1;
s2[i]=SBox[i][s1*16+s3];
}
int j;
for(i=0;i<8;i++)
for(j=i*4+3;j>=i*4;j--)
{
out[j]=s2[i]%2; s2[i]=s2[i]/2;
}
}
void Encode(unsigned char in[],unsigned char Final_H[],int K[16][48])
{
int i;
int
ORINT[8],ORBYTE[64],FinalBYTE[64],LR[64],R48[48],S_in[48],S_out[32],F_RL[32],FinalINT[8],L[17]
[32],R[17][32];
char ORH[16];
Char_to_Int(in,ORINT,8);
cout<<"!!!!!"<<endl;
O_to_B(ORINT,ORBYTE,8);
Convert(ORBYTE,LR,IP
,64);
Divide(LR,L[0],R[0],64);
for(i=1;i<17;i++)
{
Convert(R[i-1],R48,E,48);
XOR(R48,K[i-1],S_in,48);
S_box(S_in,S_out);
Convert(S_out,F_RL,P
,32);
XOR(F_RL,L[i-1],R[i],32);
COPY(R[i-1],L[i],32);
}
Combine(R[16],L[16],LR,64);
Convert(LR,FinalBYTE,IP_1,64);
cout<<"
二进制的密文
:"<<endl;
for(i=0;i<64;i++)
{
cout<<FinalBYTE[i];
}
cout<<endl<<endl;
B_to_H(FinalBYTE,Final_H);
}
void DeCode(unsigned char in[],unsigned char Final_H[],int K[16][48])
{
int i;
int
ORINT[8],ORBYTE[64],LR[64],R48[48],S_in[48],S_out[32],F_RL[32],FinalBYTE[64],FinalINT[8],L[17]
[32],R[17][32];
char ORH[16];
Char_to_Int(in,ORINT,8);
cout<<"!!!!!"<<endl;
O_to_B(ORINT,ORBYTE,8);
Convert(ORBYTE,LR,IP
,64);
Divide(LR,L[0],R[0],64);
for(i=1;i<17;i++)
{
COPY(R[i-1],L[i],32);
Convert(R[i-1],R48,E,48);
XOR(R48,K[16-i],S_in,48);
S_box(S_in,S_out);
Convert(S_out,F_RL,P
,32);
XOR(L[i-1],F_RL,R[i],32);
}
Combine(R[16],L[16],LR,64);
Convert(LR,FinalBYTE,IP_1,64);
B_to_H(FinalBYTE,Final_H);
}
void main()
{
int i;
unsigned char Msg[8],UnCodeMsg[16],CodeMsg[16],Key[8],Msg_H[16],CodeChar[8];
int SKey[16][48];
int OrByte[64],OrInt[8],FinalByte[64],FinalInt[8];
cout<<"
请输入明文:
"<<endl;
for(i=0;i<8;i++)
cin>>Msg[i];
cout<<"
请输入初始密钥:
"<<endl;
for(i=0;i<8;i++)
cin>>Key[i];
GetKey(Key,SKey);
Encode(Msg,CodeMsg,SKey);
cout<<"
十六进制的密文:
"<<endl;
for(i=0;i<16;i++)
cout<<CodeMsg[i];
cout<<endl;
cout<<"
字符型密文:
"<<endl;
H_to_B(CodeMsg,FinalByte);
B_to_O(FinalByte,FinalInt,8);
Int_to_Char(FinalInt,CodeChar,8);
for(i=0;i<8;i++)
cout<<CodeChar[i];
cout<<endl;
cout<<"
请输入十六进制的密文:
"<<endl;
for(i=0;i<16;i++)
cin>>CodeMsg[i];
B_to_O(FinalByte,FinalInt,8);
Int_to_Char(FinalInt,CodeChar,8);
cout<<"
请输入解密密钥:
"<<endl;
for(i=0;i<8;i++)
cin>>Key[i];
GetKey(Key,SKey);
DeCode(CodeChar,Msg_H,SKey);
//for(i=0;i<16;i++)
//
cout<<Msg_H[i];
cout<<endl;
H_to_B(Msg_H,OrByte);
B_to_O(OrByte,OrInt,8);
Int_to_Char(OrInt,Msg,8);
cout<<"
明文是:
"<<endl;
for(i=0;i<8;i++)
cout<<Msg[i];
cout<<endl;
}