📄 s-des.cpp
字号:
#include<iostream>
#include<bitset>
#include<string>
using namespace std;
char S0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
char S1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
bitset<10> P10(bitset<10> b)
{
bitset<10> k;
int T[]={3,5,2,7,4,10,1,9,8,6};
for(int i=0;i<10;i++)
k[9-i]=b[10-T[i]];
return k;
}
bitset<10> LS_1(bitset<10> b)
{
bool bo1,bo2;
int i;
bo1=b[9];
bo2=b[4];
for(i=0;i<4;i++)
{
b[9-i]=b[8-i];
b[4-i]=b[3-i];
}
b[5]=bo1;
b[0]=bo2;
return b;
}
bitset<10> LS_2(bitset<10> b)
{
bool bo1,bo2,bo3,bo4;
bo1=b[9];
bo2=b[8];
bo3=b[4];
bo4=b[3];
for(int i=0;i<3;i++)
{
b[9-i]=b[7-i];
b[4-i]=b[2-i];
}
b[6]=bo1;
b[5]=bo2;
b[1]=bo3;
b[0]=bo4;
return b;
}
bitset<8> P8(bitset<10> b)
{
bitset<8> p;
int T[]={6,3,7,4,8,5,10,9};
for(int i=0;i<8;i++)
p[7-i]=b[10-T[i]];
return p;
}
bitset<8> IP(bitset<8> b)
{
bitset<8> p;
int T[]={2,6,3,1,4,8,5,7};
for(int i=0;i<8;i++)
p[7-i]=b[8-T[i]];
return p;
}
bitset<8> EP(bitset<8> b)
{
bitset<8> p;
int T[]={4,1,2,3,2,3,4,1};
for(int i=0;i<8;i++)
p[7-i]=b[4-T[i]];
return p;
}
bitset<2> Sbox(bitset<4> b,char q[4][4])
{
bitset<2> p;
int r,t;
r=b[3]*2+b[0];
t=b[2]*2+b[1];
int k=q[r][t];
if(k/2==1) p[1]=true;
else p[1]=false;
if(k%2==1) p[0]=true;
else p[0]=false;
return p;
}
bitset<4> P4(bitset<4> b)
{
bitset<4> p;
int T[]={2,4,3,1};
for(int i=0;i<4;i++)
p[3-i]=b[4-T[i]];
return p;
}
bitset<4> fkF(bitset<8> ip,bitset<8> K1)
{
bitset<8> ep=EP(ip);
bitset<8> ep_K1=ep^K1;
bitset<4> L_ep_K1;
bitset<4> R_ep_K1;
for(int i=3;i>=0;i--)
{
L_ep_K1[i]=ep_K1[4+i];
R_ep_K1[i]=ep_K1[i];
}
bitset<2> S0_out=Sbox(L_ep_K1,S0);
bitset<2> S1_out=Sbox(R_ep_K1,S1);
bitset<4> S01;
S01[3]=S0_out[1];
S01[2]=S0_out[0];
S01[1]=S1_out[1];
S01[0]=S1_out[0];
bitset<4> p4=P4(S01);
bitset<4> L_ip;
for(int j=3;j>=0;j--)
L_ip[j]=ip[j+4];
bitset<4> fk=p4^L_ip;
return fk;
}
bitset<8> IP_1(bitset<8> b)
{
bitset<8> p;
int T[]={4,1,3,5,7,2,8,6};
for(int i=0;i<8;i++)
p[7-i]=b[8-T[i]];
return p;
}
bitset<8> SWbox(bitset<4> a,bitset<8> b)
{
bitset<8> SW;
for(int i=3;i>=0;i--)
{
SW[i+4]=b[i];
SW[i]=a[i];
}
return SW;
}
bitset<8> Encryption(bitset<8> plaintext,bitset<8> K1,bitset<8> K2)
{
bitset<8> ip=IP(plaintext);
bitset<4> fk=fkF(ip,K1);
bitset<8> SW=SWbox(fk,ip);
bitset<4> fk2=fkF(SW,K2);
bitset<8> X_1;
for(int j=3;j>=0;j--)
{
X_1[j+4]=fk2[j];
X_1[j]=SW[j];
}
bitset<8> ciphertext=IP_1(X_1);
return ciphertext;
}
int main(int argc,char * argr[])
{
string arg[]={string(argr[1]),string(argr[2]),string(argr[3])};
if(arg[0]=="e")
{
bitset<10> key(arg[1]);
bitset<10> p10=P10(key);
bitset<10> ls_1=LS_1(p10);
bitset<8> K1=P8(ls_1);
bitset<10> ls_2=LS_2(ls_1);
bitset<8> K2=P8(ls_2);
bitset<8> plaintext(arg[2]);
bitset<8> ciphertext=Encryption(plaintext,K1,K2);
cout<<"得到的密文为:"<<ciphertext<<endl;
}
if(arg[0]=="d")
{
bitset<10> key(arg[1]);
bitset<10> p10=P10(key);
bitset<10> ls_1=LS_1(p10);
bitset<8> K1=P8(ls_1);
bitset<10> ls_2=LS_2(ls_1);
bitset<8> K2=P8(ls_2);
bitset<8> plaintext(arg[2]);
bitset<8> ciphertext=Encryption(plaintext,K2,K1);
cout<<"得到的明文为:"<<ciphertext<<endl;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -