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

📄 _des.cpp

📁 几个封装完好的常用算法,md5,des,base64,crc32
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		fval |= SP2[(work >> 24) & 0x3fL];
		leftt ^= fval;
		work  = (leftt << 28) | (leftt >> 4);
		work ^= *keys++;
		fval  = SP7[ work		 & 0x3fL];
		fval |= SP5[(work >>  8) & 0x3fL];
		fval |= SP3[(work >> 16) & 0x3fL];
		fval |= SP1[(work >> 24) & 0x3fL];
		work  = leftt ^ *keys++;
		fval |= SP8[ work		 & 0x3fL];
		fval |= SP6[(work >>  8) & 0x3fL];
		fval |= SP4[(work >> 16) & 0x3fL];
		fval |= SP2[(work >> 24) & 0x3fL];
		right ^= fval;
		}

	right = (right << 31) | (right >> 1);
	work = (leftt ^ right) & 0xaaaaaaaaL;
	leftt ^= work;
	right ^= work;
	leftt = (leftt << 31) | (leftt >> 1);
	work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
	right ^= work;
	leftt ^= (work << 8);
	work = ((leftt >> 2) ^ right) & 0x33333333L;
	right ^= work;
	leftt ^= (work << 2);
	work = ((right >> 16) ^ leftt) & 0x0000ffffL;
	leftt ^= work;
	right ^= (work << 16);
	work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
	leftt ^= work;
	right ^= (work << 4);
	*block++ = right;
	*block = leftt;
	return;
}

void DES::DES2Key(unsigned char * hexkey, short mode)     //根据加或解密标志处理16位密钥
{
        //TODO: Add your source code here
	short revmod;

	revmod = (mode == EN0) ? DE1 : EN0;          //判断标志
	DESKey(&hexkey[8], revmod);                  //调用DESKey处理高8位
	Cpkey(KnR);
	DESKey(hexkey, mode);                        //处理低8位
	Cpkey(Kn3);					/* Kn3 = KnL */
	return;
}

void DES::Cpkey(register unsigned long * into)      //拷贝处理过的密钥到寄存器内
{
        //TODO: Add your source code here
	register unsigned long *from, *endp;

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

void DES::DDes(unsigned char * from, unsigned char * into)   //用16位密钥处理8位信息
{
        //TODO: Add your source code here
	unsigned long work[2];

	Scrunch(from, work);
	DESfunc(work, KnL);
	DESfunc(work, KnR);
	DESfunc(work, Kn3);
	Unscrun(work, into);
	return;
}

void DES::D2Des(unsigned char * from, unsigned char * into)   //用16位密钥处理16位信息
{
        //TODO: Add your source code here
	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 DES::MakeKey(register char * aptr, register unsigned char * kptr)     //根据密码生成密钥
{
        //TODO: Add your source code here
        register unsigned char *store;
	register int first, i;
	unsigned long savek[96];

	Cp2Key(savek);             //拷贝16位的密钥
	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;
		}
	Use2Key(savek);              //将处理好的密码存入寄存器
	return;
}

void DES::Cp2Key(register unsigned long * into)     //处理16位的密钥
{
        //TODO: Add your source code here
	register unsigned long *from, *endp;

	Cpkey(into);                               //拷贝高位密钥
	into = &into[32];
	from = KnR, endp = &KnR[32];
	while( from < endp ) *into++ = *from++;    //将剩余部分拷入KnR
	return;
}

void DES::Use2Key(register unsigned long * from)    //拷贝处理过的16位密钥入寄存器
{
        //TODO: Add your source code here
	register unsigned long *to, *endp;

	UseKey(from);
	from = &from[32];                       //拷贝高位入KnR
	to = KnR, endp = &KnR[32];
	while( to < endp ) *to++ = *from++;     //处理低位
	Cpkey(Kn3);			       //低位入Kn3		/* Kn3 = KnL */
	return;
}

void DES::Make2Key(register char * aptr, register unsigned char * kptr)      //根据密码生成16位密钥
{
        //TODO: Add your source code here
	register unsigned char *store;
	register int first, i;
	unsigned long savek[96];

	Cp2Key(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;
		}
	Use2Key(savek);
	return;
}

void DES::DES3Key(unsigned char * hexkey, short mode)     //处理24位密钥
{
        //TODO: Add your source code here
	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 DES::D3_1Des(unsigned char * from, unsigned char * into)     //根据24位密钥处理8位信息
{
        //TODO: Add your source code here
	unsigned long work[2];

	Scrunch(from, work);
	DESfunc(work, KnL);
	DESfunc(work, KnR);
	DESfunc(work, Kn3);
	Unscrun(work, into);
	return;
}



void DES::D3_2Des(unsigned char * from, unsigned char * into)          //根据24位密钥处理16位信息
{
        //TODO: Add your source code here
	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 DES::D3_3Des(unsigned char * from, unsigned char * into)         //根据24位密钥处理24位信息
{
        //TODO: Add your source code here
	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 DES::Make3Key(register char * aptr, register unsigned char * kptr)   //根据密码生成24位密钥
{
        //TODO: Add your source code here
	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';
			}
		D3_3Des(kptr, kptr);
		first = 0;
		}
	Use3Key(savek);
	return;
}

void DES::Cp3key(register unsigned long * into)            //拷贝24位密钥
{
        //TODO: Add your source code here
	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 DES::Use3Key(register unsigned long * from)        //将处理过的24位密钥写入寄存器
{
        //TODO: Add your source code here
	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;
}

⌨️ 快捷键说明

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