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

📄 des.cpp

📁 应用编码与计算机密码学program 《应用编码与计算机密码学》程序 单钥密码算法DES算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//des.cpp
//update:2001.8.19
#include "des.h"

const static _int8 RotateLIndex[16]=
	{1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
const static _int8 RotateRIndex[16]=
	{0,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};	
const static _int8 E_Box[48]=
	{32,1,1,1,1,1,31,1,1,1,1,1,31,1,1,1,1,1,31,1,1,1,1,1,
	 31,1,1,1,1,1,31,1,1,1,1,1,31,1,1,1,1,1,31,1,1,1,1,1};
const static _int32 ogn_S_Box[8][64]=
	{
		//S_Box1
		{0xd0000000,0xe0000000,0x80000000,0x10000000,
		 0xe0000000,0x90000000,0x20000000,0x40000000,
		 0x00000000,0x30000000,0xb0000000,0xe0000000,
		 0x30000000,0xa0000000,0xd0000000,0x70000000,
		 0xa0000000,0x00000000,0x40000000,0xb0000000,
		 0x40000000,0x70000000,0x10000000,0xd0000000,
		 0x70000000,0xd0000000,0xe0000000,0x80000000,
		 0x90000000,0x40000000,0x70000000,0x20000000,
		 0xb0000000,0x80000000,0x50000000,0x60000000,
		 0x80000000,0x50000000,0xf0000000,0x30000000,
		 0xc0000000,0x60000000,0x00000000,0x50000000,
		 0x60000000,0xf0000000,0x30000000,0xa0000000,
		 0x10000000,0xb0000000,0xa0000000,0xc0000000,
		 0xf0000000,0xc0000000,0x60000000,0x00000000,
		 0x20000000,0x10000000,0x90000000,0xf0000000,
		 0x50000000,0x20000000,0xc0000000,0x90000000,},
		//S_Box2
		{0xf000000,0x9000000,0x6000000,0xa000000,
		 0x8000000,0xe000000,0xf000000,0x5000000,
		 0x3000000,0x5000000,0x9000000,0x3000000,
		 0xe000000,0x8000000,0x5000000,0xf000000,
		 0x4000000,0x2000000,0x3000000,0xc000000,
		 0x2000000,0x4000000,0xc000000,0x9000000,
		 0x9000000,0xf000000,0xa000000,0x0000000,
		 0x5000000,0x3000000,0x0000000,0x6000000,
		 0x0000000,0xa000000,0xd000000,0x1000000,
		 0xb000000,0x7000000,0x8000000,0x2000000,
		 0xa000000,0x6000000,0x4000000,0x8000000,
		 0x1000000,0xd000000,0xb000000,0x4000000,
		 0xd000000,0x1000000,0xe000000,0xb000000,
		 0x7000000,0xb000000,0x2000000,0xe000000,
		 0x6000000,0xc000000,0x1000000,0x7000000,
		 0xc000000,0x0000000,0x7000000,0xd000000,},
		//S_Box3
		{0xd00000,0x600000,0x400000,0x100000,
		 0x300000,0x500000,0xd00000,0xb00000,
		 0xb00000,0x800000,0x100000,0x700000,
		 0x500000,0x800000,0xb00000,0x200000,
		 0xe00000,0xd00000,0x700000,0x800000,
		 0x800000,0xe00000,0x200000,0xd00000,
		 0x000000,0x300000,0xe00000,0x400000,
		 0x600000,0x000000,0xb00000,0xe00000,
		 0x400000,0x900000,0xf00000,0x600000,
		 0xf00000,0x200000,0xa00000,0xc00000,
		 0x100000,0x400000,0xc00000,0xa00000,
		 0xc00000,0x100000,0x300000,0xf00000,
		 0x700000,0xa00000,0x900000,0x300000,
		 0x200000,0x700000,0x500000,0x000000,
		 0xa00000,0xf00000,0x000000,0x900000,
		 0x900000,0xc00000,0x600000,0x500000,},
		//S_Box4	
		{0x90000,0xa0000,0x50000,0x30000,
		 0x00000,0x70000,0xa0000,0x90000,
		 0x70000,0x90000,0xc0000,0xf0000,
		 0xb0000,0xc0000,0x60000,0x00000,
		 0xc0000,0x50000,0x00000,0x60000,
		 0x50000,0x00000,0xf0000,0xa0000,
		 0xa0000,0x60000,0x30000,0x50000,
		 0x60000,0xb0000,0x90000,0xc0000,
		 0xf0000,0x30000,0x80000,0xe0000,
		 0x30000,0xe0000,0xd0000,0x20000,
		 0x10000,0x40000,0xb0000,0x10000,
		 0xe0000,0x20000,0x10000,0x70000,
		 0x20000,0x80000,0x70000,0xd0000,
		 0x80000,0xd0000,0x20000,0x40000,
		 0x40000,0xf0000,0xe0000,0x80000,
		 0xd0000,0x10000,0x40000,0xb0000,},
		//S_Box5
		{0x5000,0xf000,0x6000,0xc000,
		 0xf000,0x0000,0x9000,0x5000,
		 0x9000,0xa000,0x3000,0x0000,
		 0xa000,0x9000,0xf000,0x6000,
		 0x0000,0x3000,0x5000,0xf000,
		 0x3000,0x5000,0xc000,0xa000,
		 0xe000,0x4000,0x0000,0x9000,
		 0x4000,0xe000,0xa000,0x3000,
		 0x2000,0x8000,0x8000,0x7000,
		 0xc000,0xb000,0x7000,0x2000,
		 0x7000,0x1000,0xd000,0xe000,
		 0x1000,0x7000,0x4000,0xb000,
		 0xd000,0x6000,0x2000,0x8000,
		 0x6000,0xc000,0xb000,0x1000,
		 0x8000,0xd000,0xe000,0x4000,
		 0xb000,0x2000,0x1000,0xd000,},
		//S_Box6
		{0x400,0xd00,0xe00,0x100,
		 0x300,0x000,0xd00,0x700,
		 0x700,0xa00,0xb00,0x400,
		 0xa00,0x900,0x400,0xe00,
		 0x900,0x400,0x200,0xb00,
		 0x000,0x300,0x700,0x800,
		 0xe00,0x700,0x100,0xd00,
		 0xd00,0xe00,0x800,0x200,
		 0xf00,0x100,0x900,0xa00,
		 0x500,0xf00,0xa00,0xc00,
		 0xc00,0x600,0x500,0x300,
		 0x600,0xc00,0x300,0x500,
		 0x200,0x800,0xf00,0x600,
		 0xb00,0x500,0x000,0xf00,
		 0x100,0xb00,0xc00,0x000,
		 0x800,0x200,0x600,0x900,},
		//S_Box7
		{0x40,0x20,0xa0,0xc0,
		 0xa0,0xc0,0xf0,0x60,
		 0xf0,0x90,0x60,0x30,
		 0xc0,0x60,0x00,0x90,
		 0x20,0xf0,0x50,0x00,
		 0x90,0xa0,0x30,0x50,
		 0x10,0x40,0xc0,0xa0,
		 0x60,0x10,0x90,0xf0,
		 0xb0,0x50,0x10,0x20,
		 0x00,0x30,0xb0,0x40,
		 0x30,0x00,0xd0,0x40,
		 0x70,0x80,0xe0,0x70,
		 0xe0,0x70,0x40,0xb0,
		 0xd0,0xe0,0x70,0x10,
		 0x80,0xd0,0x20,0x80,},
		//S_Box8			
		{0xd,0x4,0x2,0x8,
		 0xa,0xD,0x7,0xb,
		 0x0,0xe,0xd,0x7,
		 0x7,0x0,0x1,0xe,
		 0x3,0x9,0x4,0x2,
		 0x9,0x3,0xe,0x4,
		 0xe,0xb,0x7,0xd,
		 0x4,0xa,0x8,0x1,
		 0x2,0x1,0xf,0x6,
		 0xf,0x8,0xc,0x5,
		 0xc,0x2,0x6,0x9,
		 0x1,0xb,0xa,0x0,
		 0x5,0xf,0x9,0xc,
		 0x6,0x5,0x5,0xf,
		 0xb,0xc,0x0,0x3,
		 0x8,0x6,0x3,0xa,}
	};

_int32 S_Box[8][64]=
	{
		//S_Box1
		{0xd0000000,0xe0000000,0x80000000,0x10000000,
		 0xe0000000,0x90000000,0x20000000,0x40000000,
		 0x00000000,0x30000000,0xb0000000,0xe0000000,
		 0x30000000,0xa0000000,0xd0000000,0x70000000,
		 0xa0000000,0x00000000,0x40000000,0xb0000000,
		 0x40000000,0x70000000,0x10000000,0xd0000000,
		 0x70000000,0xd0000000,0xe0000000,0x80000000,
		 0x90000000,0x40000000,0x70000000,0x20000000,
		 0xb0000000,0x80000000,0x50000000,0x60000000,
		 0x80000000,0x50000000,0xf0000000,0x30000000,
		 0xc0000000,0x60000000,0x00000000,0x50000000,
		 0x60000000,0xf0000000,0x30000000,0xa0000000,
		 0x10000000,0xb0000000,0xa0000000,0xc0000000,
		 0xf0000000,0xc0000000,0x60000000,0x00000000,
		 0x20000000,0x10000000,0x90000000,0xf0000000,
		 0x50000000,0x20000000,0xc0000000,0x90000000,},
		//S_Box2
		{0xf000000,0x9000000,0x6000000,0xa000000,
		 0x8000000,0xe000000,0xf000000,0x5000000,
		 0x3000000,0x5000000,0x9000000,0x3000000,
		 0xe000000,0x8000000,0x5000000,0xf000000,
		 0x4000000,0x2000000,0x3000000,0xc000000,
		 0x2000000,0x4000000,0xc000000,0x9000000,
		 0x9000000,0xf000000,0xa000000,0x0000000,
		 0x5000000,0x3000000,0x0000000,0x6000000,
		 0x0000000,0xa000000,0xd000000,0x1000000,
		 0xb000000,0x7000000,0x8000000,0x2000000,
		 0xa000000,0x6000000,0x4000000,0x8000000,
		 0x1000000,0xd000000,0xb000000,0x4000000,
		 0xd000000,0x1000000,0xe000000,0xb000000,
		 0x7000000,0xb000000,0x2000000,0xe000000,
		 0x6000000,0xc000000,0x1000000,0x7000000,
		 0xc000000,0x0000000,0x7000000,0xd000000,},
		//S_Box3
		{0xd00000,0x600000,0x400000,0x100000,
		 0x300000,0x500000,0xd00000,0xb00000,
		 0xb00000,0x800000,0x100000,0x700000,
		 0x500000,0x800000,0xb00000,0x200000,
		 0xe00000,0xd00000,0x700000,0x800000,
		 0x800000,0xe00000,0x200000,0xd00000,
		 0x000000,0x300000,0xe00000,0x400000,
		 0x600000,0x000000,0xb00000,0xe00000,
		 0x400000,0x900000,0xf00000,0x600000,
		 0xf00000,0x200000,0xa00000,0xc00000,
		 0x100000,0x400000,0xc00000,0xa00000,
		 0xc00000,0x100000,0x300000,0xf00000,
		 0x700000,0xa00000,0x900000,0x300000,
		 0x200000,0x700000,0x500000,0x000000,
		 0xa00000,0xf00000,0x000000,0x900000,
		 0x900000,0xc00000,0x600000,0x500000,},
		//S_Box4	
		{0x90000,0xa0000,0x50000,0x30000,
		 0x00000,0x70000,0xa0000,0x90000,
		 0x70000,0x90000,0xc0000,0xf0000,
		 0xb0000,0xc0000,0x60000,0x00000,
		 0xc0000,0x50000,0x00000,0x60000,
		 0x50000,0x00000,0xf0000,0xa0000,
		 0xa0000,0x60000,0x30000,0x50000,
		 0x60000,0xb0000,0x90000,0xc0000,
		 0xf0000,0x30000,0x80000,0xe0000,
		 0x30000,0xe0000,0xd0000,0x20000,
		 0x10000,0x40000,0xb0000,0x10000,
		 0xe0000,0x20000,0x10000,0x70000,
		 0x20000,0x80000,0x70000,0xd0000,
		 0x80000,0xd0000,0x20000,0x40000,
		 0x40000,0xf0000,0xe0000,0x80000,
		 0xd0000,0x10000,0x40000,0xb0000,},
		//S_Box5
		{0x5000,0xf000,0x6000,0xc000,
		 0xf000,0x0000,0x9000,0x5000,
		 0x9000,0xa000,0x3000,0x0000,
		 0xa000,0x9000,0xf000,0x6000,
		 0x0000,0x3000,0x5000,0xf000,
		 0x3000,0x5000,0xc000,0xa000,
		 0xe000,0x4000,0x0000,0x9000,
		 0x4000,0xe000,0xa000,0x3000,
		 0x2000,0x8000,0x8000,0x7000,
		 0xc000,0xb000,0x7000,0x2000,
		 0x7000,0x1000,0xd000,0xe000,
		 0x1000,0x7000,0x4000,0xb000,
		 0xd000,0x6000,0x2000,0x8000,
		 0x6000,0xc000,0xb000,0x1000,
		 0x8000,0xd000,0xe000,0x4000,
		 0xb000,0x2000,0x1000,0xd000,},
		//S_Box6
		{0x400,0xd00,0xe00,0x100,
		 0x300,0x000,0xd00,0x700,
		 0x700,0xa00,0xb00,0x400,
		 0xa00,0x900,0x400,0xe00,
		 0x900,0x400,0x200,0xb00,
		 0x000,0x300,0x700,0x800,
		 0xe00,0x700,0x100,0xd00,
		 0xd00,0xe00,0x800,0x200,
		 0xf00,0x100,0x900,0xa00,
		 0x500,0xf00,0xa00,0xc00,
		 0xc00,0x600,0x500,0x300,
		 0x600,0xc00,0x300,0x500,
		 0x200,0x800,0xf00,0x600,
		 0xb00,0x500,0x000,0xf00,
		 0x100,0xb00,0xc00,0x000,
		 0x800,0x200,0x600,0x900,},
		//S_Box7
		{0x40,0x20,0xa0,0xc0,
		 0xa0,0xc0,0xf0,0x60,
		 0xf0,0x90,0x60,0x30,
		 0xc0,0x60,0x00,0x90,
		 0x20,0xf0,0x50,0x00,
		 0x90,0xa0,0x30,0x50,
		 0x10,0x40,0xc0,0xa0,
		 0x60,0x10,0x90,0xf0,
		 0xb0,0x50,0x10,0x20,
		 0x00,0x30,0xb0,0x40,
		 0x30,0x00,0xd0,0x40,
		 0x70,0x80,0xe0,0x70,
		 0xe0,0x70,0x40,0xb0,
		 0xd0,0xe0,0x70,0x10,
		 0x80,0xd0,0x20,0x80,},
		//S_Box8			
		{0xd,0x4,0x2,0x8,
		 0xa,0xD,0x7,0xb,
		 0x0,0xe,0xd,0x7,
		 0x7,0x0,0x1,0xe,
		 0x3,0x9,0x4,0x2,
		 0x9,0x3,0xe,0x4,
		 0xe,0xb,0x7,0xd,
		 0x4,0xa,0x8,0x1,
		 0x2,0x1,0xf,0x6,
		 0xf,0x8,0xc,0x5,
		 0xc,0x2,0x6,0x9,
		 0x1,0xb,0xa,0x0,
		 0x5,0xf,0x9,0xc,
		 0x6,0x5,0x5,0xf,
		 0xb,0xc,0x0,0x3,
		 0x8,0x6,0x3,0xa,}
	};

const static _int8 P_Box[33]=
	{0,7,28,21,10,26,2,19,13,23,29,5,0,18,8,24,30,22,1,13,27,
	 6,9,17,31,15,4,20,3,11,12,25,16};

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};

_inline void RotateL(_int64& key,int round)
{	
	_int64 tempkey=key;
	_asm
	{
		MOV EAX,DWORD PTR tempkey+4
		MOV ECX,DWORD PTR tempkey
		BT EAX,27
		RCL EAX,1
		BT ECX,27
		RCL ECX,1
		MOV EBX,round
		MOV BL,RotateLIndex[EBX]
		CMP BL,2
		JB SHORT DONE
		BT EAX,27
		RCL EAX,1
		BT ECX,27
		RCL ECX,1
DONE:	MOV DWORD PTR tempkey+4,EAX
		MOV DWORD PTR tempkey,ECX
	}
	key=tempkey;
}

_inline void RotateR(_int64& key,int round)
{
	if(round==0)return;
	_int64 tempkey=key;
	_asm
	{
		MOV EAX,DWORD PTR tempkey+4
		MOV ECX,DWORD PTR tempkey
		SHL EAX,4
		SHL ECX,4
		BT EAX,4
		RCR EAX,1
		BT ECX,4
		RCR ECX,1
		MOV EBX,round
		MOV BL,RotateRIndex[EBX]
		CMP BL,2
		JB SHORT DONE
		BT EAX,4
		RCR EAX,1
		BT ECX,4
		RCR ECX,1
DONE:	SHR EAX,4
		SHR ECX,4
		MOV DWORD PTR tempkey+4,EAX
		MOV DWORD PTR tempkey,ECX
	}
	key=tempkey;
}

__inline _int32 Substitution(_int64 input)
{
	_int32 temp;
	_asm
	{
		;substitution
		XOR ECX,ECX
		XOR EDX,EDX

	 	MOV ESI,DWORD PTR input+4
		MOV EDI,DWORD PTR input
		SHL ESI,8
		SHL EDI,8
AGAIN:	SHLD EAX,ESI,6
		SHLD EBX,EDI,6
		SHL ESI,6
		SHL EDI,6
		BT EAX,5
		RCL EAX,1
		BT EBX,5
		RCL EBX,1
		AND EAX,3FH
		AND EBX,3FH
		ADD EAX,ECX
		ADD EBX,ECX
		OR EDX,S_Box[EAX*4]
		ADD EBX,100H
		OR EDX,S_Box[EBX*4]
		ADD ECX,40H
		CMP ECX,100H
		JB SHORT AGAIN

		;straight permutation
		MOV EBX,32
		XOR ECX,ECX
AGAIN1:	MOV CL,P_Box[EBX]
		BT EDX,ECX
		RCL EAX,1
		DEC EBX
		JNZ SHORT AGAIN1
		MOV temp,EAX
	}
	return temp;
}

_inline void Sub_Key(_int64& key)
{
	_int64 tempkey=key;
	_asm
	{
		MOV EAX,DWORD PTR tempkey+4
		MOV EBX,DWORD PTR tempkey

		BT EBX,6	;1
		RCL ECX,1	
		BT EBX,13
		RCL ECX,1
		BT EBX,20
		RCL ECX,1
		BT EBX,27
		RCL ECX,1

		BT EAX,6
		RCL ECX,1
		BT EAX,13
		RCL ECX,1
		BT EAX,20
		RCL ECX,1
		BT EAX,27
		RCL ECX,1

		BT EBX,5	;3
		RCL ECX,1
		BT EBX,12
		RCL ECX,1
		BT EBX,19
		RCL ECX,1
		BT EBX,26

⌨️ 快捷键说明

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