⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s-des.cpp

📁 简单DES的C++代码(8位加密和解密)。
💻 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 + -