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

📄 enc_des.c

📁 压缩包中包含LINUX下多个命令的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (cnt-- < 1)		goto failure;	switch (*data++) {	case FB64_IV_OK:		fb64_stream_iv(fbp->temp_feed, &fbp->streams[DIR_ENCRYPT-1]);		if (state == FAILED)			state = IN_PROGRESS;		state &= ~NO_RECV_IV;		encrypt_send_keyid(DIR_ENCRYPT, (unsigned char *)"\0", 1, 1);		break;	case FB64_IV_BAD:		memset(fbp->temp_feed, 0, sizeof(Block));		fb64_stream_iv(fbp->temp_feed, &fbp->streams[DIR_ENCRYPT-1]);		state = FAILED;		break;	default:		if (encrypt_debug_mode) {			printf("Unknown option type: %d\r\n", data[-1]);			printd(data, cnt);			printf("\r\n");		}		/* FALL THROUGH */	failure:		state = FAILED;		break;	}	return(fbp->state[DIR_ENCRYPT-1] = state);}	voidcfb64_session(key, server)	Session_Key *key;	int server;{	fb64_session(key, server, &fb[CFB]);}	voidofb64_session(key, server)	Session_Key *key;	int server;{	fb64_session(key, server, &fb[OFB]);}	static voidfb64_session(key, server, fbp)	Session_Key *key;	int server;	struct fb *fbp;{	if (!key || key->type != SK_DES) {		if (encrypt_debug_mode)			printf("Can't set krbdes's session key (%d != %d)\r\n",				key ? key->type : -1, SK_DES);		return;	}	memmove((void *)fbp->krbdes_key, (void *)key->data, sizeof(Block));	fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_ENCRYPT-1]);	fb64_stream_key(fbp->krbdes_key, &fbp->streams[DIR_DECRYPT-1]);	if (fbp->once == 0) {		des_set_random_generator_seed(fbp->krbdes_key);		fbp->once = 1;	}	des_key_sched(fbp->krbdes_key, fbp->krbdes_sched);	/*	 * Now look to see if krbdes_start() was was waiting for	 * the key to show up.  If so, go ahead an call it now	 * that we have the key.	 */	if (fbp->need_start) {		fbp->need_start = 0;		fb64_start(fbp, DIR_ENCRYPT, server);	}}/* * We only accept a keyid of 0.  If we get a keyid of * 0, then mark the state as SUCCESS. */	intcfb64_keyid(dir, kp, lenp)	int dir, *lenp;	unsigned char *kp;{	return(fb64_keyid(dir, kp, lenp, &fb[CFB]));}	intofb64_keyid(dir, kp, lenp)	int dir, *lenp;	unsigned char *kp;{	return(fb64_keyid(dir, kp, lenp, &fb[OFB]));}	intfb64_keyid(dir, kp, lenp, fbp)	int dir, *lenp;	unsigned char *kp;	struct fb *fbp;{	register int state = fbp->state[dir-1];	if (*lenp != 1 || (*kp != '\0')) {		*lenp = 0;		return(state);	}	if (state == FAILED)		state = IN_PROGRESS;	state &= ~NO_KEYID;	return(fbp->state[dir-1] = state);}	voidfb64_printsub(data, cnt, buf, buflen, type)	unsigned char *data, *buf, *type;	int cnt, buflen;{	char lbuf[32];	register int i;	char *cp;	buf[buflen-1] = '\0';		/* make sure it's NULL terminated */	buflen -= 1;	switch(data[2]) {	case FB64_IV:		sprintf(lbuf, "%s_IV", type);		cp = lbuf;		goto common;	case FB64_IV_OK:		sprintf(lbuf, "%s_IV_OK", type);		cp = lbuf;		goto common;	case FB64_IV_BAD:		sprintf(lbuf, "%s_IV_BAD", type);		cp = lbuf;		goto common;	default:		sprintf(lbuf, " %d (unknown)", data[2]);		cp = lbuf;	common:		for (; (buflen > 0) && (*buf = *cp++); buf++)			buflen--;		for (i = 3; i < cnt; i++) {			sprintf(lbuf, " %d", data[i]);			for (cp = lbuf; (buflen > 0) && (*buf = *cp++); buf++)				buflen--;		}		break;	}}	voidcfb64_printsub(data, cnt, buf, buflen)	unsigned char *data, *buf;	int cnt, buflen;{	fb64_printsub(data, cnt, buf, buflen, "CFB64");}	voidofb64_printsub(data, cnt, buf, buflen)	unsigned char *data, *buf;	int cnt, buflen;{	fb64_printsub(data, cnt, buf, buflen, "OFB64");}	voidfb64_stream_iv(seed, stp)	Block seed;	register struct stinfo *stp;{	memmove((void *)stp->str_iv, (void *)seed, sizeof(Block));	memmove((void *)stp->str_output, (void *)seed, sizeof(Block));	des_key_sched(stp->str_ikey, stp->str_sched);	stp->str_index = sizeof(Block);}	voidfb64_stream_key(key, stp)	Block key;	register struct stinfo *stp;{	memmove((void *)stp->str_ikey, (void *)key, sizeof(Block));	des_key_sched(key, stp->str_sched);	memmove((void *)stp->str_output, (void *)stp->str_iv, sizeof(Block));	stp->str_index = sizeof(Block);}/* * DES 64 bit Cipher Feedback * *     key --->+-----+ *          +->| DES |--+ *          |  +-----+  | *	    |           v *  INPUT --(--------->(+)+---> DATA *          |             | *	    +-------------+ * * * Given: *	iV: Initial vector, 64 bits (8 bytes) long. *	Dn: the nth chunk of 64 bits (8 bytes) of data to encrypt (decrypt). *	On: the nth chunk of 64 bits (8 bytes) of encrypted (decrypted) output. * *	V0 = DES(iV, key) *	On = Dn ^ Vn *	V(n+1) = DES(On, key) */	voidcfb64_encrypt(s, c)	register unsigned char *s;	int c;{	register struct stinfo *stp = &fb[CFB].streams[DIR_ENCRYPT-1];	register int index;	index = stp->str_index;	while (c-- > 0) {		if (index == sizeof(Block)) {			Block b;			des_ecb_encrypt(stp->str_output, b, stp->str_sched, 1);			memmove((void *)stp->str_feed, (void *)b, sizeof(Block));			index = 0;		}		/* On encryption, we store (feed ^ data) which is cypher */		*s = stp->str_output[index] = (stp->str_feed[index] ^ *s);		s++;		index++;	}	stp->str_index = index;}	intcfb64_decrypt(data)	int data;{	register struct stinfo *stp = &fb[CFB].streams[DIR_DECRYPT-1];	int index;	if (data == -1) {		/*		 * Back up one byte.  It is assumed that we will		 * never back up more than one byte.  If we do, this		 * may or may not work.		 */		if (stp->str_index)			--stp->str_index;		return(0);	}	index = stp->str_index++;	if (index == sizeof(Block)) {		Block b;		des_ecb_encrypt(stp->str_output, b, stp->str_sched, 1);		memmove((void *)stp->str_feed, (void *)b, sizeof(Block));		stp->str_index = 1;	/* Next time will be 1 */		index = 0;		/* But now use 0 */	}	/* On decryption we store (data) which is cypher. */	stp->str_output[index] = data;	return(data ^ stp->str_feed[index]);}/* * DES 64 bit Output Feedback * * key --->+-----+ *	+->| DES |--+ *	|  +-----+  | *	+-----------+ *	            v *  INPUT -------->(+) ----> DATA * * Given: *	iV: Initial vector, 64 bits (8 bytes) long. *	Dn: the nth chunk of 64 bits (8 bytes) of data to encrypt (decrypt). *	On: the nth chunk of 64 bits (8 bytes) of encrypted (decrypted) output. * *	V0 = DES(iV, key) *	V(n+1) = DES(Vn, key) *	On = Dn ^ Vn */	voidofb64_encrypt(s, c)	register unsigned char *s;	int c;{	register struct stinfo *stp = &fb[OFB].streams[DIR_ENCRYPT-1];	register int index;	index = stp->str_index;	while (c-- > 0) {		if (index == sizeof(Block)) {			Block b;			des_ecb_encrypt(stp->str_feed, b, stp->str_sched, 1);			memmove((void *)stp->str_feed, (void *)b, sizeof(Block));			index = 0;		}		*s++ ^= stp->str_feed[index];		index++;	}	stp->str_index = index;}	intofb64_decrypt(data)	int data;{	register struct stinfo *stp = &fb[OFB].streams[DIR_DECRYPT-1];	int index;	if (data == -1) {		/*		 * Back up one byte.  It is assumed that we will		 * never back up more than one byte.  If we do, this		 * may or may not work.		 */		if (stp->str_index)			--stp->str_index;		return(0);	}	index = stp->str_index++;	if (index == sizeof(Block)) {		Block b;		des_ecb_encrypt(stp->str_feed, b, stp->str_sched, 1);		memmove((void *)stp->str_feed, (void *)b, sizeof(Block));		stp->str_index = 1;	/* Next time will be 1 */		index = 0;		/* But now use 0 */	}	return(data ^ stp->str_feed[index]);}#  endif /* DES_ENCRYPTION */# endif	/* AUTHENTICATION */#endif	/* ENCRYPTION */

⌨️ 快捷键说明

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