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

📄 s-des.cpp

📁 信息安全中的S-DES的实现
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

void IP(string &st,char* ss)//置换函数
{
	st[0]=ss[1];
	st[1]=ss[5];
	st[2]=ss[2];
	st[3]=ss[0];
	st[4]=ss[3];
	st[5]=ss[7];
	st[6]=ss[4];
	st[7]=ss[6];
}

void IP_1(char* st,string &ss)//逆置换函数
{
	st[0]=ss[3];
	st[1]=ss[0];
	st[2]=ss[2];
	st[3]=ss[4];
	st[4]=ss[6];
	st[5]=ss[1];
	st[6]=ss[7];
	st[7]=ss[5];
}

void P10(string &st,char* ss)//密钥第一次置换
{
	st[0]=ss[2];
	st[1]=ss[4];
	st[2]=ss[1];
	st[3]=ss[6];
	st[4]=ss[3];
	st[5]=ss[9];
	st[6]=ss[0];
	st[7]=ss[8];
	st[8]=ss[7];
	st[9]=ss[6];
}

void P8(string &st,string &ss)//密钥第二次置换
{
	st[0]=ss[5];
	st[1]=ss[2];
	st[2]=ss[6];
	st[3]=ss[3];
	st[4]=ss[7];
	st[5]=ss[4];
	st[6]=ss[9];
	st[7]=ss[8];
}

void LS_1(string &ss)//循环左移1位
{
	char temp;
	temp=ss[0];
	ss[0]=ss[1];
	ss[1]=ss[2];
	ss[2]=ss[3];
	ss[3]=ss[4];
	ss[4]=temp;

	temp=ss[5];
	ss[5]=ss[6];
	ss[6]=ss[7];
	ss[7]=ss[8];
	ss[8]=ss[9];
	ss[9]=temp;
}

void LS_2(string &ss)//循环左移2位
{
	char temp1,temp2;
	temp1=ss[0];
	temp2=ss[1];
	ss[0]=ss[2];
	ss[1]=ss[3];
	ss[2]=ss[4];
	ss[3]=temp1;
	ss[4]=temp2;

	temp1=ss[5];
	temp2=ss[6];
	ss[5]=ss[7];
	ss[6]=ss[8];
	ss[7]=ss[9];
	ss[8]=temp1;
	ss[9]=temp2;
}

void EP(string &st,string &ss)              // E/P扩展并置换
{
	st[0]=ss[7];
	st[1]=ss[4];
	st[2]=ss[5];
	st[3]=ss[6];
	st[4]=ss[5];
	st[5]=ss[6];
	st[6]=ss[7];
	st[7]=ss[4];
}

void KeyXor(string &ss,string &kk)          //与密钥做异或操作
{
	ss[0]=(char)((ss[0]+kk[0])%2+48);
	ss[1]=(char)((ss[1]+kk[1])%2+48);
	ss[2]=(char)((ss[2]+kk[2])%2+48);
	ss[3]=(char)((ss[3]+kk[3])%2+48);
	ss[4]=(char)((ss[4]+kk[4])%2+48);
	ss[5]=(char)((ss[5]+kk[5])%2+48);
	ss[6]=(char)((ss[6]+kk[6])%2+48);
	ss[7]=(char)((ss[7]+kk[7])%2+48);
}

void S0(string &st,string &ss) //S0盒
{
	int a,b,c;
	int s0[4][4];
	s0[0][0]=1;   s0[0][1]=0;   s0[0][2]=3;   s0[0][3]=2;  
	s0[1][0]=3;   s0[1][1]=2;   s0[1][2]=1;   s0[1][3]=0; 
	s0[2][0]=0;   s0[2][1]=2;   s0[2][2]=1;   s0[2][3]=3; 
	s0[3][0]=3;   s0[3][1]=1;   s0[3][2]=3;   s0[3][3]=2;
	
	a=(int)ss[0]%2*2+(int)ss[3]%2;
	b=(int)ss[1]%2*2+(int)ss[2]%2;
	c=s0[a][b];

	st[0]=(char)(c/2+48);
	st[1]=(char)(c%2+48);
}

void S1(string &st,string &ss) //S1盒
{
	int a,b,c;
	int s1[4][4];
	s1[0][0]=0;   s1[0][1]=1;   s1[0][2]=2;   s1[0][3]=3;  
	s1[1][0]=2;   s1[1][1]=0;   s1[1][2]=1;   s1[1][3]=3; 
	s1[2][0]=3;   s1[2][1]=0;   s1[2][2]=1;   s1[2][3]=0; 
	s1[3][0]=2;   s1[3][1]=1;   s1[3][2]=0;   s1[3][3]=3;
	
	a=(int)ss[4]%2*2+(int)ss[7]%2;
	b=(int)ss[5]%2*2+(int)ss[6]%2;
	c=s1[a][b];

	st[2]=(char)(c/2+48);
	st[3]=(char)(c%2+48);
}

void Xor(string &st,string &ss)//与p4异或
{
	st[0]=(char)((st[0]+ss[0])%2+48);
	st[1]=(char)((st[1]+ss[1])%2+48);
	st[2]=(char)((st[2]+ss[2])%2+48);
	st[3]=(char)((st[3]+ss[3])%2+48);
}

void SW(string &st)           //交换函数
{
	string temp="----";
	temp[0]=st[0];
	temp[1]=st[1];
	temp[2]=st[2];
	temp[3]=st[3];
	st[0]=st[4];
	st[1]=st[5];
	st[2]=st[6];
	st[3]=st[7];
	st[4]=temp[0];
	st[5]=temp[1];
	st[6]=temp[2];
	st[7]=temp[3];
}

void main()
{
	fstream file;
	char* s=new char[100];
	string t="--------",u="--------",k1="--------",k2="--------",p4="----";
	char fileName[20];
	cout<<"请输入明文文件:\n";
	cin>>fileName;
	file.open(fileName,ios::in);//打开明文文件
	if(! file)
	{
		cerr<<"明文文件不能被打开!"<<endl;
		abort();
	}
	file.getline(s,100);
	//cout<<s<<endl;
	file.close();

/****** 密钥生成模块***************************************/
	fstream keyfile;
	char* k=new char[100];
	string kt="----------";
	char keyfileName[20];
	cout<<"请输入密钥文件名:\n";
	cin>>keyfileName;
	keyfile.open(keyfileName,ios::in);
	if(! keyfile)
	{
		cerr<<"密钥文件不能被打开!"<<endl;
		abort();
	}
	keyfile.getline(k,100);
	keyfile.close();
	//cout<<k<<endl;
	P10(kt,k);
	LS_1(kt);                             //循环左移1位
	P8(k1,kt);
    LS_2(kt);                             //循环左移2位
	P8(k2,kt);
	//cout<<k1<<endl;
	//cout<<k2<<endl;
/**********************************************************/

/*@@@@@@@@@@@@ 加密模块 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
	IP(t,s);           //将明文进行IP置换
	//cout<<t<<endl;

/****** fk1 *****************************/
	EP(u,t);
	//cout<<u<<endl;
	KeyXor(u,k1);      //与密钥k1进行异或
	//cout<<u<<endl;
	S0(p4,u);
	//cout<<p4<<endl;
	S1(p4,u);
	//cout<<p4<<endl;
	Xor(t,p4);
	//cout<<t<<endl;
/****************************************/

	SW(t);             //交换左右两半

/****** fk2 *****************************/
	EP(u,t);
	//cout<<u<<endl;
	KeyXor(u,k2);      //与密钥k2进行异或
	//cout<<u<<endl;
	S0(p4,u);
	//cout<<p4<<endl;
	S1(p4,u);
	//cout<<p4<<endl;
	Xor(t,p4);
	//cout<<t<<endl;
/****************************************/

	IP_1(s,t);         //IP逆置换

	cout<<"密文为:"<<s<<endl;

	fstream codefile;
	codefile.open("cipher.dat",ios::out);
	if(! codefile)
	{
		cerr<<"密文文件不能被打开!"<<endl;
		abort();
	}
	codefile<<s;
	codefile.close();
	cout<<"密文已存入密文文件cipher.dat!\n\n";
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/


	fstream infile;
	char* c=new char[100];
	char codefileName[20];
	cout<<"请输入密文文件:\n";
	cin>>codefileName;
	infile.open(codefileName,ios::in);//打开明文文件
	if(! infile)
	{
		cerr<<"密文文件不能被打开!"<<endl;
		abort();
	}
	infile.getline(c,100);
	infile.close();
/*@@@@@@@@@@@@ 解密模块 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/	
	IP(t,c);

	EP(u,t);
	KeyXor(u,k2);
	S0(p4,u);
	S1(p4,u);
	Xor(t,p4);

	SW(t);

	EP(u,t);
	KeyXor(u,k1);      
	S0(p4,u);
	S1(p4,u);
	Xor(t,p4);

	IP_1(c,t);

	cout<<"明文为:"<<c<<endl;

	fstream minfile;
	minfile.open("descrypt.dat",ios::out);
	if(! minfile)
	{
		cerr<<"明文文件不能被打开!"<<endl;
		abort();
	}
	minfile<<c;
	minfile.close();
	cout<<"明文已存入明文文件descrypt.dat!\n\n";
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -