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

📄 destest.cpp

📁 des的完整实现
💻 CPP
字号:
#include "DEStest.h"
#include "stdafx.h"


void chartobits(chars ch,bits *bts)                    //字符转位
{
	int cnt1,cnt2,pos;

	for(cnt1=0;cnt1<ch.totalchar;cnt1++)
	{
		pos=int(ch.ch[cnt1]);
		pos=pos<0?pos+256:pos;		
		for(cnt2=7;cnt2>=0;cnt2--)
		{
			bts->bit[cnt1*ch.totalchar+cnt2]=(pos%2!=0)?true:false;
			pos/=2;
		}
	}
	bts->totalbit=ch.totalchar*8;
}


void bitstochar(bits bts,chars *ch)         //位转字符
{
	int cnt1,cnt2,pos,power;
	for(cnt1=0;cnt1<8;cnt1++)
	{
		pos=0;
		power=128;
		for(cnt2=0;cnt2<8;cnt2++)
		{
			if(bts.bit[cnt1*8+cnt2])pos+=power;
			power/=2;
		}		
		ch->ch[cnt1]=char(pos);
	}
	ch->totalchar=bts.totalbit/8;
}

void bitmaping(int bitmapno,bits inbts,bits *outbts)        // 映射矩阵选择进行集中处理
{
	int cnt,mapsize;
	switch(bitmapno)
	{
		case 1:		mapsize=64 ;break;
		case 2:		mapsize=64 ;break;
		case 3:		mapsize=48 ;break;
		case 4:		mapsize=32 ;break;
		case 5:		mapsize=56 ;break;
		case 6:		mapsize=48 ;break;
	}
	outbts->totalbit=mapsize;

	for(cnt=0;cnt<mapsize;cnt++)
	{
		switch(bitmapno)
		{
			case 1:		outbts->bit[cnt]=inbts.bit[ip[cnt]-1];break;
			case 2:		outbts->bit[cnt]=inbts.bit[fp[cnt]-1];break;
			case 3:		outbts->bit[cnt]=inbts.bit[e[cnt]-1];break;
			case 4:		outbts->bit[cnt]=inbts.bit[p[cnt]-1];break;
			case 5:		outbts->bit[cnt]=inbts.bit[pc1[cnt]-1];break;
			case 6:		outbts->bit[cnt]=inbts.bit[pc2[cnt]-1];break;
		}
	}
}

void initIP(bits bts64,bits *Lbts32,bits *Rbts32)       //IP并分割64位明文
{
	int cnt;
	bits tempbts;

	bitmaping(1,bts64,&tempbts);
	for(cnt=0;cnt<32;cnt++)
	{
		Lbts32->bit[cnt]=tempbts.bit[cnt];
		Rbts32->bit[cnt]=tempbts.bit[cnt+32];
	}
	Lbts32->totalbit=32;
	Lbts32->totalbit=32;
}

void finalIP(bits Lbts32,bits Rbts32,bits *bts64)      //FP并将32位明文组合成64位明文
{
	int cnt;
	bits tempbts;
	
	for(cnt=0;cnt<32;cnt++)
	{
		tempbts.bit[cnt]=Lbts32.bit[cnt];
		tempbts.bit[cnt+32]=Rbts32.bit[cnt];
	}
	tempbts.totalbit=64;
	bitmaping(2,tempbts,bts64);
}


void leftshift(bits *bit28,int times)               //左移time位,以低位为左
{
	bool lastbit;
	int cnt1,cnt2;
	for(cnt1=0;cnt1<times;cnt1++)
	{
		lastbit=bit28->bit[0];
		for(cnt2=0;cnt2<bit28->totalbit-1;cnt2++)
		{
			bit28->bit[cnt2]=bit28->bit[cnt2+1];
		}
		bit28->bit[bit28->totalbit-1]=lastbit;
	}
}

void pc1tran(bits bts64,bits *Cbts28,bits *Dbts28)    // 密钥分解
{
	int cnt;
	bits tempbts;

	bitmaping(5,bts64,&tempbts);
	for(cnt=0;cnt<28;cnt++)
	{
		Cbts28->bit[cnt]=tempbts.bit[cnt];
		Dbts28->bit[cnt]=tempbts.bit[cnt+28];
	}
	Cbts28->totalbit=28;
	Dbts28->totalbit=28;
}

void pc2tran(bits Cbts28, bits Dbts28, bits *Kbts48)     //单轮子密钥生成
{
	int cnt;
	bits tempbts;

	for(cnt=0;cnt<28;cnt++)
	{
		tempbts.bit[cnt]=Cbts28.bit[cnt];
		tempbts.bit[cnt+28]=Dbts28.bit[cnt];
	}
	tempbts.totalbit=56;
	bitmaping(6,tempbts,Kbts48);
}


void keygen(bits key,bitarray *subkey)   //利用上边的函数生成16轮加密所需的所有子密钥
{
	bits Cbts28,Dbts28,Kbts48;
	int cnt;

	pc1tran(key,&Cbts28,&Dbts28);

	for(cnt=0;cnt<16;cnt++)
	{
		leftshift(&Cbts28,ls[cnt]);
		leftshift(&Dbts28,ls[cnt]);
		pc2tran(Cbts28,Dbts28,&Kbts48);
		subkey->bitarr[cnt]=Kbts48;
	}
}


void etran(bits bts32,bits *bts48)  //E扩充(明文由32位扩充为48位)
{
	bitmaping(3,bts32,bts48);
}


void XOR(bits bts1,bits bts2,bits *xorres)
{
	int cnt;
	
	xorres->totalbit=bts2.totalbit;
	for(cnt=0;cnt<bts2.totalbit;cnt++)
	{
		xorres->bit[cnt] = ((bts1.bit[cnt])^(bts2.bit[cnt]));
	}
}


void bittosboxpos(bits bts48,int boxno,int *row,int *col)//S盒的内部映射
{
	*row =(bts48.bit[boxno*6]?2:0)+(bts48.bit[boxno*6+5]?1:0);
	*col =(bts48.bit[boxno*6+1]?8:0)+(bts48.bit[boxno*6+2]?4:0)+(bts48.bit[boxno*6+3]?2:0)+(bts48.bit[boxno*6+4]?1:0);
}


void sboxtran(bits bts48,bits *bts32)//明文由48位代换为32位
{
	int cnt1,cnt2,row,col,boxout;

	for(cnt1=0;cnt1<8;cnt1++)
	{
		bittosboxpos(bts48,cnt1,&row,&col);
		boxout= sbox[cnt1][row*16+col];
		for(cnt2 =3;cnt2>=0;cnt2--)          
		{
			bts32->bit[cnt1*4+cnt2]=(boxout%2!=0)?true:false;
			boxout/=2;
		}
	}
	bts32->totalbit =32;
}

void ptran(bits bts32,bits *fout) //P置换
{
	bitmaping(4,bts32,fout);
}

void ftran(bits inbts32,bits keyi,bits *fres)   //完成一轮DES加密的4个主要步骤
{
	bits bts48,bts32,xorres48;

	etran(inbts32,&bts48);   //经第一、二轮测试 etran能够正确得到结果
	XOR(bts48,keyi,&xorres48);//经第一、二轮测试 XOR可以得到正确结果
	sboxtran(xorres48,&bts32);//经第一、二轮测试 sbox可以得到正确结果
	ptran(bts32,fres);//经第一、二轮测试 ptran可以得到正确结果
}


void desblock(chars intext8,chars key,bool encode,chars *outtext8) //DES加密算法加密一组数据的全过程
{
	int cnt,keypos;
	bits inbts,Lbts,Rbts,oldLbts;
	bits keybit,outbts,fres;
	bitarray subkey;

	chartobits(intext8,&inbts);
	chartobits(key,&keybit);
	keygen(keybit,&subkey);

	initIP(inbts,&Lbts,&Rbts);
	for(cnt=0;cnt<16;cnt++)
	{
		oldLbts=Lbts;
		Lbts=Rbts;
		keypos=encode?cnt:(15-cnt);
		ftran(Rbts,subkey.bitarr[keypos],&fres);
		XOR(oldLbts,fres,&Rbts);
	}
	finalIP(Rbts,Lbts,&outbts);
	bitstochar(outbts,outtext8);
}


void desencode(char mfile[],char key[],char cfile[])//加密
{
	descoding(mfile,key,cfile,true);
	//printf("out of encode\n");
}


void desdecode(char mfile[],char key[],char cfile[])//解密
{
	descoding(mfile,key,cfile,false);
}


void descoding(char mfile[],char key[],char cfile[],bool codedir)//从明文文件读入明文,加密后写入密文文件中
{
	int cnt1,cnt2;
	chars inch,inkey,outch;
	FILE *mfp;
	FILE *cfp;

	for(cnt1=0;cnt1<8;cnt1++)//读密钥
	{
		inkey.ch[cnt1]=key[cnt1];
	}
	inkey.totalchar=8;

	if(NULL==(mfp=fopen(mfile,"r")))//打开明文文件
	{
		printf("CAN'T OPEN THE ORIGIN FILE\n");
	}
	else
	{
		if(NULL==(cfp=fopen(cfile,"w")))
		{
			printf("CAN'T OPEN THE SECRET FILE\n");
		}					

		cnt1=0;
		cnt2=0;		
		inch.totalchar=8;
		inch.ch[cnt1]=fgetc(mfp);		

		while(!feof(mfp))
		{
			cnt1++;
			cnt2++;
			inch.ch[cnt1]=fgetc(mfp);
			if(cnt1==7)
			{
				desblock(inch,inkey,codedir,&outch);
				for(cnt1=0;cnt1<8;cnt1++)
					fputc(outch.ch[cnt1],cfp);//写密文文件
				cnt1=-1;
			}
		}
		cnt2=cnt2%8;
		if(cnt2!=0)//分组对齐
		{
			for(cnt1=0;cnt1<(8-cnt2);cnt1++)
				inch.ch[cnt1+cnt2]=' ';
			inch.totalchar=8;
			desblock(inch,inkey,codedir,&outch);

			for(cnt1=0;cnt1<8;cnt1++)
				fputc(outch.ch[cnt1],cfp);
		}
		fclose(mfp);
		fclose(cfp);
	}
}

void dispfile(char fn[])    //显示文件内容
{
	FILE *fp;
	char ch;
	if(NULL==(fp=fopen(fn,"r")))
	{
		printf("CAN'T OPEN THE FILE TO DISPLAY\n");
	}
	else
	{
		while(!feof(fp))
		{
			ch=fgetc(fp);
			printf("%c",ch);
		}
		printf("\n");
	}
}


⌨️ 快捷键说明

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