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

📄 des.h

📁 DES 加解密算法的VC实现
💻 H
字号:
#ifndef DES_h
#define DES_h
#include "Cipher.h"
#include <bitset>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#define INITDES "initialdes.txt"
class DES: public Cipher{
public:
    DES(char* keyfile);
	void Sonkey();
    bitset<64> Enciphering(bitset<64> m);
    bitset<64> Deciphering(bitset<64> c);
	void Encipher(char* mfile,char* cfile);
	void Decipher(char* cfile,char* dfile);
private:
	bitset<64> Key[1];
	bitset<48> K[17];
	bitset<32> l[17],ri[17],X[17],Y[17];
	int PC_I[57];
	int PC_II[49];
	int r[17];
	int Di[49];
	int Mp[33],Sb[9][4][16];
	int Ip[65],Ip_1[65];
	bitset<48> DI(bitset<32> x);
	bitset<32> SBOX(bitset<48> x);
	bitset<32> MP(bitset<32> x);
	bitset<64> IP(bitset<64> x);
	bitset<64> IP_1(bitset<64> x);
	bitset<32> L(bitset<64> x);
	bitset<32> R(bitset<64> x);
	bitset<64> SW(bitset<32> x,bitset<32> y);
	bitset<32> f(bitset<32> Ri_1,bitset<48> Ki);
	long mingsize,ciphersize;
};
bitset<48> DES::DI(bitset<32> x){
	bitset<48> y;int i;bool t;
	for( i=47;i>=0;i--){
		t=x.at(32-Di[48-i]);y.set(i,t);}
	//cout<<y<<endl;
	return y;
}
bitset<32> DES::MP(bitset<32> x){
	bitset<32> y;int i;bool t;
	for(i=31;i>=0;i--){
		t=x.at(32-Mp[32-i]);y.set(i,t);}
	return y;
}
bitset<64> DES::IP(bitset<64> x){
	bitset<64> y;int i;bool t;
	for(i=63;i>=0;i--){
		t=x.at(64-Ip[64-i]);
		y.set(i,t);}
	//cout<<y<<endl;
	return y;
}
bitset<64> DES::IP_1(bitset<64> x){
	bitset<64> y;int i;bool t;
	for(i=63;i>=0;i--){
		t=x.at(64-Ip_1[64-i]);y.set(i,t);}
	return y;
}
bitset<32> DES::L(bitset<64> x){
	bitset<32> y;int i;bool t;
	for(i=63;i>=32;i--){
		t=x.at(i);y.set(i-32,t);}
	return y;
}
bitset<32> DES::R(bitset<64> x){
	bitset<32> y;int i;bool t;
	for(i=31;i>=0;i--){
		t=x.at(i);y.set(i,t);}
	return y;
}
bitset<64> DES::SW(bitset<32> x,bitset<32> y){
	bitset<64> z;int i;bool t;
	for(i=31;i>=0;i--){
		t=x.at(i);z.set(i,t);}
	for(i=31;i>=0;i--){
		t=y.at(i);z.set(i+32,t);}
	return z;
}
bitset<32> DES::f(bitset<32> Ri_1,bitset<48> Ki){
	bitset<48> U;
	bitset<32> V;
	U=DI(Ri_1);
	U=U^Ki;
	//cout<<Ki<<endl;
	//cout<<U<<endl;
	V=SBOX(U);
	//cout<<V<<endl;
	V=MP(V);
	//cout<<V<<endl;
	return V;
}
DES::DES(char* keyfile)
{//
	int i,j,k,m;bitset<8> tt;string str;ciphersize=0;
	char s[64]={'1'},x[8];unsigned char c,c1;unsigned int t;//={0},
	ifstream fin(keyfile,ios::in|ios::binary);//|ios::nocreate|
	if(!fin){
		cout<<keyfile<<" cannot be openned!"<<endl;exit(1);
	}
	for( i=0;i<8;i++){
		c=fin.get();
		t=unsigned int(c);//
		tt=t;//_itoa(t,x,2);
		str=tt.to_string();
		strcpy(x,str.c_str());
		k=i*8;
		for( j=0;j<8;j++)
		{m=k+j;s[m]=x[j];}//{cout<<s[i*8+j]<<endl;}
		if(i==0) c1=s[0];//////
	}
	s[64]='\0';
	s[0]=c1;////
	Key[0]=bitset<64>(s);
	//cout<<"种子密匙: "<<Key[0]<<endl;//输出K[0];
	fin.close();
    fin.open(INITDES,ios::in);//|ios::binary|ios::nocreate|
	if(!fin){
		cout<<keyfile<<" cannot be openned!"<<endl;exit(1);
	}
	for(i=1;i<57;i++)
	{fin>>PC_I[i]>>c;}//cout<<PC_I[i];
	for(i=1;i<49;i++)
	{fin>>PC_II[i]>>c;}//cout<<endl;cout<<PC_II[i]<<",";
	for(i=1;i<17;i++)
	{fin>>r[i]>>c;}//cout<<endl;cout<<r[i]<<",";
	for(i=1;i<=48;i++)
	{fin>>Di[i]>>c;}//cout<<Di[i]<<",";cout<<endl;
	for(i=1;i<=32;i++)
	{fin>>Mp[i]>>c;}//cout<<Mp[i]<<",";cout<<endl;
	for(k=1;k<=8;k++)
		for(i=0;i<4;i++)
		for(j=0;j<16;j++)
		{fin>>Sb[k][i][j]>>c;}//{cout<<Sb[k][i][j]<<",";cout<<endl;}
	for(i=1;i<=64;i++)
	{fin>>Ip[i]>>c;}//cout<<Ip[i]<<",";cout<<endl;
	for(i=1;i<=64;i++)
	{fin>>Ip_1[i]>>c;}//cout<<Ip_1[i]<<",";cout<<endl;
	fin.close();
}
void DES::Sonkey(){
	bitset<28> C[17],D[17];
	int i,j;
	bool t;
	bitset<56> w;
	for(i=55;i>=0;i--){
		t=Key[0].at(64-PC_I[56-i]);
		w.set(i,t);}//
	//cout<<w<<endl;
	for(i=55;i>=28;i--){
		t=w.at(i);C[0].set(i-28,t);}//cout<<C[0]<<endl;
		for(i=27;i>=0;i--){
			t=w.at(i);D[0].set(i,t);}//cout<<D[0]<<endl;
			for(i=1;i<=16;i++){
				if(r[i]==1){for(j=27;j>=0;j--)
				{t=C[i-1].at(j);C[i].set((j+1)%28,t);}//cout<<C[i]<<endl;
				for(j=27;j>=0;j--)
				{t=D[i-1].at(j);D[i].set((j+1)%28,t);}}//cout<<D[i]<<endl;
				else {for(j=27;j>=0;j--)
				{t=C[i-1].at(j);C[i].set((j+2)%28,t);}//cout<<C[i]<<endl;
				for(j=27;j>=0;j--)
				{t=D[i-1].at(j);D[i].set((j+2)%28,t);}}//cout<<D[i]<<endl;
				for(j=55;j>=28;j--){
                t=C[i].at(j-28);w.set(j,t);}
                for(j=27;j>=0;j--){
                t=D[i].at(j);w.set(j,t);}
				//cout<<w<<endl;
				for(j=47;j>=0;j--){
					t=w.at(56-PC_II[48-j]);
					K[i].set(j,t);}
				//cout<<K[i]<<endl;
			}//结束i;			
}
bitset<32> DES::SBOX(bitset<48> x){
	bitset<32> y;int i,j,k,l,ro,co,z;bool t,b[6];char row[2],col[4];
	bitset<2> m;
	bitset<4> n;
	bitset<6> U[9];
	bitset<4> V[9];
	//cout<<x<<endl;
	for(i=1;i<=8;i++)
	{for(j=1;j<=6;j++)
	{z=48-(i-1)*6-j;
	t=x.at(z);
	U[i].set(6-j,t);}
	}//cout<<U[i]<<endl;
	for(k=1;k<=8;k++){
		for(l=0;l<6;l++)
		b[l]=U[k].at(l);
		if(b[5])row[0]='1';else row[0]='0';
		if(b[0])row[1]='1';else row[1]='0';
		m=bitset<2>(row);
		ro=m.to_ulong();
		for(l=4;l>=1;l--){
			if(b[l])col[4-l]='1';else col[4-l]='0';}
		n=bitset<4>(col);
		co=n.to_ulong();
		V[k]=Sb[k][ro][co];//cout<<V[k]<<endl;
	}
	for(i=1;i<=8;i++)
	for(j=1;j<=4;j++)
		{t=V[i].at(4-j);z=32-(i-1)*4-j;y.set(z,t);}//cout<<y<<endl;
	return y;

}
bitset<64> DES::Enciphering(bitset<64> M){
	int i;
	bitset<64> Z,C;
	Z=IP(M);
	l[0]=L(Z);ri[0]=R(Z);//cout<<l[0]<<endl;cout<<ri[0]<<endl;
	for(i=1;i<=16;i++){
		l[i]=ri[i-1];
		ri[i]=l[i-1]^f(ri[i-1],K[i]);}
	Z=SW(l[16],ri[16]);
	//cout<<l[16]<<endl;
	//cout<<ri[16]<<endl;
	C=IP_1(Z);
	//for(i=0;i<=16;i++){cout<<l[i]<<endl;cout<<ri[i]<<endl<<endl;;}cout<<"分割"<<endl;
	return C;
}
bitset<64> DES::Deciphering(bitset<64> C){
	//cout<<C<<endl;
	bitset<64> Z,M;int i;
	Z=IP(C);
	X[0]=L(Z);Y[0]=R(Z);
	for(i=1;i<=16;i++){
		X[i]=Y[i-1];
		Y[i]=X[i-1]^f(Y[i-1],K[17-i]);}//cout<<K[17-i]<<endl;
	Z=SW(X[16],Y[16]);
	M=IP_1(Z);//cout<<M<<endl;
	//for(i=0;i<=16;i++){cout<<X[i]<<endl;cout<<Y[i]<<endl<<endl;}
	return M;
}
void DES::Encipher(char* mfile,char* cfile){
	bitset<64> Z,C;bitset<8> tt;string str;
	int i,j,k;
	char ch[8][8];char cstr[64];
	char s[64]={'1'},x[8];unsigned char c,c1,c2;unsigned int t;//
	ifstream fin(mfile,ios::binary||ios::in);//|ios::nocreate
	if(!fin){
		cout<<mfile<<" cannot be openned!"<<endl;exit(1);
	}
	ofstream fout(cfile,ios::binary||ios::trunc||ios::out);//||ios::nocreate
	if(!fout){
		cout<<cfile<<" cannot be openned!"<<endl;exit(1);
	}/**/
	c=fin.get();
	while(fin){//取数据:c-255
		t=unsigned int(c);
		tt=t;//_itoa(t,x,2);
		str=tt.to_string();
		strcpy(x,str.c_str());
		for( j=0;j<8;j++)
		{s[j]=x[j];}
		c1=x[0];
	for( i=1;i<8;i++){
		c=fin.get();
		t=unsigned int(c);
		tt=t;//_itoa(t,x,2);
		str=tt.to_string();
		strcpy(x,str.c_str());
		k=i*8;
		for( j=0;j<8;j++)
		{s[k+j]=x[j];}
	}
	c=fin.get();
	s[0]=c1;
	s[64]='\0';	
	//cout<<endl;
    Z=bitset<64>(s);
	//cout<<"明文编码: "<<Z<<endl;
	{//加密开始:
		C=Enciphering(Z);
		//cout<<"密文编码: "<<C<<endl;
		str=C.to_string();
		//cout<<str<<endl;
        strcpy(cstr,str.c_str());
        //cout<<cstr<<endl;
		for(i=0;i<8;i++){
			for(j=0;j<8;j++){k=i*8+j;ch[i][j]=cstr[k];}
			tt=bitset<8>(ch[i]);
			t=tt.to_ulong();
			c2=t;fout.put(c2);ciphersize++;}
		//
	}//加密结束;
	}//结束while;
	fin.close();
	fout.close();
}
void DES::Decipher(char* cfile,char* dfile){
	bitset<64> C,D;bitset<8> tt;string str;
	int i,j,k;
	char ch[8][8];char cstr[64];
	char s[64]={'1'},x[8];unsigned char c,c1,c2;unsigned int t;//
	ifstream fin(cfile,ios::binary||ios::in);//ios::nocreate||
	if(!fin){
		cout<<cfile<<" cannot be openned!"<<endl;exit(1);
	}
	ofstream fout(dfile,ios::binary||ios::trunc||ios::out);//|ios::nocreate||
	if(!fout){
		cout<<dfile<<" cannot be openned!"<<endl;exit(1);
	}/**/
	    //cout<<ciphersize<<endl;
		c=fin.get();//ciphersize--;cout<<ciphersize<<endl;
	while(fin){//取数据:ciphersize>1	
		t=unsigned int(c);//if(c==255)cout<<t<<endl;
		tt=t;//_itoa(t,x,2);
		str=tt.to_string();
		strcpy(x,str.c_str());
		for( j=0;j<8;j++)
		s[j]=x[j];
		c1=x[0];/**/
		//
	for( i=1;i<8;i++){
		c=fin.get();//ciphersize--;cout<<ciphersize<<endl;
		t=unsigned int(c);
		tt=t;//_itoa(t,x,2);
        str=tt.to_string();
		strcpy(x,str.c_str());
		k=i*8;
		for( j=0;j<8;j++)
		s[k+j]=x[j];
	}
	c=fin.get();//ciphersize--;cout<<ciphersize<<endl;//
	s[0]=c1;
	s[64]='\0';	
	//for(i=0;i<64;i++)cout<<s[i];
	C=bitset<64>(s);
	//cout<<s<<endl;
	//cout<<C<<endl;
	{//解密开始:
		D=Deciphering(C);
		//cout<<D<<endl;
		str=D.to_string();
        strcpy(cstr,str.c_str());
        //cout<<cstr<<endl;
		for(i=0;i<8;i++){
			for(j=0;j<8;j++){k=i*8+j;ch[i][j]=cstr[k];}
			tt=bitset<8>(ch[i]);
			t=tt.to_ulong();
			c2=t;fout.put(c2);}
		//
	}//解密结束;
	}//结束while;
	fin.close();
	fout.close();
}/**/
#endif

⌨️ 快捷键说明

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