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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tripledes.c

?? 一個加密庫代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Copyright 1997-2005 Markus Hahn 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


#include "TripleDES.h"


// internal constants
#define KEYSETUP_ENCRYPTION     0
#define KEYSETUP_DECRYPTION     1



// prototypes of the support routines
void _expandPureDESKey(const WORD8*, WORD8*);
void _keysetup(WORD8*, int, WORD32*);
void _processBlock(WORD8*, WORD8*, WORD32*);
void _blkcpy(WORD8*, WORD8*);
void _blkcpy_r(WORD8*, WORD8*);


WORD32 TripleDES_GetCipherInfo
(CIPHERINFOBLOCK* pInfo) 
{
	WORD8* pSrc;
	WORD8* pDst;
	CIPHERINFOBLOCK tempinfo;
	WORD32 lI;

	// prepare the information context
	tempinfo.lSizeOf = pInfo->lSizeOf;
	tempinfo.lBlockSize = TRIPLEDES_BLOCKSIZE;
	tempinfo.lKeySize = TRIPLEDES_KEYSIZE; 
	tempinfo.blOwnHasher = BOOL_FALSE;
	tempinfo.lInitDataSize = TRIPLEDES_BLOCKSIZE;
	tempinfo.lContextSize = sizeof(TRIPLEDESCTX);
	tempinfo.bCipherIs = CIPHER_IS_BLOCKLINK;

	// copy as many bytes of the information block as possible
	pSrc = (WORD8*) &tempinfo;
	pDst = (WORD8*) pInfo;
	for (lI = 0; lI < tempinfo.lSizeOf; lI++)
		*pDst++ = *pSrc++;

	return CIPHER_ERROR_NOERROR;
}



WORD32 TripleDES_SelfTest 
(void* pTestContext) 
{
	// test the cipher for correct encrypting and decrypting
	// (we test only a single DES stage with the original validation sets)

	static WORD8 refkey[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
	static WORD8 plainBlock[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xe7 };
	static WORD8 cipherBlock[8] = { 0xc9, 0x57, 0x44, 0x25, 0x6a, 0x5e, 0xd3, 0x1d };
	WORD8 workBlock[8];
	WORD32 k[32];
	int nI;

	// encrypt the test block
	_keysetup(refkey, KEYSETUP_ENCRYPTION, k);
	_processBlock(plainBlock, workBlock, k);

	// equal ciphertexts?
	for (nI = 0; nI < 8; nI++)
		if (workBlock[nI] != cipherBlock[nI]) return CIPHER_ERROR_INVALID;

	// decrypt the test block
	_keysetup(refkey, KEYSETUP_DECRYPTION, k);
	_processBlock(workBlock, workBlock, k);

	// equal plaintexts?
	for (nI = 0; nI < 8; nI++) 
	{
		if (plainBlock[nI] != workBlock[nI]) return CIPHER_ERROR_INVALID;
	}
	return CIPHER_ERROR_NOERROR;
}



WORD32 TripleDES_CreateWorkContext
(void* pContext,
 const WORD8* pKey,
 WORD32 lKeyLen,
 WORD32 lMode,
 void* pInitData,
 Cipher_RandomGenerator GetRndBytes,
 const void* pRndGenData) 
{
	int nI;
	WORD8* pbInit;
	WORD8 deskey1[8];
	WORD8 deskey2[8];
	WORD8 deskey3[8];
	TRIPLEDESCTX* pCtx;

	pCtx = (TRIPLEDESCTX*) pContext;
	pCtx->blLegacy = (CIPHER_GETFLAGS(lMode) & CIPHER_MODE_FLAG_LEGACY) ? BOOL_TRUE : BOOL_FALSE;

	// create three DES keys from the "pure" key, ignoring the parity
	_expandPureDESKey(pKey, deskey1);
	_expandPureDESKey(pKey + 7, deskey2);
	_expandPureDESKey(pKey + 14, deskey3);

	// run the key setups
	if (CIPHER_GETMODE(lMode) == CIPHER_MODE_ENCRYPT) 
	{
		_keysetup(deskey1, KEYSETUP_ENCRYPTION, pCtx->k1);
		_keysetup(deskey2, KEYSETUP_DECRYPTION, pCtx->k2);
		_keysetup(deskey3, KEYSETUP_ENCRYPTION, pCtx->k3);
	}
	else 
	{
		_keysetup(deskey1, KEYSETUP_DECRYPTION, pCtx->k1);
		_keysetup(deskey2, KEYSETUP_ENCRYPTION, pCtx->k2);
		_keysetup(deskey3, KEYSETUP_DECRYPTION, pCtx->k3);
	}

	// delete the DES keys
	for (nI = 0; nI < 8; nI++) 
	{
		deskey1[nI] = 0;
		deskey2[nI] = 0;
		deskey3[nI] = 0;
	}

	// for encryption create a CBC IV
	pbInit = (WORD8*) pInitData;
	if (lMode == CIPHER_MODE_ENCRYPT)
	{
		GetRndBytes(pbInit, TRIPLEDES_BLOCKSIZE, pRndGenData);
	}

	if (pCtx->blLegacy)
	{
		// the old code stored everything completely reversed
		_blkcpy_r(pbInit, pCtx->cbciv);
	}
	else
	{
		_blkcpy(pbInit, pCtx->cbciv);
	}

	// FIXME: weak keys in triple-DES?
	return CIPHER_ERROR_NOERROR;
}


void TripleDES_ResetWorkContext
(void* pContext,
 WORD32 lMode,
 void* pInitData,
 Cipher_RandomGenerator GetRndBytes,
 const void* pRndGenData) 
{
	TRIPLEDESCTX* pCtx = (TRIPLEDESCTX*) pContext;

	// just reset the CBC IV 
	WORD8* pbInit = (WORD8*) pInitData;
	if (CIPHER_GETMODE(lMode) == CIPHER_MODE_ENCRYPT)
		GetRndBytes(pbInit, TRIPLEDES_BLOCKSIZE, pRndGenData);

	if (pCtx->blLegacy)
	{
		_blkcpy_r(pbInit, pCtx->cbciv);
	}
	else
	{
		_blkcpy(pbInit, pCtx->cbciv);
	}
}



WORD32 TripleDES_DestroyWorkContext
(void* pContext) 
{
	// clear the context
	int nI;
	WORD8* pClearIt = (WORD8*) pContext;
	for (nI = 0; nI < sizeof(TRIPLEDESCTX); nI++) 
		pClearIt[nI] = 0x00;
	return CIPHER_ERROR_NOERROR;
}



void TripleDES_EncryptBuffer
(void* pContext,
 const void* pSource,
 void* pTarget,
 WORD32 lNumOfBytes) 
{
	WORD32 lI, lJ;
	WORD8* pbIn = (WORD8*) pSource;
	WORD8* pbOut = (WORD8*) pTarget;
	TRIPLEDESCTX* pCtx = (TRIPLEDESCTX*) pContext;

	lNumOfBytes &= ~(TRIPLEDES_BLOCKSIZE - 1);

	// work through all blocks... 
	for (lI = 0; lI < lNumOfBytes; lI += TRIPLEDES_BLOCKSIZE) 
	{
		// copy and chain the recent block 
		if (pCtx->blLegacy)
		{
			// (we have to bring back the CBC IV into 64bit little endian)
			for (lJ = 0; lJ < TRIPLEDES_BLOCKSIZE; lJ++)
				pbOut[lI + lJ] = pbIn[lI + lJ] ^ pCtx->cbciv[(TRIPLEDES_BLOCKSIZE - 1) - lJ];
		}
		else
		{
			for (lJ = 0; lJ < TRIPLEDES_BLOCKSIZE; lJ++)
				pbOut[lI + lJ] = pbIn[lI + lJ] ^ pCtx->cbciv[lJ];
		}

		// encrypt the block
		_processBlock(&pbOut[lI], &pbOut[lI], pCtx->k1);
		_processBlock(&pbOut[lI], &pbOut[lI], pCtx->k2);
		_processBlock(&pbOut[lI], &pbOut[lI], pCtx->k3);

		// set the new CBC IV (same as above)
		if (pCtx->blLegacy)
		{
			_blkcpy_r(&pbOut[lI], pCtx->cbciv);
		}
		else
		{
			_blkcpy(&pbOut[lI], pCtx->cbciv);
		}
	}
}



void TripleDES_DecryptBuffer
(void* pContext,
 const void* pSource,
 void* pTarget, 
 WORD32 lNumOfBytes,
 const void* pPreviousBlock) 
{
	WORD32 lI, lJ;
	WORD8 saveiv[TRIPLEDES_BLOCKSIZE];
	WORD8* pbIn = (WORD8*) pSource;
	WORD8* pbOut = (WORD8*) pTarget;
	WORD8* pbPrev;
	TRIPLEDESCTX* pCtx = (TRIPLEDESCTX*) pContext;

	lNumOfBytes &= ~(TRIPLEDES_BLOCKSIZE - 1);

	// load a new CBC IV, if necessary 
	if (pPreviousBlock != CIPHER_NULL)  
	{
		pbPrev = (WORD8*)pPreviousBlock;
		if (pCtx->blLegacy)
		{
			_blkcpy_r(pbPrev, pCtx->cbciv);
		}
		else
		{
			_blkcpy(pbPrev, pCtx->cbciv);
		}
	}

	// work through all blocks... 
	for (lI = 0; lI < lNumOfBytes; lI += 8) 
	{
		// save the recent CBC IV (don't care for the layout right now)
		_blkcpy(&pbIn[lI], saveiv);

		// decrypt the block 
		_processBlock(&pbIn [lI], &pbOut[lI], pCtx->k3);
		_processBlock(&pbOut[lI], &pbOut[lI], pCtx->k2);
		_processBlock(&pbOut[lI], &pbOut[lI], pCtx->k1);

		// dechain the recent block
		if (pCtx->blLegacy)
		{
			// same as above: bring back the IV into the old format
			for (lJ = 0; lJ < TRIPLEDES_BLOCKSIZE; lJ++)
				pbOut[lI + lJ] ^= pCtx->cbciv[(TRIPLEDES_BLOCKSIZE - 1) - lJ];
		}
		else
		{
			for (lJ = 0; lJ < TRIPLEDES_BLOCKSIZE; lJ++)
				pbOut[lI + lJ] ^= pCtx->cbciv[lJ];
		}

		// set the new CBC IV (normalized)
		if (pCtx->blLegacy)
		{
			_blkcpy_r(saveiv, pCtx->cbciv);
		}
		else
		{
			_blkcpy(saveiv, pCtx->cbciv);
		}
	}
}

//////////////////////////////////////////////////////////////////////////////


// support routines implementation...


// constant stuff...

static WORD8 pc1[56] = 
{
	56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,
	9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35,
	62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,
	13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11,  3 
};

static WORD8 totrot[16] = 
{
	1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 
};

static WORD8 pc2[48] = 
{
	13, 16, 10, 23,  0,  4,  2, 27, 14,  5, 20,  9,
	22, 18, 11,  3, 25,  7, 15,  6, 26, 19, 12,  1,
	40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,
	43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 
};


static WORD16 bytebit[8] = 
{
	0200, 0100, 040, 020, 010, 04, 02, 01 
};

static WORD32 bigbyte[24] = 
{
	0x800000L,  0x400000L,  0x200000L,  0x100000L,
	0x80000L,   0x40000L,   0x20000L,   0x10000L,
	0x8000L,    0x4000L,    0x2000L,    0x1000L,
	0x800L,     0x400L,     0x200L,     0x100L,
	0x80L,      0x40L,      0x20L,      0x10L,
	0x8L,       0x4L,       0x2L,       0x1L    
};

static unsigned long SP1[64] = 
{
	0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L,
	0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L,
	0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L,
	0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L,
	0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L,
	0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L,
	0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L,
	0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L,
	0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L,
	0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L,
	0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L,
	0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L,
	0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L,
	0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L,
	0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久午夜片 | 久久精品人人做人人爽97| 26uuu精品一区二区| 一区二区三区四区在线免费观看| 日韩精品1区2区3区| 99免费精品视频| 久久久国产综合精品女国产盗摄| 亚洲第一久久影院| 91猫先生在线| 欧美激情艳妇裸体舞| 久久精品久久久精品美女| 91在线高清观看| 欧美国产在线观看| 国产精选一区二区三区| 欧美日韩精品一区二区三区四区 | 亚洲一级片在线观看| 国产精品资源在线观看| 日韩一区二区在线看| 亚洲精品videosex极品| 成人午夜视频在线| 久久久激情视频| 国产一区视频导航| 精品国产乱码久久久久久老虎 | 亚洲精品乱码久久久久久久久 | 中文字幕中文乱码欧美一区二区| 国产一区二区三区久久悠悠色av | 亚洲欧洲日本在线| 成人永久aaa| 国产精品蜜臀在线观看| 国产传媒欧美日韩成人| 欧美mv日韩mv国产网站| 美美哒免费高清在线观看视频一区二区 | 欧美日韩视频一区二区| 亚洲欧美二区三区| 91精品福利在线| 亚洲一二三四久久| 欧美亚洲一区二区三区四区| 一区二区三区欧美激情| 欧美最新大片在线看| 午夜精品123| 欧美xxxxxxxx| 国内精品写真在线观看| 久久久久久久综合| 99精品久久99久久久久| 一区二区三区在线免费视频| 欧美自拍偷拍午夜视频| 亚洲成av人影院| 欧美电影免费观看高清完整版在线观看 | 日韩精品电影一区亚洲| 欧美不卡123| 国产成人精品三级麻豆| 国产精品久久久久久久久动漫 | 成人精品视频一区二区三区| 国产亚洲一区二区三区四区| www.性欧美| 亚洲精品免费视频| 日韩欧美精品在线视频| 国产精品一品二品| 亚洲最大成人网4388xx| 欧美日韩高清一区二区| 国产黄色精品视频| 一区二区三区**美女毛片| 欧美一级搡bbbb搡bbbb| 国产成人综合亚洲网站| 亚洲综合一区二区三区| 欧美xfplay| 色综合久久天天| 久久爱另类一区二区小说| 国产精品高清亚洲| 欧美一区午夜视频在线观看| 粉嫩一区二区三区在线看| 亚洲国产综合色| 久久久久国产精品麻豆ai换脸| 色综合久久久久久久久| 久久成人18免费观看| 一区二区高清视频在线观看| 日韩精品一区二区三区中文精品| 99久久精品免费看| 免费成人av资源网| 亚洲自拍偷拍网站| 国产精品久久久久aaaa樱花| 欧美一区二区三区在线电影| 91天堂素人约啪| 国产精品一区二区你懂的| 午夜欧美电影在线观看| 日韩美女视频一区二区| 精品国产a毛片| 欧美美女激情18p| 欧美韩日一区二区三区四区| 欧美成人欧美edvon| 在线精品视频小说1| 国产精品1区2区| 美女在线观看视频一区二区| 亚洲情趣在线观看| 中文天堂在线一区| 久久亚洲综合色| 69堂成人精品免费视频| 色美美综合视频| 97se亚洲国产综合自在线| 成人综合婷婷国产精品久久蜜臀| 久久99久久99精品免视看婷婷| 亚洲国产日韩在线一区模特| 亚洲婷婷综合色高清在线| 国产女人18毛片水真多成人如厕| 欧美电视剧在线看免费| 欧美一区二区女人| 欧美精品自拍偷拍动漫精品| 欧美日韩亚洲丝袜制服| 欧美日韩亚洲综合一区二区三区| 91浏览器打开| 91农村精品一区二区在线| 成人精品视频网站| 成人h动漫精品一区二| 粉嫩蜜臀av国产精品网站| 国产大陆精品国产| www.66久久| 91蜜桃在线免费视频| 色综合天天在线| 在线免费精品视频| 欧美日本一道本在线视频| 欧美肥妇free| 水野朝阳av一区二区三区| 亚洲国产欧美另类丝袜| 亚洲国产精品一区二区久久恐怖片| 亚洲美女电影在线| 亚洲国产美女搞黄色| 午夜电影网亚洲视频| 秋霞午夜av一区二区三区| 久久国产精品第一页| 国产综合一区二区| 丁香六月综合激情| 欧美性大战久久久| 欧美成人性福生活免费看| 国产欧美精品一区二区色综合 | 99re亚洲国产精品| 91色porny| 在线成人午夜影院| 久久久综合视频| 亚洲精品网站在线观看| 天堂在线一区二区| 国产麻豆91精品| 色婷婷综合久色| 日韩一区二区在线观看视频播放| 国产偷国产偷亚洲高清人白洁| 亚洲人成7777| 美女任你摸久久| 一本到不卡精品视频在线观看| 欧美剧在线免费观看网站| 国产肉丝袜一区二区| 一区二区三区日韩精品视频| 国内久久婷婷综合| 在线视频观看一区| 久久久久国产精品麻豆| 亚洲国产精品一区二区久久 | 欧美中文字幕一区二区三区亚洲| 欧美精品久久99| 国产精品乱码妇女bbbb| 亚洲国产精品视频| 成人动漫一区二区| 欧美一级午夜免费电影| 亚洲欧洲av另类| 狠狠色丁香九九婷婷综合五月| 91免费精品国自产拍在线不卡| 亚洲精品在线观看网站| 一区二区高清免费观看影视大全| 国产iv一区二区三区| 欧美女孩性生活视频| 国产精品第13页| 国产又黄又大久久| 欧美一区二区三区四区视频| 中文字幕精品一区二区精品绿巨人| 日韩国产精品91| 欧美日免费三级在线| 国产精品看片你懂得 | 日日夜夜免费精品| 99re热这里只有精品视频| 久久久99精品免费观看| 午夜天堂影视香蕉久久| 91亚洲精品乱码久久久久久蜜桃| 欧美大片在线观看| 欧美性猛交xxxxxxxx| 国产精品久久久久久久久动漫 | 国产三级欧美三级日产三级99| 天天射综合影视| 色婷婷精品久久二区二区蜜臀av| 欧美激情一区二区三区在线| 国产一区二区女| 精品国产一区二区亚洲人成毛片| 五月天激情综合| 欧美日韩一区小说| 亚洲成av人片在www色猫咪| 色乱码一区二区三区88| 亚洲欧洲另类国产综合| 99久久国产免费看| 亚洲视频中文字幕| 成+人+亚洲+综合天堂| 中文字幕精品在线不卡| 不卡一卡二卡三乱码免费网站| 久久久电影一区二区三区| 国产成人免费在线视频|