亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? twofish2.c

?? 一個(gè)towfish加密算法的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號(hào):
/***************************************************************************
	TWOFISH2.C	-- Optimized C API calls for TWOFISH AES submission

	Submitters:
		Bruce Schneier, Counterpane Systems
		Doug Whiting,	Hi/fn
		John Kelsey,	Counterpane Systems
		Chris Hall,		Counterpane Systems
		David Wagner,	UC Berkeley
			
	Code Author:		Doug Whiting,	Hi/fn
		
	Version  1.00		April 1998
		
	Copyright 1998, Hi/fn and Counterpane Systems.  All rights reserved.
		
	Notes:
		*	Optimized version
		*	Tab size is set to 4 characters in this file

***************************************************************************/
#include	"aes.h"
#include	"table.h"

#include	<memory.h>
#include	<assert.h>

#if   defined(min_key)  && !defined(MIN_KEY)
#define	MIN_KEY		1			/* toupper() */
#elif defined(part_key) && !defined(PART_KEY)
#define	PART_KEY	1
#elif defined(zero_key) && !defined(ZERO_KEY)
#define	ZERO_KEY	1
#endif


#ifdef USE_ASM
extern	int	useAsm;				/* ok to use ASM code? */

typedef	int CipherProc
   (cipherInstance *cipher, keyInstance *key,BYTE *input,int inputLen,BYTE *outBuffer);
typedef int	KeySetupProc(keyInstance *key);

extern CipherProc	*blockEncrypt_86;	/* ptr to ASM functions */
extern CipherProc	*blockDecrypt_86;
extern KeySetupProc	*reKey_86;
extern DWORD		TwofishAsmCodeSize(void);
#endif

/*
+*****************************************************************************
*			Constants/Macros/Tables
-****************************************************************************/

#define		CONST					/* help syntax from C++, NOP here */

CONST		fullSbox MDStab;		/* not actually const.  Initialized ONE time */
int			needToBuildMDS=1;		/* is MDStab initialized yet? */

/* number of rounds for various key sizes:  128, 192, 256 */
/* (ignored for now in optimized code!) */
int			numRounds[4]= {0,ROUNDS_128,ROUNDS_192,ROUNDS_256};

#if REENTRANT
#define		_sBox_	 key->sBox8x32
#else
static		fullSbox _sBox_;		/* permuted MDStab based on keys */
#endif
#define _sBox8_(N) (((BYTE *) _sBox_) + (N)*256)

/*------- see what level of S-box precomputation we need to do -----*/
#if   defined(ZERO_KEY)
#define	MOD_STRING	"(Zero S-box keying)"
#define	Fe32_128(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[_b(x,R  )]^b0(SKEY[1])]^b0(SKEY[0])] ^	\
		MDStab[1][p8(11)[p8(12)[_b(x,R+1)]^b1(SKEY[1])]^b1(SKEY[0])] ^	\
		MDStab[2][p8(21)[p8(22)[_b(x,R+2)]^b2(SKEY[1])]^b2(SKEY[0])] ^	\
		MDStab[3][p8(31)[p8(32)[_b(x,R+3)]^b3(SKEY[1])]^b3(SKEY[0])] )
#define	Fe32_192(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[p8(03)[_b(x,R  )]^b0(SKEY[2])]^b0(SKEY[1])]^b0(SKEY[0])] ^ \
		MDStab[1][p8(11)[p8(12)[p8(13)[_b(x,R+1)]^b1(SKEY[2])]^b1(SKEY[1])]^b1(SKEY[0])] ^ \
		MDStab[2][p8(21)[p8(22)[p8(23)[_b(x,R+2)]^b2(SKEY[2])]^b2(SKEY[1])]^b2(SKEY[0])] ^ \
		MDStab[3][p8(31)[p8(32)[p8(33)[_b(x,R+3)]^b3(SKEY[2])]^b3(SKEY[1])]^b3(SKEY[0])] )
#define	Fe32_256(x,R)	\
	(	MDStab[0][p8(01)[p8(02)[p8(03)[p8(04)[_b(x,R  )]^b0(SKEY[3])]^b0(SKEY[2])]^b0(SKEY[1])]^b0(SKEY[0])] ^ \
		MDStab[1][p8(11)[p8(12)[p8(13)[p8(14)[_b(x,R+1)]^b1(SKEY[3])]^b1(SKEY[2])]^b1(SKEY[1])]^b1(SKEY[0])] ^ \
		MDStab[2][p8(21)[p8(22)[p8(23)[p8(24)[_b(x,R+2)]^b2(SKEY[3])]^b2(SKEY[2])]^b2(SKEY[1])]^b2(SKEY[0])] ^ \
		MDStab[3][p8(31)[p8(32)[p8(33)[p8(34)[_b(x,R+3)]^b3(SKEY[3])]^b3(SKEY[2])]^b3(SKEY[1])]^b3(SKEY[0])] )

#define	GetSboxKey	DWORD SKEY[4];	/* local copy */ \
					memcpy(SKEY,key->sboxKeys,sizeof(SKEY));
/*----------------------------------------------------------------*/
#elif defined(MIN_KEY)
#define	MOD_STRING	"(Minimal keying)"
#define	Fe32_(x,R)(MDStab[0][p8(01)[_sBox8_(0)[_b(x,R  )]] ^ b0(SKEY0)] ^ \
				   MDStab[1][p8(11)[_sBox8_(1)[_b(x,R+1)]] ^ b1(SKEY0)] ^ \
				   MDStab[2][p8(21)[_sBox8_(2)[_b(x,R+2)]] ^ b2(SKEY0)] ^ \
				   MDStab[3][p8(31)[_sBox8_(3)[_b(x,R+3)]] ^ b3(SKEY0)])
#define sbSet(N,i,J,v) { _sBox8_(N)[i+J] = v; }
#define	GetSboxKey	DWORD SKEY0	= key->sboxKeys[0]		/* local copy */
/*----------------------------------------------------------------*/
#elif defined(PART_KEY)	
#define	MOD_STRING	"(Partial keying)"
#define	Fe32_(x,R)(MDStab[0][_sBox8_(0)[_b(x,R  )]] ^ \
				   MDStab[1][_sBox8_(1)[_b(x,R+1)]] ^ \
				   MDStab[2][_sBox8_(2)[_b(x,R+2)]] ^ \
				   MDStab[3][_sBox8_(3)[_b(x,R+3)]])
#define sbSet(N,i,J,v) { _sBox8_(N)[i+J] = v; }
#define	GetSboxKey	
/*----------------------------------------------------------------*/
#else	/* default is FULL_KEY */
#ifndef FULL_KEY
#define	FULL_KEY	1
#endif
#ifdef COMPILE_KEY
#define	MOD_STRING	"(Compiled subkeys)"
#else
#define	MOD_STRING	"(Full keying)"
#endif
/* Fe32_ does a full S-box + MDS lookup.  Need to #define _sBox_ before use.
   Note that we "interleave" 0,1, and 2,3 to avoid cache bank collisions
   in optimized assembly language.
*/
#define	Fe32_(x,R) (_sBox_[0][2*_b(x,R  )] ^ _sBox_[0][2*_b(x,R+1)+1] ^	\
				    _sBox_[2][2*_b(x,R+2)] ^ _sBox_[2][2*_b(x,R+3)+1])
		/* set a single S-box value, given the input byte */
#define sbSet(N,i,J,v) { _sBox_[N&2][2*i+(N&1)+2*J]=MDStab[N][v]; }
#define	GetSboxKey	
#endif

CONST		char *moduleDescription	="Optimized C ";
CONST		char *modeString		=MOD_STRING;


/* macro(s) for debugging help */
#define		CHECK_TABLE		0		/* nonzero --> compare against "slow" table */
#define		VALIDATE_PARMS	0		/* disable for full speed */

#include	"debug.h"				/* debug display macros */

/* end of debug macros */

extern DWORD Here(DWORD x);			/* return caller's address! */
DWORD TwofishCodeStart(void) { return Here(0); };

/*
+*****************************************************************************
*
* Function Name:	setRounds
*
* Function:			Set the number of rounds for Twofish
*
* Arguments:		keyLen		=	which keyLength to affect (128,192,256)
*					numRounds	=	how many rounds
*
* Return:			TRUE if the values passed in are valid
*
* Notes: This routine sets global variable(s) which are used in setting
*		 up the key schedule.
*
-****************************************************************************/
int setRounds(int keyLen,int nRounds)
	{
	if ((nRounds < 2) || (nRounds > MAX_ROUNDS) || (nRounds & 1))
		return FALSE;

	switch (keyLen)
		{
		case 128:	numRounds[1]=nRounds;	break;
		case 192:	numRounds[2]=nRounds;	break;
		case 256:	numRounds[3]=nRounds;	break;
		default:	return FALSE;
		}

	return TRUE;
	}
/*
+*****************************************************************************
*
* Function Name:	TableOp
*
* Function:			Handle table use checking
*
* Arguments:		op	=	what to do	(see TAB_* defns in AES.H)
*
* Return:			TRUE --> done (for TAB_QUERY)		
*
* Notes: This routine is for use in generating the tables KAT file.
*		 For this optimized version, we don't actually track table usage,
*		 since it would make the macros incredibly ugly.  Instead we just
*		 run for a fixed number of queries and then say we're done.
*
-****************************************************************************/
int TableOp(int op)
	{
	static int queryCnt=0;

	switch (op)
		{
		case TAB_DISABLE:
			break;
		case TAB_ENABLE:
			break;
		case TAB_RESET:
			queryCnt=0;
			break;
		case TAB_QUERY:
			queryCnt++;
			if (queryCnt < TAB_MIN_QUERY)
				return FALSE;
		}
	return TRUE;
	}


/*
+*****************************************************************************
*
* Function Name:	ParseHexDword
*
* Function:			Parse ASCII hex nibbles and fill in key/iv dwords
*
* Arguments:		bit			=	# bits to read
*					srcTxt		=	ASCII source
*					d			=	ptr to dwords to fill in
*					dstTxt		=	where to make a copy of ASCII source
*									(NULL ok)
*
* Return:			Zero if no error.  Nonzero --> invalid hex or length
*
* Notes:  Note that the parameter d is a DWORD array, not a byte array.
*	This routine is coded to work both for little-endian and big-endian
*	architectures.  The character stream is interpreted as a LITTLE-ENDIAN
*	byte stream, since that is how the Pentium works, but the conversion
*	happens automatically below. 
*
-****************************************************************************/
int ParseHexDword(int bits,CONST char *srcTxt,DWORD *d,char *dstTxt)
	{
	int i;
	char c;
	DWORD b;

	union	/* make sure LittleEndian is defined correctly */
		{
		BYTE  b[4];
		DWORD d[1];
		} v;
	v.d[0]=1;
	if (v.b[0 ^ ADDR_XOR] != 1)
		return BAD_ENDIAN;		/* make sure compile-time switch is set ok */

#if VALIDATE_PARMS
  #if ALIGN32
	if (((int)d) & 3)
		return BAD_ALIGN32;	
  #endif
#endif

	for (i=0;i*32<bits;i++)
		d[i]=0;					/* first, zero the field */

	for (i=0;i*4<bits;i++)		/* parse one nibble at a time */
		{						/* case out the hexadecimal characters */
		c=srcTxt[i];
		if (dstTxt) dstTxt[i]=c;
		if ((c >= '0') && (c <= '9'))
			b=c-'0';
		else if ((c >= 'a') && (c <= 'f'))
			b=c-'a'+10;
		else if ((c >= 'A') && (c <= 'F'))
			b=c-'A'+10;
		else
			return BAD_KEY_MAT;	/* invalid hex character */
		/* works for big and little endian! */
		d[i/8] |= b << (4*((i^1)&7));		
		}

	return 0;					/* no error */
	}


#if CHECK_TABLE
/*
+*****************************************************************************
*
* Function Name:	f32
*
* Function:			Run four bytes through keyed S-boxes and apply MDS matrix
*
* Arguments:		x			=	input to f function
*					k32			=	pointer to key dwords
*					keyLen		=	total key length (k32 --> keyLey/2 bits)
*
* Return:			The output of the keyed permutation applied to x.
*
* Notes:
*	This function is a keyed 32-bit permutation.  It is the major building
*	block for the Twofish round function, including the four keyed 8x8 
*	permutations and the 4x4 MDS matrix multiply.  This function is used
*	both for generating round subkeys and within the round function on the
*	block being encrypted.  
*
*	This version is fairly slow and pedagogical, although a smartcard would
*	probably perform the operation exactly this way in firmware.   For
*	ultimate performance, the entire operation can be completed with four
*	lookups into four 256x32-bit tables, with three dword xors.
*
*	The MDS matrix is defined in TABLE.H.  To multiply by Mij, just use the
*	macro Mij(x).
*
-****************************************************************************/
DWORD f32(DWORD x,CONST DWORD *k32,int keyLen)
	{
	BYTE  b[4];
	
	/* Run each byte thru 8x8 S-boxes, xoring with key byte at each stage. */
	/* Note that each byte goes through a different combination of S-boxes.*/

	*((DWORD *)b) = Bswap(x);	/* make b[0] = LSB, b[3] = MSB */
	switch (((keyLen + 63)/64) & 3)
		{
		case 0:		/* 256 bits of key */
			b[0] = p8(04)[b[0]] ^ b0(k32[3]);
			b[1] = p8(14)[b[1]] ^ b1(k32[3]);
			b[2] = p8(24)[b[2]] ^ b2(k32[3]);
			b[3] = p8(34)[b[3]] ^ b3(k32[3]);
			/* fall thru, having pre-processed b[0]..b[3] with k32[3] */
		case 3:		/* 192 bits of key */
			b[0] = p8(03)[b[0]] ^ b0(k32[2]);
			b[1] = p8(13)[b[1]] ^ b1(k32[2]);
			b[2] = p8(23)[b[2]] ^ b2(k32[2]);
			b[3] = p8(33)[b[3]] ^ b3(k32[2]);
			/* fall thru, having pre-processed b[0]..b[3] with k32[2] */
		case 2:		/* 128 bits of key */
			b[0] = p8(00)[p8(01)[p8(02)[b[0]] ^ b0(k32[1])] ^ b0(k32[0])];
			b[1] = p8(10)[p8(11)[p8(12)[b[1]] ^ b1(k32[1])] ^ b1(k32[0])];
			b[2] = p8(20)[p8(21)[p8(22)[b[2]] ^ b2(k32[1])] ^ b2(k32[0])];
			b[3] = p8(30)[p8(31)[p8(32)[b[3]] ^ b3(k32[1])] ^ b3(k32[0])];
		}

	/* Now perform the MDS matrix multiply inline. */
	return	((M00(b[0]) ^ M01(b[1]) ^ M02(b[2]) ^ M03(b[3]))	  ) ^
			((M10(b[0]) ^ M11(b[1]) ^ M12(b[2]) ^ M13(b[3])) <<  8) ^
			((M20(b[0]) ^ M21(b[1]) ^ M22(b[2]) ^ M23(b[3])) << 16) ^
			((M30(b[0]) ^ M31(b[1]) ^ M32(b[2]) ^ M33(b[3])) << 24) ;
	}
#endif	/* CHECK_TABLE */


/*
+*****************************************************************************
*
* Function Name:	RS_MDS_encode
*
* Function:			Use (12,8) Reed-Solomon code over GF(256) to produce
*					a key S-box dword from two key material dwords.
*
* Arguments:		k0	=	1st dword
*					k1	=	2nd dword
*
* Return:			Remainder polynomial generated using RS code
*
* Notes:
*	Since this computation is done only once per reKey per 64 bits of key,
*	the performance impact of this routine is imperceptible. The RS code
*	chosen has "simple" coefficients to allow smartcard/hardware implementation
*	without lookup tables.
*
-****************************************************************************/
DWORD RS_MDS_Encode(DWORD k0,DWORD k1)
	{
	int i,j;
	DWORD r;

	for (i=r=0;i<2;i++)
		{
		r ^= (i) ? k0 : k1;			/* merge in 32 more key bits */
		for (j=0;j<4;j++)			/* shift one byte at a time */
			RS_rem(r);				
		}
	return r;
	}


/*
+*****************************************************************************

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜精品免费在线观看| 麻豆久久久久久久| 欧美精品丝袜中出| 成人精品在线视频观看| 日本在线不卡视频| 亚洲另类在线制服丝袜| 2021久久国产精品不只是精品| 一本久久综合亚洲鲁鲁五月天| 极品少妇一区二区三区精品视频| 亚洲国产日韩a在线播放 | 国产三级欧美三级日产三级99| 日本丶国产丶欧美色综合| 国产一区二区三区在线观看免费视频| 亚洲午夜久久久久久久久久久| 日本一二三四高清不卡| 精品88久久久久88久久久| 欧美在线制服丝袜| 99久久久久免费精品国产| 国产成人免费视频一区| 久久99精品一区二区三区三区| 亚洲一区二区三区影院| 亚洲精品中文在线观看| 国产精品白丝在线| 中文字幕第一区| 久久尤物电影视频在线观看| 日韩一区二区精品在线观看| 欧美另类久久久品| 欧美裸体一区二区三区| 欧美日韩国产精品自在自线| 色哟哟在线观看一区二区三区| av综合在线播放| www.日韩在线| aaa欧美大片| 91丨porny丨在线| 一本久道久久综合中文字幕| av在线免费不卡| 91香蕉视频污在线| 日本韩国欧美在线| 在线这里只有精品| 欧美性xxxxx极品少妇| 欧日韩精品视频| 欧美日韩第一区日日骚| 欧美另类变人与禽xxxxx| 7777精品伊人久久久大香线蕉经典版下载 | www激情久久| 欧美精品一区二区三区蜜臀| 欧美一区二区三区的| 777色狠狠一区二区三区| 欧美一区二区三区视频免费播放| 欧美日韩国产一区二区三区地区| 欧美日韩视频专区在线播放| 91精品中文字幕一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 国产日产欧美一区二区三区| 欧美激情一区二区三区四区| 国产精品电影一区二区三区| 日韩一区欧美一区| 亚洲一级在线观看| 裸体一区二区三区| 韩国精品主播一区二区在线观看 | 97精品视频在线观看自产线路二| 91网站在线观看视频| 欧美性色黄大片| 欧美一区二区三区在| 久久久五月婷婷| 亚洲视频网在线直播| 偷拍亚洲欧洲综合| 极品少妇xxxx精品少妇| 成人国产精品免费网站| 91黄色免费网站| 精品日韩在线一区| 中文字幕亚洲精品在线观看| 图片区日韩欧美亚洲| 高清不卡一区二区| 欧美日韩一区二区三区在线看| 日韩亚洲电影在线| 中文字幕在线观看一区| 亚洲成精国产精品女| 国产剧情一区在线| 欧洲av一区二区嗯嗯嗯啊| 日韩精品一区二区三区三区免费| 中文字幕 久热精品 视频在线| 亚洲综合男人的天堂| 精品一区二区三区免费| 色综合婷婷久久| 欧美大片日本大片免费观看| 国产精品久久久久久久久免费樱桃| 午夜电影一区二区| 成人国产在线观看| 日韩欧美高清一区| 亚洲小少妇裸体bbw| 国产一区二区导航在线播放| 欧美三区在线视频| 国产精品色在线观看| 秋霞电影一区二区| 色乱码一区二区三区88| 久久精品欧美日韩| 琪琪久久久久日韩精品| 色婷婷狠狠综合| 国产精品视频一二三区| 久久99久国产精品黄毛片色诱| 在线视频国产一区| 国产欧美日韩不卡| 麻豆91精品91久久久的内涵| 欧美私模裸体表演在线观看| 国产精品久久久久婷婷二区次| 卡一卡二国产精品| 欧美欧美欧美欧美首页| 日韩美女久久久| 成人黄色在线看| 久久久午夜电影| 久久国产精品99久久久久久老狼| 欧美亚洲动漫精品| 亚洲欧美日韩一区二区三区在线观看| 国产精品羞羞答答xxdd| 精品久久久久久最新网址| 视频一区欧美日韩| 欧美日韩黄色影视| 亚洲成人精品在线观看| 欧美丝袜第三区| 亚洲精品乱码久久久久久黑人 | 午夜精品视频一区| 欧美午夜宅男影院| 一区二区三区日韩精品| 97se狠狠狠综合亚洲狠狠| 国产精品久久久久久久久免费桃花 | 国产精品伦理在线| 国产成人精品一区二区三区四区 | 亚洲精品一区在线观看| 日韩av一级电影| 6080国产精品一区二区| 日韩精品一区第一页| 欧美日本在线播放| 日产国产高清一区二区三区| 欧美精品1区2区| 蜜臀久久99精品久久久久久9| 欧美精品自拍偷拍动漫精品| 日韩电影在线免费看| 欧美一区欧美二区| 国产在线视频精品一区| 国产亚洲精久久久久久| 高潮精品一区videoshd| 国产午夜三级一区二区三| 粉嫩一区二区三区性色av| 欧美国产综合一区二区| a4yy欧美一区二区三区| 亚洲精品综合在线| 欧美日韩亚洲综合在线| 日本特黄久久久高潮| 精品国产3级a| 国产成人av福利| 亚洲美女偷拍久久| 欧美精品一卡二卡| 国产综合久久久久久鬼色| 国产农村妇女精品| 99精品视频在线播放观看| 亚洲一区二区三区不卡国产欧美 | 久久精品网站免费观看| 99亚偷拍自图区亚洲| 亚洲国产美国国产综合一区二区| 911国产精品| 国产成人免费视| 一区二区三区四区不卡在线| 欧美日韩国产综合一区二区三区| 久久66热偷产精品| 国产精品国产三级国产aⅴ中文| 91精品91久久久中77777| 奇米四色…亚洲| 国产精品国产成人国产三级| 欧美日韩高清一区二区不卡| 国产精一区二区三区| 一区二区三区在线不卡| 欧美成人一区二区三区片免费| 高清不卡一区二区在线| 午夜精品久久一牛影视| 国产日本欧美一区二区| 欧美猛男gaygay网站| 国产精品主播直播| 亚洲第一精品在线| 国产亚洲一区二区在线观看| 91久久一区二区| 国产乱子伦视频一区二区三区| 亚洲黄色片在线观看| 26uuu亚洲婷婷狠狠天堂| 91久久线看在观草草青青| 国产精品自产自拍| 午夜精品久久久久久| 国产精品久久一级| 精品欧美一区二区在线观看| 欧美中文字幕亚洲一区二区va在线| 国产在线精品免费| 亚洲h精品动漫在线观看| 国产精品久久久久久户外露出| 欧美一区二区三区系列电影| 色悠久久久久综合欧美99| 国产精品一区免费视频| 日韩影院精彩在线| 亚洲最新在线观看| 中文字幕国产精品一区二区| 日韩欧美亚洲国产另类 |