des.cpp

来自「一个C++的DES算法源码.引入工程中即可使用」· C++ 代码 · 共 484 行 · 第 1/2 页

CPP
484
字号
0x20001000L,0x30001000L,0x20011000L,0x30011000L,
0x20001004L,0x30001004L,0x20011004L,0x30011004L,
0x00101000L,0x10101000L,0x00111000L,0x10111000L,
0x00101004L,0x10101004L,0x00111004L,0x10111004L,
0x20101000L,0x30101000L,0x20111000L,0x30111000L,
0x20101004L,0x30101004L,0x20111004L,0x30111004L,
},{
/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
0x00000000L,0x08000000L,0x00000008L,0x08000008L,
0x00000400L,0x08000400L,0x00000408L,0x08000408L,
0x00020000L,0x08020000L,0x00020008L,0x08020008L,
0x00020400L,0x08020400L,0x00020408L,0x08020408L,
0x00000001L,0x08000001L,0x00000009L,0x08000009L,
0x00000401L,0x08000401L,0x00000409L,0x08000409L,
0x00020001L,0x08020001L,0x00020009L,0x08020009L,
0x00020401L,0x08020401L,0x00020409L,0x08020409L,
0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
},{
/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
0x00000000L,0x00000100L,0x00080000L,0x00080100L,
0x01000000L,0x01000100L,0x01080000L,0x01080100L,
0x00000010L,0x00000110L,0x00080010L,0x00080110L,
0x01000010L,0x01000110L,0x01080010L,0x01080110L,
0x00200000L,0x00200100L,0x00280000L,0x00280100L,
0x01200000L,0x01200100L,0x01280000L,0x01280100L,
0x00200010L,0x00200110L,0x00280010L,0x00280110L,
0x01200010L,0x01200110L,0x01280010L,0x01280110L,
0x00000200L,0x00000300L,0x00080200L,0x00080300L,
0x01000200L,0x01000300L,0x01080200L,0x01080300L,
0x00000210L,0x00000310L,0x00080210L,0x00080310L,
0x01000210L,0x01000310L,0x01080210L,0x01080310L,
0x00200200L,0x00200300L,0x00280200L,0x00280300L,
0x01200200L,0x01200300L,0x01280200L,0x01280300L,
0x00200210L,0x00200310L,0x00280210L,0x00280310L,
0x01200210L,0x01200310L,0x01280210L,0x01280310L,
},{
/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
0x00000000L,0x04000000L,0x00040000L,0x04040000L,
0x00000002L,0x04000002L,0x00040002L,0x04040002L,
0x00002000L,0x04002000L,0x00042000L,0x04042000L,
0x00002002L,0x04002002L,0x00042002L,0x04042002L,
0x00000020L,0x04000020L,0x00040020L,0x04040020L,
0x00000022L,0x04000022L,0x00040022L,0x04040022L,
0x00002020L,0x04002020L,0x00042020L,0x04042020L,
0x00002022L,0x04002022L,0x00042022L,0x04042022L,
0x00000800L,0x04000800L,0x00040800L,0x04040800L,
0x00000802L,0x04000802L,0x00040802L,0x04040802L,
0x00002800L,0x04002800L,0x00042800L,0x04042800L,
0x00002802L,0x04002802L,0x00042802L,0x04042802L,
0x00000820L,0x04000820L,0x00040820L,0x04040820L,
0x00000822L,0x04000822L,0x00040822L,0x04040822L,
0x00002820L,0x04002820L,0x00042820L,0x04042820L,
0x00002822L,0x04002822L,0x00042822L,0x04042822L,
}};

union fudge {	DES_LONG  l;	unsigned short s[2];	unsigned char  c[4];	};void DES(char *key,char *s_text,char *d_text){    des_key_schedule sch;	des_set_key((des_cblock *)key,sch);	des_ecb_encrypt((des_cblock *)s_text,(des_cblock *)d_text,&(sch[0]),1);}void _DES(char *key,char *s_text,char *d_text){    des_key_schedule sch;	des_set_key((des_cblock *)key,sch);	des_ecb_encrypt((des_cblock *)s_text,(des_cblock *)d_text,&(sch[0]),0);}
void DES3(char *key,char *s_text,char *d_text)
{
	char tmp_text1[20],tmp_text2[20];

	DES(key,s_text,tmp_text1);
	_DES(key+8,tmp_text1,tmp_text2);
	DES(key,tmp_text2,d_text);
}

int des_set_key(des_cblock(*key),des_key_schedule schedule){	register DES_LONG c,d,t,s;	register unsigned char *in;	register DES_LONG *k;	register int i;	k=(DES_LONG *)schedule;	in=(unsigned char *)key;	c2l(in,c);	c2l(in,d);	PERM_OP (d,c,t,4,0x0f0f0f0fL);	HPERM_OP(c,t,-2,0xcccc0000L);	HPERM_OP(d,t,-2,0xcccc0000L);	PERM_OP (d,c,t,1,0x55555555L);	PERM_OP (c,d,t,8,0x00ff00ffL);	PERM_OP (d,c,t,1,0x55555555L);	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));	c&=0x0fffffffL;	for (i=0; i<16; i++)		{		if (shifts2[i])			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }		else			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }		c&=0x0fffffffL;		d&=0x0fffffffL;		s=	des_skb[0][ (c    )&0x3f                ]|			des_skb[1][((c>> 6)&0x03)|((c>> 7L)&0x3c)]|			des_skb[2][((c>>13)&0x0f)|((c>>14L)&0x30)]|			des_skb[3][((c>>20)&0x01)|((c>>21L)&0x06) |						  ((c>>22L)&0x38)];		t=	des_skb[4][ (d    )&0x3f                ]|			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|			des_skb[6][ (d>>15L)&0x3f                ]|			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];		/* table contained 0213 4657 */		*(k++)=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;		s=     ((s>>16L)|(t&0xffff0000L));				s=(s<<4L)|(s>>28L);		*(k++)=s&0xffffffffL;		}	return(0);}void des_ecb_encrypt(des_cblock(*input), des_cblock(*output), des_key_schedule ks,int encrypt){	register DES_LONG l;	register unsigned char *in,*out;	DES_LONG ll[2];	in=(unsigned char *)input;	out=(unsigned char *)output;	c2l(in,l); ll[0]=l;	c2l(in,l); ll[1]=l;	des_encrypt(ll,ks,encrypt);	l=ll[0]; l2c(l,out);	l=ll[1]; l2c(l,out);	l=ll[0]=ll[1]=0;}void des_encrypt(DES_LONG *data, des_key_schedule ks, int encrypt){	DES_LONG l,r,u;//*** for XENIX delay ***        char delay_str[2];	union fudge  U,T;	 int i;	 DES_LONG *s;	u=data[0];	r=data[1];	IP(u,r);	l=(r<<1)|(r>>31);	r=(u<<1)|(u>>31);	/* clear the top bits on machines with 8byte longs */	l&=0xffffffffL;	r&=0xffffffffL;	s=(DES_LONG *)ks;	if (encrypt)		{		for (i=0; i<32; i+=4)			{//*** for XENIX delay ***   strcpy(delay_str,"");			D_ENCRYPT(l,r,i+0,&U,&T,s); /*  1 */			D_ENCRYPT(r,l,i+2,&U,&T,s); /*  2 */			}		}	else		{		for (i=30; i>0; i-=4)			{//*** for XENIX delay ***   strcpy(delay_str,"");			D_ENCRYPT(l,r,i-0,&U,&T,s); /* 16 */			D_ENCRYPT(r,l,i-2,&U,&T,s); /* 15 */			}		}	l=(l>>1)|(l<<31);	r=(r>>1)|(r<<31);	/* clear the top bits on machines with 8byte longs */	l&=0xffffffffL;	r&=0xffffffffL;	FP(r,l);	data[0]=l;	data[1]=r;}
void calc_mac(char *rbuff,int len,char *sbuff)
{
	char buffer[1000];//="<AP><JYM>8301</JYM><XTGZSJH>000002</XTGZSJH><ZDJBH>88777001</ZDJBH><CZYBH>010000</CZYBH><TCND>20</TCND><GWYTCED>060005</GWYTCED><TSBZTCED>999900</TSBZTCED><GRZFUJE>000060</GRZFUJE></AP>";
	char Data[1000];
	char DesData[1000];
	char key[1000];
	int length;
	int i,j;
	
	//strcpy(rbuff,"<AP><JYM>8301</JYM><XTGZSJH>000002</XTGZSJH><ZDJBH>88777001</ZDJBH><CZYBH>010000</CZYBH><TCND>20</TCND><GWYTCED>060005</GWYTCED><TSBZTCED>999900</TSBZTCED><GRZFUJE>000060</GRZFUJE></AP>");
	//len=185;

	memset(key,0x88,8);//

	memset(buffer,0x00,sizeof(buffer));
	
	memcpy(buffer,rbuff,len);

	length=(len+7)/8*8;

	for (i=0;i<8;i++)//first ^
		Data[i]=buffer[i]^0;

	for(j=0;j<length/8-1;j++)//other ^
		for (i=0;i<8;i++)
			Data[j*8+i+8]=buffer[j*8+i+8]^Data[j*8+i];

	DES(key,Data+length-8,DesData);
   
	memcpy(sbuff,DesData,8);
    
}

⌨️ 快捷键说明

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