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

📄 des.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	knp += 8;	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	knp += 8;	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	knp += 8;	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	knp += 8;	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	knp += 8;	left ^= f(key, right, knp);	knp += 8;	right ^= f(key, left, knp);	/* Left/right half swap, plus byte swap if little-endian */#ifndef	WORDS_BIGENDIAN	work[1] = byteswap32(left);	work[0] = byteswap32(right);#else	work[0] = right;	work[1] = left;#endif	permute_fp((unsigned char *) work, key, block);	/* Inverse initial permutation */}/* In-place decryption of 64-bit block. This function is the mirror * image of encryption; exactly the same steps are taken, but in * reverse order */#if 0void_mcrypt_decrypt(DES_KEY * key, unsigned char *block){	register TDS_UINT left, right;	register unsigned char *knp;	TDS_UINT work[2];	/* Working data storage */	permute_ip(block, key, (unsigned char *) work);	/* Initial permutation */	/* Left/right half swap, plus byte swap if little-endian */#ifndef	WORDS_BIGENDIAN	right = byteswap32(work[0]);	left = byteswap32(work[1]);#else	right = work[0];	left = work[1];#endif	/* Do the 16 rounds in reverse order.	 * The rounds are numbered from 15 to 0. On even rounds	 * the right half is fed to f() and the result exclusive-ORs	 * the left half; on odd rounds the reverse is done.	 */	knp = &key->kn[15][0];	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);	knp -= 8;	right ^= f(key, left, knp);	knp -= 8;	left ^= f(key, right, knp);#ifndef	WORDS_BIGENDIAN	work[0] = byteswap32(left);	work[1] = byteswap32(right);#else	work[0] = left;	work[1] = right;#endif	permute_fp((unsigned char *) work, key, block);	/* Inverse initial permutation */}#endif/* Permute inblock with perm */static voidpermute_ip(des_cblock inblock, DES_KEY * key, des_cblock outblock){	register unsigned char *ib, *ob;	/* ptr to input or output block */	register unsigned char *p, *q;	register int j;	/* Clear output block */	memset(outblock, '\0', 8);	ib = inblock;	for (j = 0; j < 16; j += 2, ib++) {	/* for each input nibble */		ob = outblock;		p = key->iperm[j][(*ib >> 4) & 0xf];		q = key->iperm[j + 1][*ib & 0xf];		/* and each output byte, OR the masks together */		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;	}}/* Permute inblock with perm */static voidpermute_fp(des_cblock inblock, DES_KEY * key, des_cblock outblock){	register unsigned char *ib, *ob;	/* ptr to input or output block */	register unsigned char *p, *q;	register int j;	/* Clear output block */	memset(outblock, '\0', 8);	ib = inblock;	for (j = 0; j < 16; j += 2, ib++) {	/* for each input nibble */		ob = outblock;		p = key->fperm[j][(*ib >> 4) & 0xf];		q = key->fperm[j + 1][*ib & 0xf];		/* and each output byte, OR the masks together */		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;		*ob++ |= *p++ | *q++;	}}/* The nonlinear function f(r,k), the heart of DES */static TDS_UINTf(DES_KEY * key, register TDS_UINT r, register unsigned char *subkey){	register TDS_UINT *spp;	register TDS_UINT rval, rt;	register int er;#ifdef	TRACE	printf("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ",	       r, subkey[0], subkey[1], subkey[2], subkey[3], subkey[4], subkey[5], subkey[6], subkey[7]);#endif	/* Run E(R) ^ K through the combined S & P boxes.	 * This code takes advantage of a convenient regularity in	 * E, namely that each group of 6 bits in E(R) feeding	 * a single S-box is a contiguous segment of R.	 */	subkey += 7;	/* Compute E(R) for each block of 6 bits, and run thru boxes */	er = ((int) r << 1) | ((r & 0x80000000) ? 1 : 0);	spp = &key->sp[7][0];	rval = spp[(er ^ *subkey--) & 0x3f];	spp -= 64;	rt = (TDS_UINT) r >> 3;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rval |= spp[((int) rt ^ *subkey--) & 0x3f];	spp -= 64;	rt >>= 4;	rt |= (r & 1) << 5;	rval |= spp[((int) rt ^ *subkey) & 0x3f];#ifdef	TRACE	printf(" %08lx\n", rval);#endif	return rval;}/* initialize a perm array */static voidperminit_ip(DES_KEY * key){	register int l, j, k;	int i, m;	/* Clear the permutation array */	memset(key->iperm, '\0', 16 * 16 * 8);	for (i = 0; i < 16; i++)	/* each input nibble position */		for (j = 0; j < 16; j++)	/* each possible input nibble */			for (k = 0; k < 64; k++) {	/* each output bit position */				l = ip[k] - 1;	/* where does this bit come from */				if ((l >> 2) != i)	/* does it come from input posn? */					continue;	/* if not, bit k is 0    */				if (!(j & nibblebit[l & 3]))					continue;	/* any such bit in input? */				m = k & 07;	/* which bit is this in the byte */				key->iperm[i][j][k >> 3] |= bytebit[m];			}}static voidperminit_fp(DES_KEY * key){	register int l, j, k;	int i, m;	/* Clear the permutation array */	memset(key->fperm, '\0', 16 * 16 * 8);	for (i = 0; i < 16; i++)	/* each input nibble position */		for (j = 0; j < 16; j++)	/* each possible input nibble */			for (k = 0; k < 64; k++) {	/* each output bit position */				l = fp[k] - 1;	/* where does this bit come from */				if ((l >> 2) != i)	/* does it come from input posn? */					continue;	/* if not, bit k is 0    */				if (!(j & nibblebit[l & 3]))					continue;	/* any such bit in input? */				m = k & 07;	/* which bit is this in the byte */				key->fperm[i][j][k >> 3] |= bytebit[m];			}}/* Initialize the lookup table for the combined S and P boxes */static voidspinit(DES_KEY * key){	char pbox[32];	int p, i, s, j, rowcol;	TDS_UINT val;	/* Compute pbox, the inverse of p32i.	 * This is easier to work with	 */	for (p = 0; p < 32; p++) {		for (i = 0; i < 32; i++) {			if (p32i[i] - 1 == p) {				pbox[p] = i;				break;			}		}	}	for (s = 0; s < 8; s++) {	/* For each S-box */		for (i = 0; i < 64; i++) {	/* For each possible input */			val = 0;			/* The row number is formed from the first and last			 * bits; the column number is from the middle 4			 */			rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf);			for (j = 0; j < 4; j++) {	/* For each output bit */				if (si[s][rowcol] & (8 >> j)) {					val |= 1L << (31 - pbox[4 * s + j]);				}			}			key->sp[s][i] = val;		}	}}/* ECB MODE */inttds_des_ecb_encrypt(const void *plaintext, int len, DES_KEY * akey, des_cblock output){	int j;	const unsigned char *plain = (const unsigned char *) plaintext;	for (j = 0; j < len / 8; j++) {		memcpy(&output[j * 8], &plain[j * 8], 8);		tds_des_encrypt(akey, &output[j * 8]);	}	if (j == 0 && len != 0)		return -1;	/* no blocks were encrypted */	return 0;}

⌨️ 快捷键说明

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