📄 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 + -