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

📄 des.cpp

📁 实现des加密的功能,包括有des的基本代码,以及ecb、cbc两种加密功能!没有界面~
💻 CPP
字号:
#include <iostream.h>
#include "deshead.h"
#include "fstream.h"
#include "string.h"
#include "malloc.h"
#include "stdio.h"
#include <math.h>



des::GetTxt()//从"明文.dat"中读取字符数据,放到字符数组里,判断完后进行分组;
{
	




	char ch;
	int i=0;
	ifstream fin;
	ofstream fout;
	mingwen.totalchar=0;

	fin.open("明文.dat");
	while (fin.get(ch)) 
	{
		mingwen.totalchar++;
		mingwen.dat[i]=ch;
		i=i+1;
	}
	fin.close();

	fout.open("明文字符总数为.dat");
	fout<<mingwen.totalchar;
	fout.close();



		
}








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

des::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-28);
		}
		ch->totalchar=bts.totalbit/8;
	}
	
des::bitmaping(int bitmapno,bits inbits,bits *outbits)
	{
		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;
		}
		outbits->totalbit=mapsize;
		for (cnt=0;cnt<mapsize;cnt++)
		{
			switch(bitmapno) {
			case 1:outbits->bit[cnt]=inbits.bit[ip[cnt]-1];			break;
			case 2:outbits->bit[cnt]=inbits.bit[fp[cnt]-1];			break;
			case 3:outbits->bit[cnt]=inbits.bit[e[cnt]-1];			break;
			case 4:outbits->bit[cnt]=inbits.bit[p[cnt]-1];			break;
			case 5:outbits->bit[cnt]=inbits.bit[pc1[cnt]-1];		break;
			case 6:outbits->bit[cnt]=inbits.bit[pc2[cnt]-1];		break;
		}
		}
	}

des::init_IP(bits bts64,bits * lbts32,bits * rbts32)
	{
		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;
		rbts32->totalbit=32;
	}
	
des::finall_IP(bits lbts32,bits rbts32,bits *bts64)
	{
		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);
	}
	
des::leftshift(bits *bit28,int times)
	{
		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;
			
		}
	}
	
des::PC1_tran(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];
		}
		cbts28->totalbit=28;
		dbts28->totalbit=28;
	}


des::PC2_tran(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);
	}


des::keygen(bits key,bitarry *subkey)	
	{
		bits cbts28,dbts28,kbts48;
		int cnt;
		PC1_tran(key,&cbts28,&dbts28);
		for (cnt=0;cnt<16;cnt++) {
			leftshift(&cbts28,ls[cnt]);
			leftshift(&dbts28,ls[cnt]);
			PC2_tran(cbts28,dbts28,&kbts48);
			subkey->bitarr[cnt]=kbts48;
		}
	}

des::E_tran(bits bts32,bits*bts48){
		bitmaping(3,bts32,bts48);
	}
	
	
	
des::bitToSboxpos(bits bts48,int boxno,int *row,int *col)
	{
		* 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]?2:0)+(bts48.bit[boxno*6+4]?1:0);
	}

des::sbox_tran(bits bts48,bits *bts32)
	{
		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;
	}
	
des::P_tran(bits bts32,bits *fout)
	{
		bitmaping(4,bts32,fout);
	}

des::F_tran(bits inbts32,bits keyi,bits *fres)
	{
		bits bts48,bts32,xorres48;
		E_tran(inbts32,&bts48);
		exclusiveOR(bts48,keyi,&xorres48);
		sbox_tran(xorres48,&bts32);
		P_tran(bts32,fres);
	}



des::exclusiveOR(bits bts1,bits bts2,bits *xorRes)
	{
		int cnt;
		xorRes->totalbit=bts1.totalbit;
		for (cnt=0;cnt<bts1.totalbit;cnt++)
			xorRes->bit[cnt]=bts1.bit[cnt]^bts2.bit[cnt];
	}

des::desblock(chars intext8,chars key,bool encode,chars *outtext8)
	{
		int cnt,keypos;
		bits inbts,lbts,rbts,oldlbts;
		bits keybit,outbts,fres;
		bitarry subkey;
		chartobits(intext8,&inbts);
		chartobits(key,&keybit);
		keygen(keybit,&subkey);
		init_IP(inbts,&lbts,&rbts);		
		for (cnt=0;cnt<16;cnt++) {
			oldlbts=lbts;
			lbts=rbts;
			keypos=encode?cnt:(15-cnt);
			F_tran(rbts,subkey.bitarr[keypos],&fres);
			exclusiveOR(oldlbts,fres,&rbts);
		}
		finall_IP(rbts,lbts,&outbts);
		bitstochar(outbts,outtext8);

	}

⌨️ 快捷键说明

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