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

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

?? des.cpp

?? des加密算法 des加密算法 des加密算法 解密
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
 #include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define BYTE   unsigned char
#define LPBYTE   BYTE* 
#define LPCBYTE   const BYTE* 
#define BOOL   int 


class DES 
{ 
public: 
	BOOL CDesEnter(LPCBYTE in, LPBYTE out, int datalen, const BYTE key[8], BOOL type);
	BOOL CDesMac(LPCBYTE mac_data, LPBYTE mac_code, int datalen, const BYTE key[8]);  
	LPBYTE Bin2ASCII(const BYTE byte[64], BYTE bit[8]);  
	LPBYTE ASCII2Bin(const BYTE bit[8], BYTE byte[64]);  
private: 
	int i;
	void XOR(const BYTE in1[8], const BYTE in2[8], BYTE out[8]);  
	void GenSubKey(const BYTE oldkey[8], BYTE newkey[16][8]); 
	void endes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]);  
	void undes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]);   
	void SReplace(BYTE s_bit[8]);
}des; 

/*   
*   CDesEnter 函數(shù)說明:
*     des加密/解密入口 
*   返回:
*     1則成功,0失敗 
*   參數(shù): 
*     in 需要加密或解密的數(shù)據(jù)
*         注意:in緩沖區(qū)的大小必須和datalen相同. 
*     out 加密后或解密后輸出。
*         注意:out緩沖區(qū)大小必須是8的倍數(shù)而且比datalen大或者相等。 
*         如datalen=7,out緩沖區(qū)的大小應該是8,datalen=8,out緩沖區(qū)的大小應該是8,
*         datalen=9,out緩沖區(qū)的大小應該是16,依此類推。  
*     datalen 數(shù)據(jù)長度(字節(jié))。 
*         注意:datalen 必須是8的倍數(shù)。 
*     key 8個字節(jié)的加密或解密的密碼。
*     type 是對數(shù)據(jù)進行加密還是解密 
*         0 表示加密 1 表示解密 
*/
BOOL DES::CDesEnter(LPCBYTE in, LPBYTE out, int datalen, const BYTE key[8], BOOL type)
{ 
	//判斷輸入?yún)?shù)是否正確,失敗的情況為: 
	//!in: in指針(輸入緩沖)無效 
	//!out: out指針(輸出緩沖)無效
	//datalen<1: 數(shù)據(jù)長度不正確 
	//!key: 加/解密密碼無效
	//type && ((datalen % 8) !=0:選擇解密方式但是輸入密文不為8的倍數(shù) 
	if((!in) || (!out) || (datalen<1) || (!key) || (type && ((datalen % 8) !=0))) 
		return false; 

	int i;
	if(type==0) //選擇的模式是加密 
	{ 
		// 用于存儲待加密字串最后的若干字節(jié) 
		// DES算法是以8個字節(jié)為單位進行加密,如果待加密字串以8為單位分段加密時,最后一段不足
		//8字節(jié),則在后面補0,使其最后一段的長度為8字節(jié) 
		// te8bit是作為存儲待加密字串最后一段(不足8字節(jié))的變量 
		BYTE te8bit[8]={0,0,0,0,0,0,0,0}; 

		// 這是待加密字串的調(diào)整長度 
		// 如果原始長度是8的整數(shù)倍,則調(diào)整長度的值和原來的長度一樣 
		// 如果原始長度不是8的整數(shù)倍,則調(diào)整長度的值是能被8整除且不大于原來長度的最大整數(shù)。   
		//也就是不需要補齊的塊的總長度。 
		int te_fixlen = datalen - (datalen % 8); 

		// 將待加密密文以8為單位分段,把最后長度不足8的一段存儲到te8bit中。
		for(i = 0; i < (datalen % 8); i++)
			te8bit[i] = in[te_fixlen + i];
		// 將待加密字串分以8字節(jié)為單位分段加密
		for(i = 0; i < te_fixlen; i += 8) 
			endes(in + i, key, out + i);

		// 如果待加密字串不是8的整數(shù)倍,則將最后一段補齊(補0)后加密
		if(datalen % 8 != 0)
			endes(te8bit, key, out + datalen / 8 * 8); 
	}  
	else   //選擇的模式是解密 
	{ 
		// 將密文以8字節(jié)為單位分段解密 
		for(int i = 0; i < datalen; i += 8) 
			undes(in + i, key, out + i); 
	}
	return true;
} 

/* 
*   XOR 函數(shù)說明: 
*     將輸入的兩個8字節(jié)字符串異或 
*   返回:
*     無 
*   參數(shù):
*     const BYTE in1[8] 輸入字符串1 
*     const BYTE in2[8] 輸入字符串2 
*     BYTE out[8] 輸出的結果字符串     
*/
void DES::XOR(const BYTE in1[8], const BYTE in2[8], BYTE out[8]) 
{
	for(int i = 0; i < 8; i++) 
		out[i] = in1[i] ^ in2[i]; 
}

/* 
*   Bin2ASCII 函數(shù)說明:
*     將64字節(jié)的01字符串轉換成對應的8個字節(jié)
*   返回: 
*     轉換后結果的指針 
*   參數(shù): 
*     const BYTE byte[64] 輸入字符串 
*     BYTE bit[8] 輸出的轉換結果     
*/
LPBYTE DES::Bin2ASCII(const BYTE byte[64], BYTE bit[8])
{ 
	for(int i = 0; i < 8; i++) 
	{
		bit[i] = byte[i * 8] * 128 + byte[i * 8 + 1] * 64 + 
			byte[i * 8 + 2] * 32 + byte[i * 8 + 3] * 16 + 
			byte[i * 8 + 4] * 8 + byte[i * 8 + 5] * 4 + 
			byte[i * 8 + 6] * 2 + byte[i * 8 + 7];
	} 
	return bit; 
} 

/* 
*   ASCII2Bin 函數(shù)說明:
*     將8個字節(jié)輸入轉換成對應的64字節(jié)的01字符串
*   返回: 
*     轉換后結果的指針 
*   參數(shù):
*     const BYTE bit[8] 輸入字符串 
*     BYTE byte[64] 輸出的轉換結果     
*/ 
LPBYTE DES::ASCII2Bin(const BYTE bit[8], BYTE byte[64])
{ 
	for(int i=0; i < 8; i++) 
		for(int j = 0; j < 8; j++) 
			byte[i * 8 + j] = ( bit[i] >> (7 - j) ) & 0x01; 
	return byte; 
} 

/* 
*   GenSubKey 函數(shù)說明:
*     由輸入的密鑰得到16個子密鑰 
*   返回: 
*     無 
*   參數(shù): 
*     const BYTE oldkey[8] 輸入密鑰
*     BYTE newkey[16][8] 輸出的子密鑰
*/ 
void DES::GenSubKey(const BYTE oldkey[8], BYTE newkey[16][8]) 
{ 
	int i, k, rol = 0;
	//縮小換位表1 
	int pc_1[56] = {57,49,41,33,25,17,9, 
		1,58,50,42,34,26,18, 
		10,2,59,51,43,35,27, 
		19,11,3,60,52,44,36, 
		63,55,47,39,31,23,15,
		7,62,54,46,38,30,22,  
		14,6,61,53,45,37,29,  
		21,13,5,28,20,12,4}; 
	//縮小換位表2
	int pc_2[48] = {14,17,11,24,1,5, 
		3,28,15,6,21,10, 
		23,19,12,4,26,8,   
		16,7,27,20,13,2,
		41,52,31,37,47,55,
		30,40,51,45,33,48,
		44,49,39,56,34,53,
		46,42,50,36,29,32}; 
	//16次循環(huán)左移對應的左移位數(shù) 
	int ccmovebit[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};

	BYTE oldkey_byte[64]; 
	BYTE oldkey_byte1[64];
	BYTE oldkey_byte2[64]; 
	BYTE oldkey_c[56];
	BYTE oldkey_d[56]; 
	BYTE newkey_byte[16][64];

	ASCII2Bin(oldkey, oldkey_byte); 

	//位變換 
	for(i = 0; i < 56; i++)
		oldkey_byte1[i] = oldkey_byte[pc_1[i] - 1];
	//分為左右兩部分,復制一遍以便于循環(huán)左移
	for(i = 0; i < 28; i++)
		oldkey_c[i] = oldkey_byte1[i], oldkey_c[i + 28] = oldkey_byte1[i], 
		oldkey_d[i] = oldkey_byte1[i + 28], oldkey_d[i + 28] = oldkey_byte1[i + 28]; 

	//分別生成16個子密鑰 
	for(i = 0; i < 16; i++) 
	{
		//循環(huán)左移 
		rol += ccmovebit[i];
		//合并左移后的結果 
		for(k = 0; k < 28; k++) 
			oldkey_byte2[k] = oldkey_c[k + rol], oldkey_byte2[k + 28] = oldkey_d[k + rol]; 
		//位變換 
		for(k = 0; k < 48; k++) 
			newkey_byte[i][k] = oldkey_byte2[pc_2[k] - 1]; 

	}   
	//生成最終結果 
	for(i = 0; i < 16; i++) 
		Bin2ASCII(newkey_byte[i], newkey[i]);
}

/* 
*   endes 函數(shù)說明: 
*     DES加密 
*   返回: 
*     無
*   參數(shù): 
*     const BYTE m_bit[8] 輸入的原文
*     const BYTE k_bit[8] 輸入的密鑰
*     BYTE e_bit[8] 輸出的密文 
*/  
void DES::endes(const BYTE m_bit[8], const BYTE k_bit[8], BYTE e_bit[8]) 
{ 
	//換位表IP
	int ip[64] = {
		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
	}; 
	//換位表IP_1
	int ip_1[64] = {
		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 
	}; 
	//放大換位表 
	int e[48] = {
		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 
	}; 
	BYTE m_bit1[8] = {0};
	BYTE m_byte[64] = {0}; 
	BYTE m_byte1[64] = {0}; 
	BYTE key_n[16][8] = {0};
	BYTE l_bit[17][8] = {0}; 
	BYTE r_bit[17][8] = {0};
	BYTE e_byte[64] = {0};
	BYTE e_byte1[64] = {0}; 
	BYTE r_byte[64] = {0};
	BYTE r_byte1[64] = {0};
	int i, j; 

	//根據(jù)密鑰生成16個子密鑰 
	GenSubKey(k_bit, key_n); 
	//將待加密字串變換成01串
	ASCII2Bin(m_bit, m_byte);
	//按照ip表對待加密字串進行位變換
	for(i = 0; i < 64; i++)
		m_byte1[i] = m_byte[ip[i] - 1];
	//位變換后的待加密字串
	Bin2ASCII(m_byte1, m_bit1); 
	//將位變換后的待加密字串分成兩組,分別為前4字節(jié)L和后4字節(jié)R,作為迭代的基礎(第0次迭代) 
	for(i=0;i<4;i++)
		l_bit[0][i] = m_bit1[i], r_bit[0][i] = m_bit1[i + 4]; 
	//16次迭代運算 
	for(i = 1; i <= 16; i++) 
	{
		//R的上一次的迭代結果作為L的當前次迭代結果 
		for(j = 0; j < 4; j++) 
			l_bit[i][j] = r_bit[i-1][j]; 
		ASCII2Bin(r_bit[i-1], r_byte); 
		//將R的上一次迭代結果按E表進行位擴展得到48位中間結果
		for(j = 0; j < 48; j++)
			r_byte1[j] = r_byte[e[j] - 1]; 
		Bin2ASCII(r_byte1, r_bit[i-1]);

		//與第I-1個子密鑰進行異或運算 
		for(j = 0; j < 6; j++) 
		{
			r_bit[i-1][j] = r_bit[i-1][j] ^ key_n[i-1][j]; 
		}

		//進行S選擇,得到32位中間結果 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲日产国产综合网| 欧美久久久久久蜜桃| 国产亚洲欧美日韩日本| 韩国在线一区二区| 中文字幕免费不卡在线| 91久久香蕉国产日韩欧美9色| 悠悠色在线精品| 制服丝袜av成人在线看| 国产一区二区看久久| 国产精品灌醉下药二区| 在线免费观看日本欧美| 美国欧美日韩国产在线播放| 日本一区二区三级电影在线观看 | 国产日韩精品一区二区三区在线| 国产精品69久久久久水密桃| 亚洲视频图片小说| 欧美日本免费一区二区三区| 国产一区999| 亚洲美女一区二区三区| 欧美肥妇bbw| 成人丝袜视频网| 偷拍日韩校园综合在线| 久久久久久久久久久久久夜| 色94色欧美sute亚洲线路一久| 日韩二区三区四区| 亚洲国产精华液网站w| 欧美日韩综合色| 国产精品一品二品| 亚洲无线码一区二区三区| 久久综合久久久久88| 色婷婷综合久久久久中文一区二区 | 亚洲综合免费观看高清在线观看| 7777精品伊人久久久大香线蕉超级流畅| 国产一区二区三区电影在线观看 | 国产亚洲欧美一区在线观看| 在线一区二区三区| 国产另类ts人妖一区二区| 亚洲成va人在线观看| 久久久久9999亚洲精品| 欧美日韩亚洲综合| 丁香激情综合国产| 久久精品噜噜噜成人av农村| 亚洲精品免费在线观看| 国产婷婷色一区二区三区四区| 欧美日韩激情一区| 91小视频免费观看| 国产成人小视频| 免费成人深夜小野草| 一区二区三区**美女毛片| 久久久99精品免费观看不卡| 欧美一区二区三区成人| 色婷婷综合激情| 成+人+亚洲+综合天堂| 精品一区二区在线免费观看| 午夜在线电影亚洲一区| 亚洲综合视频网| 亚洲人精品一区| 国产精品毛片大码女人| 国产日韩一级二级三级| 精品欧美乱码久久久久久| 91精品国产综合久久久久久漫画| 日本福利一区二区| 色欧美日韩亚洲| 91丨porny丨国产| 99re成人精品视频| 成人午夜激情片| 国产a精品视频| 国产精品综合久久| 激情av综合网| 国产精品亚洲一区二区三区妖精| 紧缚奴在线一区二区三区| 另类专区欧美蜜桃臀第一页| 青青青爽久久午夜综合久久午夜| 三级精品在线观看| 日韩av网站免费在线| 免费一区二区视频| 麻豆精品蜜桃视频网站| 久久国产精品99精品国产| 麻豆成人综合网| 久久精品国产精品青草| 琪琪久久久久日韩精品| 九九视频精品免费| 精品亚洲porn| 成人综合在线观看| 成人h动漫精品一区二区| 99国产精品久久久久久久久久 | 亚洲精品国产a久久久久久| 亚洲免费视频成人| 一区二区三区高清| 婷婷国产在线综合| 久久丁香综合五月国产三级网站| 精品一区二区av| 国内成人自拍视频| av在线不卡免费看| 欧亚一区二区三区| 日韩一区二区影院| 国产婷婷精品av在线| 1024亚洲合集| 午夜国产不卡在线观看视频| 黄一区二区三区| 成人av免费在线播放| 欧美丝袜自拍制服另类| 日韩一区二区精品葵司在线| 国产欧美一区二区三区在线看蜜臀| 国产精品成人网| 午夜欧美电影在线观看| 国产精品综合一区二区| 色中色一区二区| 日韩一区二区三免费高清| 国产女人18毛片水真多成人如厕| 亚洲激情中文1区| 毛片基地黄久久久久久天堂| 国产91精品一区二区| 欧美午夜寂寞影院| 久久精品人人做人人爽人人 | 亚洲午夜激情av| 国产真实乱对白精彩久久| 一本大道av一区二区在线播放| 日韩一区二区视频| 亚洲欧美日韩精品久久久久| 美女视频免费一区| 97精品超碰一区二区三区| 欧美一区二区在线看| 国产精品久久久久久福利一牛影视| 亚洲电影一级片| 成人精品高清在线| 欧美mv日韩mv亚洲| 一区二区免费看| 福利一区二区在线| 日韩欧美国产小视频| 亚洲精品久久久蜜桃| 国产一区欧美日韩| 欧美人牲a欧美精品| 亚洲你懂的在线视频| 国产成人亚洲综合a∨婷婷图片 | 精品99999| 亚洲一区在线视频观看| 成人精品在线视频观看| 久久综合色综合88| 三级成人在线视频| 欧美日韩日本视频| 亚洲激情图片一区| 成人三级伦理片| 国产午夜一区二区三区| 美女视频网站久久| 欧美一区二区三区在线电影 | 国产精品少妇自拍| 狠狠网亚洲精品| 日韩欧美精品三级| 视频在线在亚洲| 欧美日韩一区二区三区四区| 日韩美女视频一区二区| 不卡的av电影| 国产欧美日韩在线看| 国产一区二区网址| 精品国内二区三区| 国产主播一区二区| 精品国产一区二区三区av性色| 日韩精品福利网| 欧美一区二区三区婷婷月色| 亚洲123区在线观看| 欧美日韩电影一区| 亚洲国产综合人成综合网站| 91成人免费在线| 亚洲综合激情小说| 欧美日韩国产系列| 日韩在线观看一区二区| 91麻豆精品国产自产在线| 午夜av电影一区| 欧美一区二区视频在线观看| 人禽交欧美网站| www精品美女久久久tv| 免费精品99久久国产综合精品| 日韩一区二区视频| 国产最新精品免费| 国产欧美日韩视频一区二区| 成人av小说网| 亚洲美女视频一区| 欧美精品一二三区| 经典三级在线一区| 国产精品美女久久福利网站| 91九色最新地址| 日韩精品一二三区| 26uuu国产电影一区二区| 国产美女精品在线| 亚洲欧洲日产国码二区| 欧美午夜精品一区二区三区| 日本aⅴ免费视频一区二区三区 | 国产精品久久99| 欧美丝袜丝交足nylons图片| 日日骚欧美日韩| 欧美精品一区二区三区视频| 国产成人自拍在线| 亚洲女同ⅹxx女同tv| 91精品在线麻豆| 国产1区2区3区精品美女| 亚洲欧洲中文日韩久久av乱码| 欧美在线色视频| 国内精品伊人久久久久av影院| 欧美国产日韩精品免费观看|