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

📄 des.cpp

📁 应用编码与计算机密码学>程序 如果好的话请发言
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//des.cpp
//Update:2003.4.15
#include "des.h"

#define S_Box_Substitude \
	dword |= S_Box[expword[0]];\
	dword |= S_Box[64 + expword[1]];\
	dword |= S_Box[128 + expword[2]];\
	dword |= S_Box[192 + expword[3]];\
	dword |= S_Box[256 + expword[4]];\
	dword |= S_Box[320 + expword[5]];\
	dword |= S_Box[384 + expword[6]];\
	dword |= S_Box[448 + expword[7]];\

const static int RotateLIndex[16] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};
const static int RotateRIndex[16] = {0, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1};	

const static unsigned long Origin_S_Box[512] = 
	{
		0x808002, 0x808200, 0x808200, 0x800002, 
		 0x0, 0x202, 0x202, 0x800200, 
		 0x800200, 0x0, 0x8000, 0x8202, 
		 0x8202, 0x808002, 0x800002, 0x8000, 
		 0x800202, 0x800000, 0x800000, 0x8002, 
		 0x808000, 0x8200, 0x8200, 0x808202, 
		 0x2, 0x800202, 0x808202, 0x808000, 
		 0x200, 0x2, 0x8002, 0x200, 
		 0x800000, 0x2, 0x200, 0x8000, 
		 0x800202, 0x808200, 0x808002, 0x8202, 
		 0x8000, 0x800202, 0x2, 0x808002, 
		 0x808200, 0x800000, 0x8202, 0x200, 
		 0x8002, 0x8200, 0x808202, 0x202, 
		 0x0, 0x8002, 0x202, 0x800200, 
		 0x800200, 0x808000, 0x8200, 0x0, 
		 0x800002, 0x808202, 0x808000, 0x800002, 

		0x40084010, 0x84000, 0x80000, 0x40080010, 
		 0x40004000, 0x4010, 0x40080010, 0x80000, 
		 0x10, 0x40000000, 0x40000000, 0x10, 
		 0x84000, 0x40084010, 0x4010, 0x40004000, 
		 0x0, 0x40080000, 0x40084000, 0x40004010, 
		 0x40080000, 0x40000010, 0x4000, 0x84010, 
		 0x84010, 0x4000, 0x40004010, 0x40084000, 
		 0x40000010, 0x80010, 0x80010, 0x0, 
		 0x40000010, 0x40080000, 0x40084010, 0x4010, 
		 0x84000, 0x40004000, 0x4010, 0x40084010, 
		 0x40004000, 0x80010, 0x80010, 0x84000, 
		 0x40080000, 0x0, 0x0, 0x40000010, 
		 0x84010, 0x4000, 0x80000, 0x40000000, 
		 0x10, 0x80000, 0x40084000, 0x10, 
		 0x40080010, 0x40084000, 0x40000000, 0x40080010, 
		 0x4000, 0x40004010, 0x40004010, 0x84010, 

		0x4010100, 0x10004, 0x4000004, 0x4010000, 
		 0x4000104, 0x100, 0x4010000, 0x100, 
		 0x10104, 0x4010100, 0x100, 0x10104, 
		 0x0, 0x4000004, 0x10004, 0x0, 
		 0x10000, 0x4000100, 0x4010104, 0x4, 
		 0x4000000, 0x10000, 0x10100, 0x4000000, 
		 0x4010004, 0x104, 0x4, 0x4010004, 
		 0x104, 0x4010104, 0x4000100, 0x10100, 
		 0x10000, 0x4000000, 0x4010100, 0x4000104, 
		 0x4000000, 0x4010004, 0x4000104, 0x4, 
		 0x4010004, 0x100, 0x4, 0x4010100, 
		 0x10104, 0x10000, 0x4000104, 0x10104, 
		 0x4010104, 0x10004, 0x104, 0x10100, 
		 0x10100, 0x104, 0x4000004, 0x4010104, 
		 0x4000100, 0x4000004, 0x4010000, 0x0, 
		 0x0, 0x4000100, 0x10004, 0x4010000, 

		0x80000040, 0x400040, 0x0, 0x80401000, 
		 0x80401000, 0x80000040, 0x80400040, 0x1040, 
		 0x1040, 0x80001000, 0x80001000, 0x0, 
		 0x400040, 0x401000, 0x401000, 0x80400040, 
		 0x80401040, 0x80400000, 0x80400000, 0x401040, 
		 0x80000000, 0x1000, 0x401040, 0x400000, 
		 0x400000, 0x40, 0x40, 0x80001040, 
		 0x1000, 0x80401040, 0x80001040, 0x80000000, 
		 0x80001000, 0x80400000, 0x400040, 0x80000040, 
		 0x1040, 0x80401040, 0x401000, 0x0, 
		 0x0, 0x401000, 0x80401040, 0x400040, 
		 0x80400000, 0x80001000, 0x80000040, 0x1040, 
		 0x40, 0x401040, 0x80001040, 0x400000, 
		 0x80400040, 0x80000000, 0x80000000, 0x80401000, 
		 0x80401000, 0x80001040, 0x400000, 0x1000, 
		 0x401040, 0x40, 0x1000, 0x80400040, 

		0x20040000, 0x21040080, 0x21040080, 0x0, 
		 0x21000000, 0x1000080, 0x1000080, 0x21000000, 
		 0x0, 0x20000080, 0x20000080, 0x20040000, 
		 0x1040080, 0x40000, 0x40000, 0x1040080, 
		 0x80, 0x1000000, 0x1040000, 0x21000080, 
		 0x20040080, 0x20000000, 0x20000000, 0x20040080, 
		 0x21040000, 0x40080, 0x40080, 0x1040000, 
		 0x1000000, 0x21040000, 0x21000080, 0x80, 
		 0x40080, 0x1040000, 0x21000000, 0x20040000, 
		 0x20000080, 0x0, 0x21040080, 0x40080, 
		 0x20040000, 0x21040080, 0x1040000, 0x1000080, 
		 0x0, 0x21000000, 0x1000080, 0x20000080, 
		 0x1000000, 0x20040080, 0x20040080, 0x80, 
		 0x21040000, 0x1040080, 0x40000, 0x21000080, 
		 0x80, 0x1000000, 0x21000080, 0x20000000, 
		 0x1040080, 0x40000, 0x20000000, 0x21040000, 

		0x8, 0x10002008, 0x202000, 0x0, 
		 0x202008, 0x10200000, 0x10200000, 0x10002000, 
		 0x10002000, 0x8, 0x0, 0x202000, 
		 0x10200008, 0x202008, 0x10002008, 0x10200008, 
		 0x10202008, 0x2000, 0x2008, 0x10202008, 
		 0x10000008, 0x200008, 0x200008, 0x10000008, 
		 0x200000, 0x10000000, 0x10202000, 0x2008, 
		 0x2000, 0x10202000, 0x10000000, 0x200000, 
		 0x10200008, 0x2000, 0x10002008, 0x202008, 
		 0x10202000, 0x8, 0x8, 0x10200008, 
		 0x200000, 0x10202000, 0x202008, 0x10000000, 
		 0x2000, 0x10002008, 0x10000000, 0x200000, 
		 0x10002000, 0x10200000, 0x10200000, 0x10000008, 
		 0x2008, 0x202000, 0x202000, 0x2008, 
		 0x10202008, 0x200008, 0x0, 0x10202008, 
		 0x10000008, 0x0, 0x200008, 0x10002000, 

		0x100000, 0x400, 0x401, 0x100001, 
		 0x2100401, 0x2000001, 0x100001, 0x100400, 
		 0x400, 0x2100401, 0x2000001, 0x401, 
		 0x2000000, 0x100000, 0x100400, 0x2000000, 
		 0x2000401, 0x2100000, 0x2100000, 0x2000401, 
		 0x0, 0x2000400, 0x2000400, 0x0, 
		 0x2100400, 0x1, 0x100401, 0x2100400, 
		 0x2100001, 0x100401, 0x1, 0x2100001, 
		 0x401, 0x100001, 0x2100401, 0x100400, 
		 0x100400, 0x2000400, 0x0, 0x2000001, 
		 0x2100000, 0x0, 0x2000400, 0x2100000, 
		 0x100001, 0x401, 0x2000001, 0x2100401, 
		 0x2000000, 0x400, 0x1, 0x2100001, 
		 0x2000401, 0x100000, 0x2100001, 0x100000, 
		 0x100401, 0x2100400, 0x100000, 0x2000401, 
		 0x2100400, 0x2000000, 0x400, 0x1, 

		0x8000820, 0x20, 0x8020000, 0x8000820, 
		 0x0, 0x8020020, 0x20820, 0x0, 
		 0x20800, 0x8000800, 0x8000800, 0x20800, 
		 0x8020020, 0x8020800, 0x20, 0x8020000, 
		 0x20000, 0x800, 0x8020820, 0x8000000, 
		 0x8000020, 0x20000, 0x800, 0x8020800, 
		 0x820, 0x8020820, 0x20020, 0x820, 
		 0x8020800, 0x8000020, 0x8000000, 0x20020, 
		 0x20000, 0x8000000, 0x20820, 0x8020800, 
		 0x8000820, 0x20820, 0x800, 0x8020020, 
		 0x20, 0x20000, 0x8020020, 0x20, 
		 0x20820, 0x8000820, 0x8000000, 0x800, 
		 0x8020820, 0x20020, 0x8000020, 0x820, 
		 0x20020, 0x8000800, 0x8020000, 0x0, 
		 0x8000800, 0x8000020, 0x820, 0x8020820, 
		 0x0, 0x20800, 0x20800, 0x8020000
	};

const unsigned long Key_Relative_S_Box[512] = 
	{
		0x808202, 0x800002, 0x800000, 0x808200, 
		 0x202, 0x8002, 0x808200, 0x800000, 
		 0x8000, 0x200, 0x200, 0x8000, 
		 0x800002, 0x808202, 0x8002, 0x202, 
		 0x0, 0x800200, 0x800202, 0x8202, 
		 0x800200, 0x8200, 0x2, 0x808002, 
		 0x808002, 0x2, 0x8202, 0x800202, 
		 0x8200, 0x808000, 0x808000, 0x0, 
		 0x8200, 0x800200, 0x808202, 0x8002, 
		 0x800002, 0x202, 0x8002, 0x808202, 
		 0x202, 0x808000, 0x808000, 0x800002, 
		 0x800200, 0x0, 0x0, 0x8200, 
		 0x808002, 0x2, 0x800000, 0x200, 
		 0x8000, 0x800000, 0x800202, 0x8000, 
		 0x808200, 0x800202, 0x200, 0x808200, 
		 0x2, 0x8202, 0x8202, 0x808002, 

		0x84000, 0x40080000, 0x0, 0x40004010, 
		 0x40004010, 0x84000, 0x40084000, 0x80010, 
		 0x80010, 0x4010, 0x4010, 0x0, 
		 0x40080000, 0x40000010, 0x40000010, 0x40084000, 
		 0x40084010, 0x40004000, 0x40004000, 0x40080010, 
		 0x4000, 0x10, 0x40080010, 0x40000000, 
		 0x40000000, 0x80000, 0x80000, 0x84010, 
		 0x10, 0x40084010, 0x84010, 0x4000, 
		 0x4010, 0x40004000, 0x40080000, 0x84000, 
		 0x80010, 0x40084010, 0x40000010, 0x0, 
		 0x0, 0x40000010, 0x40084010, 0x40080000, 
		 0x40004000, 0x4010, 0x84000, 0x80010, 
		 0x80000, 0x40080010, 0x84010, 0x40000000, 
		 0x40084000, 0x4000, 0x4000, 0x40004010, 
		 0x40004010, 0x84010, 0x40000000, 0x10, 
		 0x40080010, 0x80000, 0x10, 0x40084000, 

		0x10000, 0x4010100, 0x4000004, 0x0, 
		 0x4010004, 0x104, 0x104, 0x4000100, 
		 0x4000100, 0x10000, 0x0, 0x4000004, 
		 0x10104, 0x4010004, 0x4010100, 0x10104, 
		 0x4010104, 0x4000000, 0x4010000, 0x4010104, 
		 0x10100, 0x10004, 0x10004, 0x10100, 
		 0x4, 0x100, 0x4000104, 0x4010000, 
		 0x4000000, 0x4000104, 0x100, 0x4, 
		 0x10104, 0x4000000, 0x4010100, 0x4010004, 
		 0x4000104, 0x10000, 0x10000, 0x10104, 
		 0x4, 0x4000104, 0x4010004, 0x100, 
		 0x4000000, 0x4010100, 0x100, 0x4, 
		 0x4000100, 0x104, 0x104, 0x10100, 
		 0x4010000, 0x4000004, 0x4000004, 0x4010000, 
		 0x4010104, 0x10004, 0x0, 0x4010104, 
		 0x10100, 0x0, 0x10004, 0x4000100, 

		0x1000, 0x400000, 0x400040, 0x1040, 
		 0x80401040, 0x80000040, 0x1040, 0x401000, 
		 0x400000, 0x80401040, 0x80000040, 0x400040, 
		 0x80000000, 0x1000, 0x401000, 0x80000000, 
		 0x80400040, 0x80001000, 0x80001000, 0x80400040, 
		 0x0, 0x80400000, 0x80400000, 0x0, 
		 0x80401000, 0x40, 0x401040, 0x80401000, 
		 0x80001040, 0x401040, 0x40, 0x80001040, 
		 0x400040, 0x1040, 0x80401040, 0x401000, 
		 0x401000, 0x80400000, 0x0, 0x80000040, 
		 0x80001000, 0x0, 0x80400000, 0x80001000, 
		 0x1040, 0x400040, 0x80000040, 0x80401040, 
		 0x80000000, 0x400000, 0x40, 0x80001040, 
		 0x80400040, 0x1000, 0x80001040, 0x1000, 
		 0x401040, 0x80401000, 0x1000, 0x80400040, 
		 0x80401000, 0x80000000, 0x400000, 0x40, 

		0x21040000, 0x40080, 0x20000080, 0x20040000, 
		 0x21000080, 0x1000000, 0x20040000, 0x1000000, 
		 0x1040080, 0x21040000, 0x1000000, 0x1040080, 
		 0x0, 0x20000080, 0x40080, 0x0, 
		 0x40000, 0x21000000, 0x21040080, 0x80, 
		 0x20000000, 0x40000, 0x1040000, 0x20000000, 
		 0x20040080, 0x1000080, 0x80, 0x20040080, 
		 0x1000080, 0x21040080, 0x21000000, 0x1040000, 
		 0x40000, 0x20000000, 0x21040000, 0x21000080, 
		 0x20000000, 0x20040080, 0x21000080, 0x80, 
		 0x20040080, 0x1000000, 0x80, 0x21040000, 
		 0x1040080, 0x40000, 0x21000080, 0x1040080, 
		 0x21040080, 0x40080, 0x1000080, 0x1040000, 
		 0x1040000, 0x1000080, 0x20000080, 0x21040080, 
		 0x21000000, 0x20000080, 0x20040000, 0x0, 
		 0x0, 0x21000000, 0x40080, 0x20040000, 

		0x10002008, 0x10200008, 0x10200008, 0x10002000, 
		 0x0, 0x202000, 0x202000, 0x10200000, 
		 0x10200000, 0x0, 0x8, 0x202008, 
		 0x202008, 0x10002008, 0x10002000, 0x8, 
		 0x10202000, 0x10000000, 0x10000000, 0x2008, 
		 0x10000008, 0x200008, 0x200008, 0x10202008, 
		 0x2000, 0x10202000, 0x10202008, 0x10000008, 
		 0x200000, 0x2000, 0x2008, 0x200000, 
		 0x10000000, 0x2000, 0x200000, 0x8, 
		 0x10202000, 0x10200008, 0x10002008, 0x202008, 
		 0x8, 0x10202000, 0x2000, 0x10002008, 
		 0x10200008, 0x10000000, 0x202008, 0x200000, 
		 0x2008, 0x200008, 0x10202008, 0x202000, 
		 0x0, 0x2008, 0x202000, 0x10200000, 
		 0x10200000, 0x10000008, 0x200008, 0x0, 
		 0x10002000, 0x10202008, 0x10000008, 0x10002000, 

		0x2100000, 0x2100401, 0x2100401, 0x0, 
		 0x2000001, 0x401, 0x401, 0x2000001, 
		 0x0, 0x2000400, 0x2000400, 0x2100000, 
		 0x100401, 0x100000, 0x100000, 0x100401, 
		 0x400, 0x1, 0x100001, 0x2000401, 
		 0x2100400, 0x2000000, 0x2000000, 0x2100400, 
		 0x2100001, 0x100400, 0x100400, 0x100001, 
		 0x1, 0x2100001, 0x2000401, 0x400, 
		 0x100400, 0x100001, 0x2000001, 0x2100000, 
		 0x2000400, 0x0, 0x2100401, 0x100400, 
		 0x2100000, 0x2100401, 0x100001, 0x401, 
		 0x0, 0x2000001, 0x401, 0x2000400, 
		 0x1, 0x2100400, 0x2100400, 0x400, 
		 0x2100001, 0x100401, 0x100000, 0x2000401, 
		 0x400, 0x1, 0x2000401, 0x2000000, 
		 0x100401, 0x100000, 0x2000000, 0x2100001, 

		0x8000820, 0x20, 0x8020000, 0x8000820, 
		 0x0, 0x8020020, 0x20820, 0x0, 
		 0x20800, 0x8000800, 0x8000800, 0x20800, 
		 0x8020020, 0x8020800, 0x20, 0x8020000, 
		 0x20000, 0x800, 0x8020820, 0x8000000, 
		 0x8000020, 0x20000, 0x800, 0x8020800, 
		 0x820, 0x8020820, 0x20020, 0x820, 
		 0x8020800, 0x8000020, 0x8000000, 0x20020, 
		 0x20000, 0x8000000, 0x20820, 0x8020800, 
		 0x8000820, 0x20820, 0x800, 0x8020020, 
		 0x20, 0x20000, 0x8020020, 0x20, 
		 0x20820, 0x8000820, 0x8000000, 0x800, 
		 0x8020820, 0x20020, 0x8000020, 0x820, 
		 0x20020, 0x8000800, 0x8020000, 0x0, 
		 0x8000800, 0x8000020, 0x820, 0x8020820, 
		 0x0, 0x20800, 0x20800, 0x8020000, 
	};



const static long P_Box[] =
{0x10000, 0x2000000, 0x1000, 0x800, 0x8, 0x100000, 0x10, 0x8000, 
0x80000000, 0x20000, 0x200, 0x40, 0x8000000, 0x4000, 0x2, 0x400000, 
0x40000000, 0x1000000, 0x100, 0x40000, 0x1, 0x20, 0x20000000, 0x800000, 
0x2000, 0x80000, 0x4, 0x4000000, 0x400, 0x200000, 0x10000000, 0x80};

const static unsigned long Compression_BoxL[] =
{0x4000, 0x800, 0x20000, 0x10, 0x8000000, 0x800000, 0x2000000, 0x1, 0x2000, 0x400000, 0x80, 0x40000, 
0x20, 0x200, 0x10000, 0x1000000, 0x4, 0x100000, 0x1000, 0x200000, 0x2, 0x100, 0x8000, 0x4000000, };
const static unsigned long Compression_BoxR[] =
{0x8000, 0x10, 0x2000000, 0x80000, 0x200, 0x2, 0x4000000, 0x10000, 0x20, 0x800, 0x800000, 0x100, 
0x1000, 0x80, 0x20000, 0x1, 0x400000, 0x8, 0x400, 0x4000, 0x40, 0x100000, 0x8000000, 0x1000000, };

const static unsigned long SubBox[] =
{0x40, 0x2000, 0x100000, 0x8000000, 0x40, 0x2000, 0x100000, 0x8000000, 
0x20, 0x1000, 0x80000, 0x4000000, 0x20, 0x1000, 0x80000, 0x4000000, 
0x10, 0x800, 0x40000, 0x2000000, 0x10, 0x800, 0x40000, 0x2000000, 
0x8, 0x400, 0x20000, 0x1000000, 
0x1, 0x80, 0x4000, 0x200000, 0x2, 0x1, 0x80, 0x4000, 0x200000, 0x2, 
0x100, 0x8000, 0x400000, 0x4, 0x100, 0x8000, 0x400000, 0x4, 
0x200, 0x10000, 0x800000, 0x200, 0x10000, 0x800000, 
0x8, 0x400, 0x20000, 0x1000000};

const static unsigned long WeakKeys[128] =
	{0x0000000, 0x0000000, 0x0000000, 0xfffffff, 
	 0xfffffff, 0x0000000, 0xfffffff, 0xfffffff, 
	 0x01fc07f, 0x01fc07f, 0xfe03f80, 0xfe03f80, 
	 0x1fc07f0, 0x0fe03f8, 0xe03f80f, 0xf01fc07, 

	 0x01c0070, 0x01e0078, 0xe003800, 0xf003c00, 
	 0x1ffc7ff, 0x0ffc3ff, 0xfe3ff8f, 0xfe1ff87, 
	 0x003c00f, 0x001c007, 0x1e00780, 0x0e00380, 
	 0xe1ff87f, 0xf1ffc7f, 0xffc3ff0, 0xffe3ff8, 

	 0x1e3c000, 0x0e1c000, 0x003c780, 0x001c380, 
	 0x1e0000f, 0x0e00007, 0x000078f, 0x0000387, 

	 0xe1c0000, 0xf1e0000, 0xfffc000, 0xfffc000, 
	 0xffc0780, 0xffe0380, 0xe1fc780, 0xf1fc380, 
	 0xffc000f, 0xffe0007, 0xe1fc00f, 0xf1fc007, 
	 0xe1c078f, 0xf1e0387, 0xfffc78f, 0xf1e0387, 

	 0xfe3f800, 0xfe1fc00, 0xe03ff80, 0xf01ff80, 
	 0xfe0380f, 0xfe03c07, 0xe003f8f, 0xf003f87, 

	 0x01c3800, 0x01e3c00, 0x1fff800, 0x0fffc00, 
	 0x1fc3f80, 0x0fe3f80, 0x01fff80, 0x01fff80, 
	 0x1fc380f, 0x0fe3c07, 0x01ff80f, 0x01ffc07, 
	 0x01c3f8f, 0x01e3f87, 0x1ffff8f, 0x0ffff87, 

	 0xe000070, 0x1e00071, 0xfe3c070, 0x1fc3871, 
	 0xfe007f0, 0xfe003f8, 0xe03c7f0, 0xf01c3f8, 
	 0xfe0007f, 0xfe0007f, 0xe03c07f, 0xf01c07f, 
	 0xe0007ff, 0xf0003ff, 0xfe3c7ff, 0xfe1c3ff, 

	 0x1ffc070, 0x0ffc078, 0x01fc7f0, 0x01fc3f8, 
	 0x1fc007f, 0x0fe007f, 0x01c07ff, 0x01e03ff, 

	 0x0003870, 0x0003c78, 0x1e3f870, 0x0e1fc78, 
	 0x1e1fff0, 0x0e03ff8, 0x003fff0, 0x001fff8, 
	 0x1e0387f, 0x0e03c7f, 0x003f87f, 0x001fc7f, 
	 0x0003fff, 0x0003fff, 0x1e3ffff, 0x0e1ffff, 

	 0xffff870, 0xffffc78, 0xe1ffff0, 0xf1ffff8, 
	 0xffc387f, 0xffe3c7f, 0xe1c3fff, 0xf1e3fff};

#define ONE_SEVEN_ZERO 0x10000000
#define SEVEN_F 0xfffffff

inline void RotateL(unsigned long& lkey, unsigned long& rkey, int round)
{//If RotateL and RoateR aren't used in the same time, the highest 4 bits of lkey and rkey
 // are zero.	
	lkey <<= 1;
	rkey <<= 1;
	if (lkey&ONE_SEVEN_ZERO) lkey++;
	if (rkey&ONE_SEVEN_ZERO) rkey++;
	if (RotateLIndex[round] == 1)
	{
		lkey &= SEVEN_F;

⌨️ 快捷键说明

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