S-DES加密

代码如下:

#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;
}

测试结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值