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

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

?? des.cpp

?? des加密算法 des加密算法 des加密算法 解密
?? CPP
字號:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
#include <memory.h>
#include <stdlib.h>

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned long long DDWORD;
typedef string Key;



class DES
{
public:
	DES(Key, bool);
	~DES() {}

	void Encrypt(BYTE[], int&);
	void Decrypt(BYTE[], int&);

private:
	
	static const int LEN = 8;
	static const int ROUND = 16;
	static const BYTE IP[64];
	static const BYTE IP_1[64];
	static const BYTE SBox[8][4][16];
	static const BYTE E[48];
	static const BYTE PBox[32];
	static const BYTE PC_1[56];
	static const BYTE PC_2[64];

	Key key;							
	DDWORD subkey[16];

	void SingleRound(DDWORD&, int);	//單輪結(jié)果

	DWORD SBoxS(DDWORD);				//S盒
	DWORD PBoxS( DWORD);				//P盒
	DDWORD Extend(DWORD);				//函數(shù)E擴展
	void StringToDDWORD(DDWORD&, BYTE[]);		//
	void SwapBits(DDWORD &in)	{in = ((in & 0xffffffff00000000ULL) >> 32) | ((in & 0x00000000ffffffffULL) << 32);}			//64位中32位互換
	void DDWORDToString(BYTE[], DDWORD);			//

	void KeyGenerator();

	void doIP(DDWORD&);				//初始置換
	void doIP_1(DDWORD&);				//初始逆置換
	void PC1(DDWORD&);					//密鑰生成的PC1

	DDWORD PC2(DDWORD);					//密鑰生成的PC2
	DDWORD GET(DDWORD x, int pos){return x & ((DDWORD)1 << pos);}			//取位
	DDWORD REV(DDWORD);					//反轉(zhuǎn)64位
};


DDWORD DES::REV(DDWORD x)
{
	x = ((x & 0x5555555555555555ULL) << 1 ) | ((x & 0xAAAAAAAAAAAAAAAAULL) >> 1 );
	x = ((x & 0x3333333333333333ULL) << 2 ) | ((x & 0xCCCCCCCCCCCCCCCCULL) >> 2 );
	x = ((x & 0x0F0F0F0F0F0F0F0FULL) << 4 ) | ((x & 0xF0F0F0F0F0F0F0F0ULL) >> 4 );
	x = ((x & 0x00FF00FF00FF00FFULL) << 8 ) | ((x & 0xFF00FF00FF00FF00ULL) >> 8 );
	x = ((x & 0x0000FFFF0000FFFFULL) << 16) | ((x & 0xFFFF0000FFFF0000ULL) >> 16);
	x = ((x & 0x00000000FFFFFFFFULL) << 32) | ((x & 0xFFFFFFFF00000000ULL) >> 32);
	return x;
}


void DES::Encrypt(BYTE m[], int& len)
{
	DDWORD ts;

	int addlen = 8 - (len % LEN);

	for(int i = 0; i < addlen; ++i)
		m[len++] = (BYTE) addlen;

	for(int i = 0; i < len; i += LEN)
	{
		StringToDDWORD(ts, m + i);
		doIP(ts);
		for(int j = 0; j < ROUND; ++j)
			SingleRound(ts, j);
		SwapBits(ts);
		doIP_1(ts);
		DDWORDToString(m + i, ts);
	}
}

void DES::Decrypt(BYTE e[], int &len)
{
	DDWORD ts;
	for(int i = 0; i < len; i += LEN)
	{
		StringToDDWORD(ts, e + i);
		doIP(ts);
		for(int j = ROUND - 1; j >= 0; --j)
			SingleRound(ts, j);
		SwapBits(ts);
		doIP_1(ts);
		DDWORDToString(e + i, ts);
	}
	
	len -= e[len - 1];

}


void DES::SingleRound(DDWORD & in, int r)
{
	DWORD L = (DWORD) ((in & 0xffffffff00000000ULL) >> 32), R = (DWORD) (in & 0x00000000ffffffffULL);
	DDWORD e;
	DWORD out;
	e =  Extend(R);
	e = e ^ subkey[r];	
	out = SBoxS(e);
	out = PBoxS(out);
	out ^= L;
	L = out;
	in = ((DDWORD)R << 32) | L;
}

void DES::doIP(DDWORD & in)
{
	DDWORD ret = 0L;
	for(int i = 0; i < 64; ++i)
	{
		ret <<= 1;
		ret |= (GET(in, IP[i] - 1) != 0);
	}
	in = ret;
}

void DES::doIP_1(DDWORD & in)
{
	DDWORD ret = 0L;
	for(int i = 0; i < 64; ++i)
	{
		ret <<= 1;
		ret |= (GET(in, IP_1[i] - 1) != 0);
	}
	in = ret;
}


DWORD DES::SBoxS(DDWORD in)
{
	DWORD ret = 0;
	BYTE res[8];
	for(int i = 0; i < 8; ++i, in >>= 6)
	{
		DWORD t1 = (DWORD) ((in & 0x1eULL) >> 1);
		DWORD c  = (DWORD) ((in & 0x01ULL) ^ ((in & 0x20ULL) >> 4));
		res[i] = SBox[i][c][t1];
		ret <<= 4;
		ret |= res[i] & 0x0f;
	}

	return ret;
}

DWORD DES::PBoxS( DWORD so)
{
	DWORD ret = 0;
	for(int i = 0; i < 32; ++i)
	{
		ret <<= 1;
		ret |= (GET((DDWORD)so, PBox[i] - 1) != 0);
	}
	return ret;
}

DDWORD DES::Extend(DWORD r)
{
	DDWORD ret = 0L;
	for(int i = 0; i < 48; ++i)
	{
		ret <<= 1;
		ret |= (GET((DDWORD)r, E[i] - 1) != 0);
	}
	return ret;
}

void DES::PC1(DDWORD & in)
{
	DDWORD ret = 0;
	for(int i = 0; i < 56; ++i)
	{
		ret <<= 1;
		ret |= (GET(in, PC_1[i] - 1) != 0L);
	}
	in = ret;
}

DDWORD DES::PC2(DDWORD in)
{
	DDWORD ret = 0L;
	for(int i = 0; i < 48; ++i)
	{
		ret <<= 1;
		ret |= (GET(in, PC_2[i] - 1) != 0L);
	}
	return ret;
}

void DES::StringToDDWORD(DDWORD & result, BYTE in[])
{
	DDWORD ret = 0L;
	for(int i = 0; i < LEN; ++i)
	{
		ret <<= 8;
		ret |= in[i];
	}
	result = ret;
}

void DES::DDWORDToString(BYTE out[], DDWORD in)
{
	DDWORD offset = 0xff00000000000000ULL;
	for(int i = 0; i < LEN; ++i, offset >>= 8)
		out[i] = (BYTE) ((in & offset) >> (56 - 8 * i));
}


const BYTE DES::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
};

const BYTE DES::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
};

const BYTE DES::SBox[8][4][16] = 
{
	{	//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}
	}
};

const BYTE DES::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
};

const BYTE DES::PBox[32] = 
{
	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
};

const BYTE DES::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
};


const BYTE DES::PC_2[64] = 
{
	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
};


DES::DES(Key k, bool mode = false)
{
	
	if(mode)
	{
		while(k.length() < 16) k.append("0");
		Key e = "";
		for(int i = 0, l = 0; i < 16; ++i)
		{
			l <<= 4;
			l += k[i] >= 'A' && k[i] <= 'Z' ? k[i] - 'A' + 10 : k[i] - '0';
			if(i % 2)
			{
				e += (unsigned char) l;
				l = 0;
			}
		}
		k = e;
	}
	else
	{
		while(k.length() < 8) k.append(" ");
	}
	key = k; 
	KeyGenerator();
}

void DES::KeyGenerator()
{
	DDWORD inkey = 0L;

	for(int i = 0; i < 8; ++i)
	{
		inkey <<= 8; 
		inkey ^= (DDWORD)key[i] & 0xff;
	}

	inkey = REV(inkey);
	PC1(inkey);

	const DDWORD of1 = 0x0fffffffULL, of2 = 0xfffffff0000000ULL;
	DDWORD afL[17];				//after left shift
	
	afL[0] = inkey;

	for(int i = 1; i <= 16; ++i)
	{
		if(i == 1 || i == 2 || i == 10 || i == 16)
		{
			DDWORD a1 = afL[i-1] & of1;
			DDWORD h1 = (afL[i-1] & 0x08000000ULL) >> 27;
			a1 = (a1 << 1) ^ h1;
			a1 &= of1;
			
			DDWORD a2 = afL[i-1] & of2;
			DDWORD h2 = (afL[i-1] & 0x80000000000000ULL) >> 27;
			a2 = (a2 << 1) ^ h2;
			a2 &= of2;

			afL[i] = 0L;
			afL[i] |= a2; 
			afL[i] |= a1;
		}
		else
		{
			DDWORD a1 = afL[i-1] & of1;
			DDWORD h1 = (afL[i-1] & 0x0C000000ULL) >> 26;
			a1 = (a1 << 2) ^ h1;
			a1 &= of1;
			
			DDWORD a2 = afL[i-1] & of2;
			DDWORD h2 = (afL[i-1] & 0xC0000000000000ULL) >> 26;
			a2 = (a2 << 2) ^ h2;
			a2 &= of2;

			afL[i] = 0L;
			afL[i] |= a2;
			afL[i] |= a1;
		}
	}

	for(int i = 0; i < 16; ++i)
		subkey[i] = PC2(REV(afL[i+1]) >> 8);
}

char encode(BYTE x)
{
	if(x >= 0 && x <= 9)
		return x + '0';
	return x + 'A' - 10;
}

string stringToHex(BYTE x[])
{
	string ret = "";
	for(int i = 0; i < 8; ++i)
	{
		ret += encode((x[i] >> 4) & 0x0f);
		ret += encode((x[i] & 0x0f));
	}
	return ret;
}

string byteToString(BYTE x[])
{
	string ret = "";
	for(int i = 0; i < 8; ++i)
	{
		ret += (char) x[i];
	}
	return ret;
}

int main()
{
	cout << "Input Key:";
	string key;
	int len = 8;
	BYTE ciphertext[16];
	cin >> key;
	cout << "Input PlainText:";
	for(int i = 0; i < 8; ++i)
	{
		char x;
		cin >> x;
		ciphertext[i] = (BYTE) x;
	}
	DES des(key, true);
	des.Encrypt(ciphertext, len);
	cout << "CipherText:" << stringToHex(ciphertext) << endl;
	des.Decrypt(ciphertext, len);
	cout << "Decryption:" << byteToString(ciphertext) << endl;
	return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品全国免费观看高清 | 欧美亚洲一区二区在线| jlzzjlzz亚洲日本少妇| 欧美日韩精品一区二区三区| 欧美精品一区二区久久久| 中文字幕免费一区| 另类中文字幕网| 国产91精品免费| 欧美日本国产视频| 中文字幕免费一区| 中文字幕亚洲欧美在线不卡| 日韩高清电影一区| 91久久精品一区二区二区| 欧美一区二区三区四区在线观看| 欧美激情综合五月色丁香小说| 日本成人在线电影网| 99久久精品情趣| 日韩欧美一区二区久久婷婷| 亚洲一区二区免费视频| 国产成人av电影在线观看| 91小视频在线观看| 欧美激情一区不卡| 久久国产精品区| 91久久精品一区二区三| 国产精品热久久久久夜色精品三区 | 成人欧美一区二区三区小说 | 国产精品丝袜一区| 国产精品自在欧美一区| 欧美精品少妇一区二区三区 | 久久久久国产成人精品亚洲午夜| 亚洲动漫第一页| 成人一区二区三区视频在线观看 | 成人小视频在线| 日韩一级精品视频在线观看| 日本 国产 欧美色综合| 日韩一级黄色大片| 麻豆精品视频在线观看视频| 日韩视频一区二区| 狠狠色2019综合网| 日韩一区二区在线观看视频| 美美哒免费高清在线观看视频一区二区| 91成人在线精品| 一区二区三区日韩| 欧美日韩亚洲综合| 午夜精品成人在线| 欧美精品一卡两卡| 美国十次综合导航| 欧美大片顶级少妇| 国产69精品久久99不卡| 国产欧美日韩视频一区二区| 日本午夜一区二区| 欧美大度的电影原声| 日本伊人精品一区二区三区观看方式| 欧美日韩国产成人在线免费| 日韩精品亚洲一区二区三区免费| 精品视频1区2区| 日本女人一区二区三区| 欧美激情在线观看视频免费| 风间由美中文字幕在线看视频国产欧美 | 欧美国产综合色视频| 成人黄色av电影| 亚洲成人av福利| 欧美一级高清片| 亚洲一区二区欧美| 欧美tickle裸体挠脚心vk| 狠狠久久亚洲欧美| 亚洲午夜日本在线观看| 7777精品久久久大香线蕉| 亚洲资源在线观看| 久久综合久久久久88| 99国产麻豆精品| 久久精品99久久久| 国产精品久久久久久亚洲毛片| 91片黄在线观看| 久久97超碰色| 国产精品久久久久久久久免费樱桃 | 精品久久久久久久久久久久久久久| 亚洲美女少妇撒尿| 精品国产不卡一区二区三区| 成人永久免费视频| 蓝色福利精品导航| 亚洲图片另类小说| 欧美精品一卡两卡| 色就色 综合激情| 韩国欧美一区二区| 亚洲国产日韩a在线播放| wwww国产精品欧美| 91麻豆免费看片| 国产福利不卡视频| 午夜视频在线观看一区二区| 97久久超碰精品国产| 国产一区在线视频| 亚洲一区二区三区视频在线播放| 国产欧美一区二区三区在线老狼| 一本久久a久久精品亚洲| 精品制服美女丁香| 亚洲品质自拍视频| 精品福利av导航| 欧美日韩国产区一| 色综合一区二区三区| 国内精品自线一区二区三区视频| 国产精品不卡一区| 亚洲精品一区二区三区在线观看 | 日韩免费看的电影| 欧美日韩国产精选| 色综合欧美在线视频区| 国产精品一级黄| 狠狠狠色丁香婷婷综合激情| 偷窥少妇高潮呻吟av久久免费| 亚洲精品国产一区二区精华液| 久久久久国产一区二区三区四区| 99国产欧美另类久久久精品| av亚洲精华国产精华精华| 久久精品免费观看| 日本女优在线视频一区二区| 午夜精品久久久久久不卡8050| 亚洲视频免费观看| 国产精品视频在线看| 日韩一卡二卡三卡四卡| 欧美午夜片在线看| 一本久久a久久精品亚洲| 91久久精品一区二区三| 色综合久久久久网| fc2成人免费人成在线观看播放 | 欧美欧美欧美欧美| 在线不卡免费欧美| 欧美精品一卡二卡| 欧美丰满一区二区免费视频| 欧美色涩在线第一页| 欧美中文字幕一二三区视频| 色综合亚洲欧洲| 欧美午夜精品一区二区三区| 日本道免费精品一区二区三区| 欧洲另类一二三四区| 色8久久人人97超碰香蕉987| 91福利在线观看| 欧美日韩一级片网站| 91精品国产色综合久久ai换脸 | 国产成人av电影在线播放| 国产suv精品一区二区883| 成+人+亚洲+综合天堂| 国产成+人+日韩+欧美+亚洲| 色婷婷精品大在线视频| 欧美三级视频在线| 欧美精品在线视频| 欧美国产日韩在线观看| 国产精品高潮呻吟久久| 一区二区三区精品| 日本v片在线高清不卡在线观看| 国产日韩欧美精品在线| 一区二区成人在线| 日本中文一区二区三区| 成人高清免费观看| 色天天综合久久久久综合片| 欧美一区三区二区| 久久久精品黄色| 亚洲色图视频网| 老司机一区二区| 99热在这里有精品免费| 欧美大片免费久久精品三p| 中文字幕精品在线不卡| 免费精品视频最新在线| 波多野结衣欧美| 91美女蜜桃在线| 久久久美女艺术照精彩视频福利播放| 日韩一区有码在线| 国产乱淫av一区二区三区| 色综合久久久久综合体桃花网| 欧美成va人片在线观看| 亚洲视频一区二区在线| 理论电影国产精品| 欧美色涩在线第一页| 久久―日本道色综合久久 | 国产欧美日韩中文久久| 亚洲欧美日韩久久| 国产精品资源在线| 欧美手机在线视频| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 亚洲一区二区精品视频| gogo大胆日本视频一区| 欧美成人激情免费网| 成人欧美一区二区三区黑人麻豆| 久久99久久久欧美国产| 91国偷自产一区二区使用方法| 日本一区二区视频在线观看| 三级亚洲高清视频| 91国产精品成人| 日本一区二区不卡视频| 午夜激情久久久| 在线欧美日韩国产| 国产精品麻豆视频| 成人精品视频一区二区三区尤物| 91麻豆精品国产91久久久久| 午夜影院久久久| 99国产精品久久| 91女厕偷拍女厕偷拍高清| 中文字幕欧美国产| 国产在线精品一区在线观看麻豆| 日韩一区二区三区视频在线| 亚洲一二三级电影|