📄 des.cpp
字号:
//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 + -