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

📄 d3des.c

📁 这是一个关于DES的小程序。用VC编的。不是很经典
💻 C
📖 第 1 页 / 共 2 页
字号:
unsigned char *from, *into;		/* unsigned char[8] */
{
	unsigned long work[2];

	scrunch(from, work);
	desfunc(work, KnL);
	desfunc(work, KnR);
	desfunc(work, Kn3);
	unscrun(work, into);
	return;
	}

void D2des(from, into)
unsigned char *from;			/* unsigned char[16] */
unsigned char *into;			/* unsigned char[16] */
{
	unsigned long *right, *l1, swap;
	unsigned long leftt[2], bufR[2];

	right = bufR;
	l1 = &leftt[1];
	scrunch(from, leftt);
	scrunch(&from[8], right);
	desfunc(leftt, KnL);
	desfunc(right, KnL);
	swap = *l1;
	*l1 = *right;
	*right = swap;
	desfunc(leftt, KnR);
	desfunc(right, KnR);
	swap = *l1;
	*l1 = *right;
	*right = swap;
	desfunc(leftt, Kn3);
	desfunc(right, Kn3);
	unscrun(leftt, into);
	unscrun(right, &into[8]);
	return;
	}

void makekey(aptr, kptr)
register char *aptr;				/* NULL-terminated  */
register unsigned char *kptr;		/* unsigned char[8] */
{
	register unsigned char *store;
	register int first, i;
	unsigned long savek[96];

	cpDkey(savek);
	des2key(Df_Key, EN0);
	for( i = 0; i < 8; i++ ) kptr[i] = Df_Key[i];
	first = 1;
	while( (*aptr != '\0') || first ) {
		store = kptr;
		for( i = 0; i < 8 && (*aptr != '\0'); i++ ) {
			*store++ ^= *aptr & 0x7f;
			*aptr++ = '\0';
			}
		Ddes(kptr, kptr);
		first = 0;
		}
	useDkey(savek);
	return;
	}

void make2key(aptr, kptr)
register char *aptr;				/* NULL-terminated   */
register unsigned char *kptr;		/* unsigned char[16] */
{
	register unsigned char *store;
	register int first, i;
	unsigned long savek[96];

	cpDkey(savek);
	des2key(Df_Key, EN0);
	for( i = 0; i < 16; i++ ) kptr[i] = Df_Key[i];
	first = 1;
	while( (*aptr != '\0') || first ) {
		store = kptr;
		for( i = 0; i < 16 && (*aptr != '\0'); i++ ) {
			*store++ ^= *aptr & 0x7f;
			*aptr++ = '\0';
			}
		D2des(kptr, kptr);
		first = 0;
		}
	useDkey(savek);
	return;
	}

#ifndef D3_DES	/* D2_DES only */
#ifdef	D2_DES	/* iff D2_DES! */

void cp2key(into)
register unsigned long *into;	/* unsigned long[64] */
{
	register unsigned long *from, *endp;

	cpkey(into);
	into = &into[32];
	from = KnR, endp = &KnR[32];
	while( from < endp ) *into++ = *from++;
	return;
	}

void use2key(from)				/* stomps on Kn3 too */
register unsigned long *from;	/* unsigned long[64] */
{
	register unsigned long *to, *endp;

	usekey(from);
	from = &from[32];
	to = KnR, endp = &KnR[32];
	while( to < endp ) *to++ = *from++;
	cpkey(Kn3);					/* Kn3 = KnL */
	return;
	}

#endif	/* iff D2_DES */
#else	/* D3_DES too */

static void D3des(unsigned char *, unsigned char *);

void des3key(hexkey, mode)
unsigned char *hexkey;			/* unsigned char[24] */
short mode;
{
	unsigned char *first, *third;
	short revmod;

	if( mode == EN0 ) {
		revmod = DE1;
		first = hexkey;
		third = &hexkey[16];
		}
	else {
		revmod = EN0;
		first = &hexkey[16];
		third = hexkey;
		}
	deskey(&hexkey[8], revmod);
	cpkey(KnR);
	deskey(third, mode);
	cpkey(Kn3);
	deskey(first, mode);
	return;
	}

void cp3key(into)
register unsigned long *into;	/* unsigned long[96] */
{
	register unsigned long *from, *endp;

	cpkey(into);
	into = &into[32];
	from = KnR, endp = &KnR[32];
	while( from < endp ) *into++ = *from++;
	from = Kn3, endp = &Kn3[32];
	while( from < endp ) *into++ = *from++;
	return;
	}

void use3key(from)
register unsigned long *from;	/* unsigned long[96] */
{
	register unsigned long *to, *endp;

	usekey(from);
	from = &from[32];
	to = KnR, endp = &KnR[32];
	while( to < endp ) *to++ = *from++;
	to = Kn3, endp = &Kn3[32];
	while( to < endp ) *to++ = *from++;
	return;
	}

static void D3des(from, into)	/* amateur theatrics */
unsigned char *from;			/* unsigned char[24] */
unsigned char *into;			/* unsigned char[24] */
{
	unsigned long swap, leftt[2], middl[2], right[2];

	scrunch(from, leftt);
	scrunch(&from[8], middl);
	scrunch(&from[16], right);
	desfunc(leftt, KnL);
	desfunc(middl, KnL);
	desfunc(right, KnL);
	swap = leftt[1];
	leftt[1] = middl[0];
	middl[0] = swap;
	swap = middl[1];
	middl[1] = right[0];
	right[0] = swap;
	desfunc(leftt, KnR);
	desfunc(middl, KnR);
	desfunc(right, KnR);
	swap = leftt[1];
	leftt[1] = middl[0];
	middl[0] = swap;
	swap = middl[1];
	middl[1] = right[0];
	right[0] = swap;
	desfunc(leftt, Kn3);
	desfunc(middl, Kn3);
	desfunc(right, Kn3);
	unscrun(leftt, into);
	unscrun(middl, &into[8]);
	unscrun(right, &into[16]);
	return;
	}

void make3key(aptr, kptr)
register char *aptr;				/* NULL-terminated   */
register unsigned char *kptr;		/* unsigned char[24] */
{
	register unsigned char *store;
	register int first, i;
	unsigned long savek[96];

	cp3key(savek);
	des3key(Df_Key, EN0);
	for( i = 0; i < 24; i++ ) kptr[i] = Df_Key[i];
	first = 1;
	while( (*aptr != '\0') || first ) {
		store = kptr;
		for( i = 0; i < 24 && (*aptr != '\0'); i++ ) {
			*store++ ^= *aptr & 0x7f;
			*aptr++ = '\0';
			}
		D3des(kptr, kptr);
		first = 0;
		}
	use3key(savek);
	return;
	}

#endif	/* D3_DES */
#endif	/* D2_DES */

/* Validation sets:
 *
 * Single-length key, single-length plaintext -
 * Key	  : 0123 4567 89ab cdef
 * Plain  : 0123 4567 89ab cde7
 * Cipher : c957 4425 6a5e d31d
 *
 * Double-length key, single-length plaintext -
 * Key	  : 0123 4567 89ab cdef fedc ba98 7654 3210
 * Plain  : 0123 4567 89ab cde7
 * Cipher : 7f1d 0a77 826b 8aff
 *
 * Double-length key, double-length plaintext -
 * Key	  : 0123 4567 89ab cdef fedc ba98 7654 3210
 * Plain  : 0123 4567 89ab cdef 0123 4567 89ab cdff
 * Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
 *
 * Triple-length key, single-length plaintext -
 * Key	  : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
 * Plain  : 0123 4567 89ab cde7
 * Cipher : de0b 7c06 ae5e 0ed5
 *
 * Triple-length key, double-length plaintext -
 * Key	  : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
 * Plain  : 0123 4567 89ab cdef 0123 4567 89ab cdff
 * Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
 *
 * d3des V5.0a rwo 9208.07 18:44 Graven Imagery
 **********************************************************************/
void my_deskey(keyin,keyout,edf)
unsigned char *keyin;
unsigned long *keyout;//keyout是32字节unsigned long *
short edf;/////////////8字节key,输出也是8字节
{
register int i, j, l, m, n;
	unsigned char pc1m[56], pcr[56];
	unsigned long kn[32];

	for ( j = 0; j < 56; j++ ) {
		l = pc1[j];
		m = l & 07;
		pc1m[j] = (keyin[l >> 3] & bytebit[m]) ? 1 : 0;
		//此处把key变为keyin
		}
	for( i = 0; i < 16; i++ ) {
		if( edf == DE1 ) m = (15 - i) << 1;
		else m = i << 1;
		n = m + 1;
		kn[m] = kn[n] = 0L;
		for( j = 0; j < 28; j++ ) {
			l = j + totrot[i];
			if( l < 28 ) pcr[j] = pc1m[l];
			else pcr[j] = pc1m[l - 28];
			}
		for( j = 28; j < 56; j++ ) {
		    l = j + totrot[i];
		    if( l < 56 ) pcr[j] = pc1m[l];
		    else pcr[j] = pc1m[l - 28];
		    }
		for( j = 0; j < 24; j++ ) {
			if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
			if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j];
			}
		}
my_cookey(kn,keyout);

	return;
}



void my_des2key(hexkey,my_KnR,my_Kn3,mode)
unsigned char *hexkey;			/* unsigned char[16] */
unsigned long *my_KnR;			/* unsigned char[32] */
unsigned long *my_Kn3;			/* unsigned char[32] */
short mode;/*		      hexkey[16]     MODE*/
{
short revmod;
	revmod = (mode == EN0) ? DE1 : EN0;
	my_deskey(&hexkey[8],my_KnR, revmod);
//	cpkey(KnR);
	my_deskey(hexkey, my_Kn3,mode);
//	cpkey(Kn3);					/* Kn3 = KnL */
	return;
}

void my_des(inblock, outblock,my_key,edf)
unsigned char *inblock, *outblock;//8byte
unsigned char *my_key;//8byte
short edf;//from[8]	      to[8]   8字节的key
{
	unsigned long keyout[32]={0L};
	unsigned long work[2];
    my_deskey(my_key,keyout,edf);

	scrunch(inblock, work);
	desfunc(work, keyout);//把KnL改为了keyout
	unscrun(work, outblock);
	return;

}
void my_Ddes(from, into,my_key,edf)
unsigned char *from, *into;//8byte
unsigned char *my_key;//16字节
short edf;
///*		    from[8]	      to[8]   16字节的key
{
	unsigned long my_KnR[32]={0L};
	unsigned long my_Kn3[32]={0L};
    unsigned long work[2];
	my_des2key(my_key,my_KnR,my_Kn3, edf);
	scrunch(from, work);
	desfunc(work, my_Kn3);//我认为此时KnL==Kn3
	desfunc(work, my_KnR);
	desfunc(work, my_Kn3);
	unscrun(work, into);
	return;
}

void my_D2des(from, into,my_key,edf)
unsigned char *from, *into;//16byte
unsigned char *my_key;//16字节
short edf;
///*		    from[16]	      to[16]
{
	unsigned long *right, *l1, swap;
	unsigned long leftt[2], bufR[2];
	unsigned long my_KnR[32]={0L};
	unsigned long my_Kn3[32]={0L};
    
	my_des2key(my_key,my_KnR,my_Kn3,edf);
    ///////////////////d2des/////
	//我认为此时KnL==Kn3
	right = bufR;
	l1 = &leftt[1];
	scrunch(from, leftt);
	scrunch(&from[8], right);
	desfunc(leftt, my_Kn3);//KnL);
	desfunc(right, my_Kn3);//KnL);
	swap = *l1;
	*l1 = *right;
	*right = swap;
	desfunc(leftt,my_KnR);// KnR);
	desfunc(right, my_KnR);//KnR);
	swap = *l1;
	*l1 = *right;
	*right = swap;
	desfunc(leftt, my_Kn3);//Kn3);
	desfunc(right, my_Kn3);//Kn3);
	unscrun(leftt, into);
	unscrun(right, &into[8]);
	return;
}

///////////////
static void my_cookey(raw1,m_key)
register unsigned long *raw1;
unsigned long *m_key;//32字节unsigned long*
{
	register unsigned long *cook, *raw0;
	unsigned long dough[32];
	register int i;
	register unsigned long *to, *endp;

	cook = dough;
	for( i = 0; i < 16; i++, raw1++ ) {
		raw0 = raw1++;
		*cook	 = (*raw0 & 0x00fc0000L) << 6;
		*cook	|= (*raw0 & 0x00000fc0L) << 10;
		*cook	|= (*raw1 & 0x00fc0000L) >> 10;
		*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
		*cook	 = (*raw0 & 0x0003f000L) << 12;
		*cook	|= (*raw0 & 0x0000003fL) << 16;
		*cook	|= (*raw1 & 0x0003f000L) >> 4;
		*cook++ |= (*raw1 & 0x0000003fL);
		}
	///////此处//////////////给输出
    cook=dough;
	to = m_key, endp = &m_key[32];
	while( to < endp ) *to++ = *cook++;
	return;

//		return;
	}

⌨️ 快捷键说明

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