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

📄 desport.c

📁 linux下可以用来通过802.1x认证
💻 C
字号:
/* * desport.c	Portable C version of des() function * * Version:	$Id: desport.c,v 1.1 2003/02/07 18:46:51 chessing Exp $ * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Copyright 2000  The FreeRADIUS server project * FIXME add copyrights */#include "des.h"/* Tables defined in the Data Encryption Standard documents * Three of these tables, the initial permutation, the final * permutation and the expansion operator, are regular enough that * for speed, we hard-code them. They're here for reference only. * Also, the S and P boxes are used by a separate program, gensp.c, * to build the combined SP box, Spbox[]. They're also here just * for reference.  */#ifdef	notdef/* initial permutation IP */static unsigned char ip[] = {	58, 50, 42, 34, 26, 18, 10,  2,	60, 52, 44, 36, 28, 20, 12,  4,	62, 54, 46, 38, 30, 22, 14,  6,	64, 56, 48, 40, 32, 24, 16,  8,	57, 49, 41, 33, 25, 17,  9,  1,	59, 51, 43, 35, 27, 19, 11,  3,	61, 53, 45, 37, 29, 21, 13,  5,	63, 55, 47, 39, 31, 23, 15,  7};/* final permutation IP^-1 */static unsigned char fp[] = {	40,  8, 48, 16, 56, 24, 64, 32,	39,  7, 47, 15, 55, 23, 63, 31,	38,  6, 46, 14, 54, 22, 62, 30,	37,  5, 45, 13, 53, 21, 61, 29,	36,  4, 44, 12, 52, 20, 60, 28,	35,  3, 43, 11, 51, 19, 59, 27,	34,  2, 42, 10, 50, 18, 58, 26,	33,  1, 41,  9, 49, 17, 57, 25};/* expansion operation matrix */static unsigned char ei[] = {	32,  1,  2,  3,  4,  5,	 4,  5,  6,  7,  8,  9,	 8,  9, 10, 11, 12, 13,	12, 13, 14, 15, 16, 17,	16, 17, 18, 19, 20, 21,	20, 21, 22, 23, 24, 25,	24, 25, 26, 27, 28, 29,	28, 29, 30, 31, 32,  1 };/* The (in)famous S-boxes */static unsigned char sbox[8][64] = {	/* S1 */	14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,	 0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,	 4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,	15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,	/* S2 */	15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,	 3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,	 0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,	13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,	/* S3 */	10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,	13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,	13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,	 1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,	/* S4 */	 7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,	13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,	10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,	 3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,	/* S5 */	 2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,	14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,	 4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,	11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,	/* S6 */	12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,	10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,	 9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,	 4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,	/* S7 */	 4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,	13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,	 1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,	 6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,	/* S8 */	13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,	 1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,	 7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,	 2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11};/* 32-bit permutation function P used on the output of the S-boxes */static unsigned char p32i[] = {		16,  7, 20, 21,	29, 12, 28, 17,	 1, 15, 23, 26,	 5, 18, 31, 10,	 2,  8, 24, 14,	32, 27,  3,  9,	19, 13, 30,  6,	22, 11,  4, 25};#endifunsigned long Spbox[8][64] = {{0x01010400,0x00000000,0x00010000,0x01010404,0x01010004,0x00010404,0x00000004,0x00010000,0x00000400,0x01010400,0x01010404,0x00000400,0x01000404,0x01010004,0x01000000,0x00000004,0x00000404,0x01000400,0x01000400,0x00010400,0x00010400,0x01010000,0x01010000,0x01000404,0x00010004,0x01000004,0x01000004,0x00010004,0x00000000,0x00000404,0x00010404,0x01000000,0x00010000,0x01010404,0x00000004,0x01010000,0x01010400,0x01000000,0x01000000,0x00000400,0x01010004,0x00010000,0x00010400,0x01000004,0x00000400,0x00000004,0x01000404,0x00010404,0x01010404,0x00010004,0x01010000,0x01000404,0x01000004,0x00000404,0x00010404,0x01010400,0x00000404,0x01000400,0x01000400,0x00000000,0x00010004,0x00010400,0x00000000,0x01010004},{0x80108020,0x80008000,0x00008000,0x00108020,0x00100000,0x00000020,0x80100020,0x80008020,0x80000020,0x80108020,0x80108000,0x80000000,0x80008000,0x00100000,0x00000020,0x80100020,0x00108000,0x00100020,0x80008020,0x00000000,0x80000000,0x00008000,0x00108020,0x80100000,0x00100020,0x80000020,0x00000000,0x00108000,0x00008020,0x80108000,0x80100000,0x00008020,0x00000000,0x00108020,0x80100020,0x00100000,0x80008020,0x80100000,0x80108000,0x00008000,0x80100000,0x80008000,0x00000020,0x80108020,0x00108020,0x00000020,0x00008000,0x80000000,0x00008020,0x80108000,0x00100000,0x80000020,0x00100020,0x80008020,0x80000020,0x00100020,0x00108000,0x00000000,0x80008000,0x00008020,0x80000000,0x80100020,0x80108020,0x00108000},{0x00000208,0x08020200,0x00000000,0x08020008,0x08000200,0x00000000,0x00020208,0x08000200,0x00020008,0x08000008,0x08000008,0x00020000,0x08020208,0x00020008,0x08020000,0x00000208,0x08000000,0x00000008,0x08020200,0x00000200,0x00020200,0x08020000,0x08020008,0x00020208,0x08000208,0x00020200,0x00020000,0x08000208,0x00000008,0x08020208,0x00000200,0x08000000,0x08020200,0x08000000,0x00020008,0x00000208,0x00020000,0x08020200,0x08000200,0x00000000,0x00000200,0x00020008,0x08020208,0x08000200,0x08000008,0x00000200,0x00000000,0x08020008,0x08000208,0x00020000,0x08000000,0x08020208,0x00000008,0x00020208,0x00020200,0x08000008,0x08020000,0x08000208,0x00000208,0x08020000,0x00020208,0x00000008,0x08020008,0x00020200},{0x00802001,0x00002081,0x00002081,0x00000080,0x00802080,0x00800081,0x00800001,0x00002001,0x00000000,0x00802000,0x00802000,0x00802081,0x00000081,0x00000000,0x00800080,0x00800001,0x00000001,0x00002000,0x00800000,0x00802001,0x00000080,0x00800000,0x00002001,0x00002080,0x00800081,0x00000001,0x00002080,0x00800080,0x00002000,0x00802080,0x00802081,0x00000081,0x00800080,0x00800001,0x00802000,0x00802081,0x00000081,0x00000000,0x00000000,0x00802000,0x00002080,0x00800080,0x00800081,0x00000001,0x00802001,0x00002081,0x00002081,0x00000080,0x00802081,0x00000081,0x00000001,0x00002000,0x00800001,0x00002001,0x00802080,0x00800081,0x00002001,0x00002080,0x00800000,0x00802001,0x00000080,0x00800000,0x00002000,0x00802080},{0x00000100,0x02080100,0x02080000,0x42000100,0x00080000,0x00000100,0x40000000,0x02080000,0x40080100,0x00080000,0x02000100,0x40080100,0x42000100,0x42080000,0x00080100,0x40000000,0x02000000,0x40080000,0x40080000,0x00000000,0x40000100,0x42080100,0x42080100,0x02000100,0x42080000,0x40000100,0x00000000,0x42000000,0x02080100,0x02000000,0x42000000,0x00080100,0x00080000,0x42000100,0x00000100,0x02000000,0x40000000,0x02080000,0x42000100,0x40080100,0x02000100,0x40000000,0x42080000,0x02080100,0x40080100,0x00000100,0x02000000,0x42080000,0x42080100,0x00080100,0x42000000,0x42080100,0x02080000,0x00000000,0x40080000,0x42000000,0x00080100,0x02000100,0x40000100,0x00080000,0x00000000,0x40080000,0x02080100,0x40000100},{0x20000010,0x20400000,0x00004000,0x20404010,0x20400000,0x00000010,0x20404010,0x00400000,0x20004000,0x00404010,0x00400000,0x20000010,0x00400010,0x20004000,0x20000000,0x00004010,0x00000000,0x00400010,0x20004010,0x00004000,0x00404000,0x20004010,0x00000010,0x20400010,0x20400010,0x00000000,0x00404010,0x20404000,0x00004010,0x00404000,0x20404000,0x20000000,0x20004000,0x00000010,0x20400010,0x00404000,0x20404010,0x00400000,0x00004010,0x20000010,0x00400000,0x20004000,0x20000000,0x00004010,0x20000010,0x20404010,0x00404000,0x20400000,0x00404010,0x20404000,0x00000000,0x20400010,0x00000010,0x00004000,0x20400000,0x00404010,0x00004000,0x00400010,0x20004010,0x00000000,0x20404000,0x20000000,0x00400010,0x20004010},{0x00200000,0x04200002,0x04000802,0x00000000,0x00000800,0x04000802,0x00200802,0x04200800,0x04200802,0x00200000,0x00000000,0x04000002,0x00000002,0x04000000,0x04200002,0x00000802,0x04000800,0x00200802,0x00200002,0x04000800,0x04000002,0x04200000,0x04200800,0x00200002,0x04200000,0x00000800,0x00000802,0x04200802,0x00200800,0x00000002,0x04000000,0x00200800,0x04000000,0x00200800,0x00200000,0x04000802,0x04000802,0x04200002,0x04200002,0x00000002,0x00200002,0x04000000,0x04000800,0x00200000,0x04200800,0x00000802,0x00200802,0x04200800,0x00000802,0x04000002,0x04200802,0x04200000,0x00200800,0x00000000,0x00000002,0x04200802,0x00000000,0x00200802,0x04200000,0x00000800,0x04000002,0x04000800,0x00000800,0x00200002},{0x10001040,0x00001000,0x00040000,0x10041040,0x10000000,0x10001040,0x00000040,0x10000000,0x00040040,0x10040000,0x10041040,0x00041000,0x10041000,0x00041040,0x00001000,0x00000040,0x10040000,0x10000040,0x10001000,0x00001040,0x00041000,0x00040040,0x10040040,0x10041000,0x00001040,0x00000000,0x00000000,0x10040040,0x10000040,0x10001000,0x00041040,0x00040000,0x00041040,0x00040000,0x10041000,0x00001000,0x00000040,0x10040040,0x00001000,0x00041040,0x10001000,0x00000040,0x10000040,0x10040000,0x10040040,0x10000000,0x00040000,0x10001040,0x00000000,0x10041040,0x00040040,0x10000040,0x10040000,0x10001000,0x10001040,0x00000000,0x10041040,0x00041000,0x00041000,0x00001040,0x00001040,0x00040040,0x10000000,0x10041000}};int Asmversion = 0;/* Combined SP lookup table, linked in * For best results, ensure that this is aligned on a 32-bit boundary; * Borland C++ 3.1 doesn't guarantee this! */extern unsigned long Spbox[8][64];		/* Combined S and P boxes *//* Primitive function F. * Input is r, subkey array in keys, output is XORed into l. * Each round consumes eight 6-bit subkeys, one for * each of the 8 S-boxes, 2 longs for each round. * Each long contains four 6-bit subkeys, each taking up a byte. * The first long contains, from high to low end, the subkeys for * S-boxes 1, 3, 5 & 7; the second contains the subkeys for S-boxes * 2, 4, 6 & 8 (using the origin-1 S-box numbering in the standard, * not the origin-0 numbering used elsewhere in this code) * See comments elsewhere about the pre-rotated values of r and Spbox. */#define	F(l,r,key){\	work = ((r >> 4) | (r << 28)) ^ key[0];\	l ^= Spbox[6][work & 0x3f];\	l ^= Spbox[4][(work >> 8) & 0x3f];\	l ^= Spbox[2][(work >> 16) & 0x3f];\	l ^= Spbox[0][(work >> 24) & 0x3f];\	work = r ^ key[1];\	l ^= Spbox[7][work & 0x3f];\	l ^= Spbox[5][(work >> 8) & 0x3f];\	l ^= Spbox[3][(work >> 16) & 0x3f];\	l ^= Spbox[1][(work >> 24) & 0x3f];\}/* Encrypt or decrypt a block of data in ECB mode */voiddes(ks,block)unsigned long ks[16][2];	/* Key schedule */unsigned char block[8];		/* Data block */{	unsigned long left,right,work;		/* Read input block and place in left/right in big-endian order */	left = ((unsigned long)block[0] << 24)	 | ((unsigned long)block[1] << 16)	 | ((unsigned long)block[2] << 8)	 | (unsigned long)block[3];	right = ((unsigned long)block[4] << 24)	 | ((unsigned long)block[5] << 16)	 | ((unsigned long)block[6] << 8)	 | (unsigned long)block[7];	/* Hoey's clever initial permutation algorithm, from Outerbridge	 * (see Schneier p 478)		 *	 * The convention here is the same as Outerbridge: rotate each	 * register left by 1 bit, i.e., so that "left" contains permuted	 * input bits 2, 3, 4, ... 1 and "right" contains 33, 34, 35, ... 32		 * (using origin-1 numbering as in the FIPS). This allows us to avoid	 * one of the two rotates that would otherwise be required in each of	 * the 16 rounds.	 */	work = ((left >> 4) ^ right) & 0x0f0f0f0f;	right ^= work;	left ^= work << 4;	work = ((left >> 16) ^ right) & 0xffff;	right ^= work;	left ^= work << 16;	work = ((right >> 2) ^ left) & 0x33333333;	left ^= work;	right ^= (work << 2);	work = ((right >> 8) ^ left) & 0xff00ff;	left ^= work;	right ^= (work << 8);	right = (right << 1) | (right >> 31);	work = (left ^ right) & 0xaaaaaaaa;	left ^= work;	right ^= work;	left = (left << 1) | (left >> 31);	/* Now do the 16 rounds */	F(left,right,ks[0]);	F(right,left,ks[1]);	F(left,right,ks[2]);	F(right,left,ks[3]);	F(left,right,ks[4]);	F(right,left,ks[5]);	F(left,right,ks[6]);	F(right,left,ks[7]);	F(left,right,ks[8]);	F(right,left,ks[9]);	F(left,right,ks[10]);	F(right,left,ks[11]);	F(left,right,ks[12]);	F(right,left,ks[13]);	F(left,right,ks[14]);	F(right,left,ks[15]);	/* Inverse permutation, also from Hoey via Outerbridge and Schneier */	right = (right << 31) | (right >> 1);	work = (left ^ right) & 0xaaaaaaaa;	left ^= work;	right ^= work;	left = (left >> 1) | (left  << 31);	work = ((left >> 8) ^ right) & 0xff00ff;	right ^= work;	left ^= work << 8;	work = ((left >> 2) ^ right) & 0x33333333;	right ^= work;	left ^= work << 2;	work = ((right >> 16) ^ left) & 0xffff;	left ^= work;	right ^= work << 16;	work = ((right >> 4) ^ left) & 0x0f0f0f0f;	left ^= work;	right ^= work << 4;	/* Put the block back into the user's buffer with final swap */	block[0] = right >> 24;	block[1] = right >> 16;	block[2] = right >> 8;	block[3] = right;	block[4] = left >> 24;	block[5] = left >> 16;	block[6] = left >> 8;	block[7] = left;}

⌨️ 快捷键说明

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