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