代码如下:
#include <iostream>
using namespace std;
char x; //明文;
int dp[10];
int tem[10];
int IP[8]={2,6,3,1,4,8,5,7}; // IP置换
int IP_1[8]={4,1,3,5,7,2,8,6}; // IP逆置换
int P10[10]={3,5,2,7,4,10,1,9,8,6};
int P8[8]={6,3,7,4,8,5,10,9};
int EP[8]={4,1,2,3,2,3,4,1}; //E/P扩展及置换;
int P4[4]={2,4,3,1};
int LS_1[10]={2,3,4,5,1,7,8,9,10,6}; // 左循环一次 (置换);
int LS_2[10]={4,5,1,2,3,9,10,6,7,8}; // 左循环三次 (置换);
int L0[5],R0[5],L1[5],R1[5],L2[5],R2[5];
int f1[5],f2[5]; // S-DES的两个f函数;
int S1[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,0,2}},S2[4][4]={{0,1,2,3},{2,0,1,3},{3,2,1,0},{2,1,0,3}};
char k[10]; // 输入的密钥;
int KK[10]; // 二进制存放的密钥;
int K1[8],K2[8]; // 密钥形成的两个子密码;
int main()
{
int i;
char x;
cout<<"请输入一个字符明文: ";
cin>>x;
cout<<"请输入一个长度为10的字符串作为密钥: ";
cin>>k;
for(i=7;i>=0;i--)
{dp[i]=x%2;x/=2;} //存放明文的二进制;
for(i=0;i<=7;i++)
tem[i]=dp[IP[i]-1];
for(i=0;i<4;i++)
L0[i]=tem[i];
for(i=4;i<8;i++)
L1[i-4]=R0[i-4]=tem[i];
for(i=0;i<10;i++) //密钥的二进制;
{if(k[i]=='1')
KK[i]=1;
else KK[i]=0;}
for(i=0;i<10;i++)
tem[i]=KK[P10[i]-1];
for(i=0;i<10;i++)
dp[i]=tem[LS_1[i]-1];
for(i=0;i<8;i++)
K1[i]=dp[P8[i]-1]; //K1密钥
for(i=0;i<10;i++)
dp[i]=tem[LS_2[i]-1];
for(i=0;i<8;i++)
K2[i]=dp[P8[i]-1]; //K2密钥
// f函数
for(i=0;i<8;i++)
tem[i]=R0[EP[i]-1]; //R0扩展置换
for(i=0;i<8;i++)
dp[i]=tem[i]^K1[i]; //R0扩与K1异或
//S盒查表
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==0) {f1[0]=0;f1[1]=0;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==1) {f1[0]=0;f1[1]=1;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==2) {f1[0]=1;f1[1]=0;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==3) {f1[0]=1;f1[1]=1;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==0) {f1[2]=0;f1[3]=0;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==1) {f1[2]=0;f1[3]=1;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==2) {f1[2]=1;f1[3]=0;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==3) {f1[2]=1;f1[3]=1;}
for(i=0;i<4;i++)
tem[i]=f1[P4[i]-1]; //f1
for(i=0;i<4;i++)
R2[i]=R1[i]=tem[i]^L0[i];
// 下面f2同理
for(i=0;i<8;i++)
tem[i]=R1[EP[i]-1];
for(i=0;i<8;i++)
dp[i]=tem[i]^K2[i];
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==0) {f2[0]=0;f2[1]=0;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==1) {f2[0]=0;f2[1]=1;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==2) {f2[0]=1;f2[1]=0;}
if(S1[dp[0]*2+dp[3]][dp[1]*2+dp[2]]==3) {f2[0]=1;f2[1]=1;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==0) {f2[2]=0;f2[3]=0;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==1) {f2[2]=0;f2[3]=1;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==2) {f2[2]=1;f2[3]=0;}
if(S2[dp[4]*2+dp[7]][dp[5]*2+dp[6]]==3) {f2[2]=1;f2[3]=1;}
for(i=0;i<4;i++)
tem[i]=f2[P4[i]-1];
for(i=0;i<4;i++)
L2[i]=tem[i]^L1[i];
for(i=0;i<4;i++)
{dp[i]=L2[i];dp[i+4]=R2[i];}
for(i=0;i<=7;i++)
tem[i]=dp[IP_1[i]-1];
cout<<"S-DES密文二进制为:";
for(i=0;i<8;i++)
cout<<tem[i];//<<' ';
cout<<endl;
cout<<"S-DES密文为:";
int xs=0;
for(i=0;i<8;i++)
xs=tem[i]+xs*2;
x=char(xs);
cout<<x<<endl;
// cout<<x;
//cout<<x;
return 0;
}
测试结果如下: