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

📄 cedc.~cpp

📁 一个用DES做的加/解密代码
💻 ~CPP
📖 第 1 页 / 共 2 页
字号:

void __fastcall TEDCForm::f(char *right,int num,char *fret)
                            /* 完成num层的f()函数*/
//char *right, *fret;			/* 32 bits */
//int num;
{
    register char *kb, *rb, *bb;
	char bigright[6];
	char result[6];
	char preout[4];
	kb=kn[num];                 /*取出子密钥*/
	bb=bigright;
	rb=result;
	expand(right,bb);			/*扩展成48bit*/
	*rb++=*bb++^*kb++;
	*rb++=*bb++^*kb++;		    /*Kn与Rn异或操作*/
	*rb++=*bb++^*kb++;
	*rb++=*bb++^*kb++;
	*rb++=*bb++^*kb++;
	*rb++=*bb++^*kb++;
	contract(result,preout);	/*用s盒得到32bit输出*/
	perm32(preout,fret);		/*最后换位*/
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::perm32(char *inblock,char *outblock)
                        		/* 单纯换位*/
//char *inblock,*outblock;		/* of the f crypto function	*/
{	register int j;
	register char *ib,*ob;
	register char *q;
	ob=outblock;				/* 把输出的块清零*/
	*ob++=0; *ob++= 0; *ob++=0; *ob++=0;
	ib=inblock;
	for(j=0;j<4;j++,ib++)	    /* 输入的每一字节*/
	{
        q=p32[j][*ib&0xFF];
		ob=outblock;			/* 每一输出的字节*/
		*ob++|=*q++;
		*ob++|=*q++;
		*ob++|=*q++;
		*ob++|=*q++;
	}
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::expand(char *right,char *bigright)
                                /* 用E变换矩阵完成32--48扩展换位*/
//char *right,*bigright;		/* right 32 bit, bigright 48 bit*/
{
	register char *bb, *r, r0, r1, r2, r3;
	bb=bigright;
	r=right;                    /*右边32位*/
    r0=*r++;
    r1=*r++;
    r2=*r++;
    r3=*r++;
	*bb++=((r3&0x1)<<7)|	/* 32				*/
		((r0&0xF8)>>1)|		/* 1 2 3 4 5		*/
		((r0&0x18)>>3);		/* 4 5				*/
	*bb++=((r0&0x7)<<5)|	/* 6 7 8			*/
		((r1&0x80)>>3)|		/* 9				*/
		((r0&0x01)<<3)|		/* 8				*/
		((r1&0xE0)>>5);		/* 9 10 11			*/
	*bb++=((r1&0x18)<<3)|	/* 12 13			*/
		((r1&0x1F)<<1)|		/* 12 13 14 15 16	*/
		((r2&0x80)>>7);		/* 17				*/
	*bb++=((r1&0x01)<<7)|	/* 16				*/
		((r2&0xF8)>>1)|		/* 17 18 19 20 21	*/
		((r2&0x18)>>3);		/* 20 21			*/
	*bb++=((r2&0x07)<<5)|	/* 22 23 24			*/
		((r3&0x80)>>3)|		/* 25				*/
		((r2&0x01)<<3)|		/* 24				*/
		((r3&0xE0)>>5);		/* 25 26 27			*/
	*bb++=((r3&0x18)<<3)|	/* 28 29			*/
		((r3&0x1F)<<1)|		/* 28 29 30 31 32	*/
		((r0&0x80)>>7);		/* 1				*/
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::contract(char *in48,char *out32)
			                    /* 48位经s盒后,输出32位*/
//char *in48,*out32;
{	register char *c;
	register char *i;
	register int i0, i1, i2, i3, i4, i5;
	i=in48;                     /*入口:8字节*/
	i0=*i++;
    i1=*i++;
    i2=*i++;
    i3=*i++;                    /*0xFFF=1111 1111 1111*/
    i4=*i++;                    /*0xFFF=1111 1111*/
    i5=*i++;                    /*0xFFF=1111*/
	c=out32;                    /*出口:6字节*/
	*c++=s[0][0xFFF&((i0<<4)|((i1>>4)&0xF))];
	*c++=s[1][0xFFF&((i1<<8)|( i2&0xFF))];
	*c++=s[2][0xFFF&((i3<<4)|((i4>>4)&0xF))];
	*c++=s[3][0xFFF&((i4<<8)|( i5&0xFF))];
}
                                     
//---------------------------------------------------------------------------

int __fastcall TEDCForm::pfile()/* 文件加密处理*/
{
    register int m, nsave;
	register char *b;
	int j;
	while((m=fread(buf,1,512,infile))!=0)
	{
		if((nsave=m)<0)	        /* 读出错*/
		    return(-1);
		for(b=buf;m>0;m-=8,b+=8)/* 加密解密一个缓冲区的块*/
		{
            if(encrypting)
		    {
              if(m<8)				/* 不够一块---64 bits	*/
			    {
                    for(j=0;j<8-m;j++)
				  b[m+j]=garbage();/* 填充不够一块的部分*/
			        nsave+=8-m;	   /* 把nave凑成8的整数倍*/
			    }
			    else
                    j=0;		/* 不足8字节时的缺额数量j=8-m*/
			    endes(b,b);
		    }
		    else				/* 解密*/
		    {
                if(m<8)deout(b,1);			/* 最后的几个字节*/
			    else
			    {
                    dedes(b,b);		    	/* 解密一个块*/
			        deout(b,0);	   /*输出到文件*/
			    }
		    }
		}
		if(encrypting)
            if(fwrite(buf,1,nsave,outfile)!=(unsigned)nsave)
			    return(-1);
	}										/* 加密解密文件完成*/
    if(encrypting) fputc(8-j,outfile);      /* 8-j=最后一个块的有效字节数*/
    	return(0);
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::deout(char *block,char flag)
	                        /* 根据flag标志来决定输出到文件的内容*/
//char *block,flag;/* char*block 64-bit 块, flag=1:处理的块是文件的最后的块
//		flag=0:处理的块不是文件的最后的块*/
{	static char last[8];
		/*static char last[8] 前一个输入块,静态变量,初始化为零*/
	register int i;

	if(flag)			    /* 输出的最后的几个字节*/
	{
		fwrite(last,1,block[0]&0xFF,outfile);
		return;             /*block[0]包含内容"8-j*/
	}
	if(outcount++)			/* 以前是否处理过块,即输入的加密文件长度不到8字节*/
		fwrite(last,1,8,outfile);
	for(i=0;i<8;i++)
        last[i]=block[i];   /* 复制块*/
}

//---------------------------------------------------------------------------

int __fastcall TEDCForm::garbage()/*产生一些数字用以填充不足8字节的块*/
                                  /*产生数据随机性大一些,加密效果会更好*/
{
	return(0);
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::endes(char *inblock,char*outblock)
	                                /* 加密一个64-bit块*/
//char *inblock, *outblock;
{
    char iters[17][8];
	char swap[8];			        /* 放置左右交换的值*/
	register int i;
	register char *s, *t;
	permute(inblock,iperm,iters[0]);/*iters[]:outblock*/
	for(i=0;i<16;i++)		    	/* 完成1~16层的交换*/
		iter(i,iters[i],iters[i+1]);
 /* iters[0][0]~iters[0][8]操作后放到iters[1][0]~iters[1][8]
iters[1][0]~iters[1][8]操作后放到iters[2][0]~iters[2][8]...以此类推*/
	s=swap;
    t=&iters[16][4];
	*s++=*t++;
    *s++=*t++;
    *s++=*t++;
    *s++=*t++;
	t=&iters[16][0];
	*s++=*t++;
    *s++=*t++;
    *s++=*t++;
    *s++=*t++;
	permute(swap,fperm,outblock);
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::dedes(char *inblock,char *outblock)
/* 解密一个64-bit 块*/
//char *inblock,*outblock;
{	char iters[17][8];
	char swap[8];
	register int i;
	register char *s, *t;
	permute(inblock,iperm,iters[0]);
	for (i=0; i<16; i++)
		iter(15-i,iters[i],iters[i+1]);
	s=swap;
    t=&iters[16][4];
	*s++=*t++;
    *s++=*t++;
    *s++=*t++;
    *s++=*t++;
	t=&iters[16][0];
	*s++=*t++;
    *s++=*t++;
    *s++=*t++;
    *s++=*t++;
	permute(swap,fperm,outblock);
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::permute(char *inblock,char perm[16][16][8],
                        char *outblock)		/* 初始换位/最后换位变换*/
//char *inblock, *outblock;
//char perm[16][16][8];
{	register int i,j;
	register char *ib, *ob;         /*inblock:8字节*/
	register char *p, *q;           /*outblock:8字节*/
	for (i=0,ob=outblock;i<8;i++)   /*清空结果数据区*/
		*ob++=0;
	ib=inblock;                     /*ib:输入块首地址*/
	for(j=0;j<16;j+=2,ib++)
	{
        ob=outblock;
		p=perm[j][(*ib>>4)&0x0F];	/*高四位首地址 perm[][]有8个字节*/
		q=perm[j+1][*ib&0x0F];		/*低四位首地址*/
		for(i=0;i<8;i++)            /*完成一个字节的加密*/
        	*ob++|=*p++|*q++;       /**ob动态对应outblock*/
		/*-----------------*(ob++)=(*ob)|(*(p++)|*(q++))-----------------*/
	}
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::kinit(char *key)
                        	/* 初始化密钥的变换矩阵的中间过渡矩阵*/
//char *key;				/* 64 bits */
{                           /*生成16个长为48bit的子密钥*/
    register int i,j,L;     /*key为输入的初始密钥*/
	int m;
	for(j=0;j<56;j++)
	{
        L=pc1[j]-1;
		m=L&0x07;           /*取出L的后3bit*/
		pc1m[j]=(key[L>>3]&bytebit[m])?1:0;
                            /*key[L>>3]确定第1位在char key[8]中的哪一个字节中,
                            char pc1m[56]是完成pc-1型换位的变换矩阵*/
	}
	for(i=0;i<16;i++)		/* 共生成16个密钥*/
		for(j=0;j<6;j++)	/* 密钥kn的每一个字节*/
			kn[i][j]=0;
	for(i=0;i<16;i++)
	{
        for(j=0;j<56;j++)   /*循环左移*/
        {
		    pcr[j]=pc1m[(L=j+totrot[i])<(j<28?28:56)?L:L-28];
                            /* pcr[j]是每次进行循环左移位后的pc1m[]矩阵*/
        }
		for(j=0;j<48;j++)
		    if(pcr[pc2[j]-1])
            {
                L=j&0x07;
				kn[i][j>>3]|=bytebit[L];
                            /*共16个密钥i~[0,16],每个密钥6字节j>>3~[0,5]*/
			}
	}
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::p32init()	/* 初始化32bit换位表的中间过渡矩阵*/
{
    register int L,j,k;
	int i,m;
	for(i=0;i<4;i++)/* 以字节为单位输入,i为字节在输入矩阵中的位置*/
		for(j=0;j<256;j++) 	  /* j为所输入字节的可能值[0~256]*/
		    for(k=0;k<4;k++)
			    p32[i][j][k]=0;
	for(i=0;i<4;i++)
		for(j=0;j<256;j++)
    		for(k=0;k<32;k++)
		    {
                L=p32i[k]-1;
    			if((L>>3)!=i)
	    		    continue;
		        if(!(j&bytebit[L&07]))
        			continue;
		    	m=k&07;
			    p32[i][j][k>>3]|=bytebit[m];
    		}
}
//---------------------------------------------------------------------------

void __fastcall TEDCForm::Edit1Change(TObject *Sender)
{
    BitBtn1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::BitBtn2Click(TObject *Sender)
{
    Close();
}
//---------------------------------------------------------------------------
void __fastcall TEDCForm::Edit1DblClick(TObject *Sender)
{
  if(OpenDialog1->Execute())
       Edit1->Text=OpenDialog1->FileName;
}
//---------------------------------------------------------------------------


⌨️ 快捷键说明

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