📄 des.cpp
字号:
RCL ECX,1
BT EAX,5
RCL ECX,1
BT EAX,12
RCL ECX,1
BT EAX,19
RCL ECX,1
BT EAX,26
RCL ECX,1
BT EBX,4 ;5
RCL ECX,1
BT EBX,11
RCL ECX,1
BT EBX,18
RCL ECX,1
BT EBX,25
RCL ECX,1
BT EAX,4
RCL ECX,1
BT EAX,11
RCL ECX,1
BT EAX,18
RCL ECX,1
BT EAX,25
RCL ECX,1
BT EBX,3 ;7
RCL ECX,1
BT EBX,10
RCL ECX,1
BT EBX,17
RCL ECX,1
BT EBX,24
RCL ECX,1
BT EBX,0 ;1
RCL EDX,1
BT EBX,7
RCL EDX,1
BT EBX,14
RCL EDX,1
BT EBX,21
RCL EDX,1
BT EAX,0
RCL EDX,1
BT EAX,7
RCL EDX,1
BT EAX,14
RCL EDX,1
BT EAX,21
RCL EDX,1
BT EBX,1 ;3
RCL EDX,1
BT EBX,8
RCL EDX,1
BT EBX,15
RCL EDX,1
BT EBX,22
RCL EDX,1
BT EAX,1
RCL EDX,1
BT EAX,8
RCL EDX,1
BT EAX,15
RCL EDX,1
BT EAX,22
RCL EDX,1
BT EBX,2 ;5
RCL EDX,1
BT EBX,9
RCL EDX,1
BT EBX,16
RCL EDX,1
BT EBX,23
RCL EDX,1
BT EAX,2
RCL EDX,1
BT EAX,9
RCL EDX,1
BT EAX,16
RCL EDX,1
BT EAX,23
RCL EDX,1
BT EBX,3 ;7
RCL EDX,1
BT EBX,10
RCL EDX,1
BT EBX,17
RCL EDX,1
BT EBX,24
RCL EDX,1
MOV DWORD PTR tempkey+4,ECX
MOV DWORD PTR tempkey,EDX
}
key=tempkey;
}
_inline _int64 Expansion(unsigned long input)
{
_int64 temp;
_asm
{
XOR EDX,EDX
LEA EBX,E_Box
MOV EAX,input
MOV CH,24
AGAIN1: MOV CL,[EBX]
ROL EAX,CL
RCL EDX,1
INC EBX
DEC CH
JNZ AGAIN1
MOV DWORD PTR temp+4,EDX
MOV CH,24
AGAIN2: MOV CL,[EBX]
ROL EAX,CL
RCL EDX,1
INC EBX
DEC CH
JNZ AGAIN2
MOV DWORD PTR temp,EDX
}
return temp;
}
_inline _int64 Compression(_int64 key)
{
_int64 temp;
_asm
{
MOV EAX,DWORD PTR key+4
MOV EBX,DWORD PTR key
BT EAX,14
RCL ECX,1
BT EAX,11
RCL ECX,1
BT EAX,17
RCL ECX,1
BT EAX,4
RCL ECX,1
BT EAX,27
RCL ECX,1
BT EAX,23
RCL ECX,1
BT EAX,25
RCL ECX,1
BT EAX,0
RCL ECX,1
BT EAX,13
RCL ECX,1
BT EAX,22
RCL ECX,1
BT EAX,7
RCL ECX,1
BT EAX,18
RCL ECX,1
BT EAX,5
RCL ECX,1
BT EAX,9
RCL ECX,1
BT EAX,16
RCL ECX,1
BT EAX,24
RCL ECX,1
BT EAX,2
RCL ECX,1
BT EAX,20
RCL ECX,1
BT EAX,12
RCL ECX,1
BT EAX,21
RCL ECX,1
BT EAX,1
RCL ECX,1
BT EAX,8
RCL ECX,1
BT EAX,15
RCL ECX,1
BT EAX,26
RCL ECX,1
BT EBX,15
RCL EDX,1
BT EBX,4
RCL EDX,1
BT EBX,25
RCL EDX,1
BT EBX,19
RCL EDX,1
BT EBX,9
RCL EDX,1
BT EBX,1
RCL EDX,1
BT EBX,26
RCL EDX,1
BT EBX,16
RCL EDX,1
BT EBX,5
RCL EDX,1
BT EBX,11
RCL EDX,1
BT EBX,23
RCL EDX,1
BT EBX,8
RCL EDX,1
BT EBX,12
RCL EDX,1
BT EBX,7
RCL EDX,1
BT EBX,17
RCL EDX,1
BT EBX,0
RCL EDX,1
BT EBX,22
RCL EDX,1
BT EBX,3
RCL EDX,1
BT EBX,10
RCL EDX,1
BT EBX,14
RCL EDX,1
BT EBX,6
RCL EDX,1
BT EBX,20
RCL EDX,1
BT EBX,27
RCL EDX,1
BT EBX,24
RCL EDX,1
MOV DWORD PTR temp+4,ECX
MOV DWORD PTR temp,EDX
}
return temp;
}
void desenc(unsigned long& LData,unsigned long& RData,
unsigned long& LKey,unsigned long& RKey)
{
unsigned long per,Rnext;
_int64 exp,cmp,key_64=LKey;
key_64=(key_64<<32)|RKey;
int i;
Sub_Key(key_64);
for(i=0;i<15;i++)
{
exp=Expansion(RData);
RotateL(key_64,i);
cmp=Compression(key_64);
exp^=cmp;
per=Substitution(exp);
Rnext=LData^per;
LData=RData;
RData=Rnext;
}
exp=Expansion(RData);
RotateL(key_64,i);
cmp=Compression(key_64);
exp^=cmp;
per=Substitution(exp);
LData^=per;
}
void desdec(unsigned long& LData,unsigned long& RData,
unsigned long& LKey,unsigned long& RKey)
{
int i;
unsigned long per,Rnext;
_int64 exp,cmp,key_64=LKey;
key_64=(key_64<<32)|RKey;
Sub_Key(key_64);
for(i=0;i<15;i++)
{
exp=Expansion(RData);
RotateR(key_64,i);
cmp=Compression(key_64);
exp^=cmp;
per=Substitution(exp);
Rnext=LData^per;
LData=RData;
RData=Rnext;
}
exp=Expansion(RData);
RotateR(key_64,i);
cmp=Compression(key_64);
exp^=cmp;
per=Substitution(exp);
LData^=per;
}
void rebuild_s_box(unsigned long& LExKey,
unsigned long& RExKey)
{
unsigned long temp_LExKey=LExKey;
int i,j;
for(j=0;j<64;j++)
S_Box[0][j]=ogn_S_Box[1][j];
for(j=0;j<64;j++)
S_Box[1][j]=ogn_S_Box[3][j];
for(j=0;j<64;j++)
S_Box[2][j]=ogn_S_Box[5][j];
for(j=0;j<64;j++)
S_Box[3][j]=ogn_S_Box[6][j];
for(j=0;j<64;j++)
S_Box[4][j]=ogn_S_Box[2][j];
for(j=0;j<64;j++)
S_Box[5][j]=ogn_S_Box[0][j];
for(j=0;j<64;j++)
S_Box[6][j]=ogn_S_Box[4][j];
for(j=0;j<64;j++)
S_Box[7][j]=ogn_S_Box[7][j];
_int8 xchgflag[16]=
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
_asm
{
MOV EAX,temp_LExKey
MOV ECX,15
NEXT: BT EAX,ECX
RCL xchgflag[ECX],1
LOOP NEXT
BT EAX,ECX
RCL xchgflag[ECX],1
}
_int32 mask[8]=
{0xf0000000,0xf000000,0xf00000,0xf0000,
0xf000, 0xf00, 0xf0, 0xf};
for(i=0;i<8;i++)
{
if(xchgflag[i+i])
{
//Exchange tow lines.
for(j=0;j<64;++j,++j)
{
S_Box[i][j]^=S_Box[i][j+1];
S_Box[i][j+1]^=S_Box[i][j];
S_Box[i][j]^=S_Box[i][j+1];
}
}
if(xchgflag[i+i+1])
{
//Exchange four rows.
for(j=0;j<32;j++)
{
S_Box[i][j]^=S_Box[i][j+32];
S_Box[i][j+32]^=S_Box[i][j];
S_Box[i][j]^=S_Box[i][j+32];
}
}
for(j=0;j<64;j++)
{
S_Box[i][j]^=RExKey&mask[i];
}
}
temp_LExKey=0;
}
void reset_s_box()
{
for(int i=0;i<8;i++)
for(int j=0;j<64;j++)
S_Box[i][j]=ogn_S_Box[i][j];
}
long isweakkey(unsigned long& LKey,unsigned long& RKey)
{
for(int i=0;i<128;++i,++i)
{
if(WeakKeys[i]==LKey&&WeakKeys[i+1]==RKey)
return 0xffffffff;
}
return 0;
}
void init_enc_cmpkeys(unsigned long& LKey,
unsigned long& RKey,
_int64* compressed_enc_key)
{
_int64 key_64=LKey;
key_64=(key_64<<32)|RKey;
Sub_Key(key_64);
for(int i=0;i<16;i++)
{
RotateL(key_64,i);
compressed_enc_key[i]=Compression(key_64);
}
}
void init_dec_cmpkeys(unsigned long& LKey,
unsigned long& RKey,
_int64* compressed_dec_key)
{
_int64 key_64=LKey;
key_64=(key_64<<32)|RKey;
Sub_Key(key_64);
for(int i=0;i<16;i++)
{
RotateR(key_64,i);
compressed_dec_key[i]=Compression(key_64);
}
}
void fast_desenc(unsigned long& LData,unsigned long& RData,
_int64* compressed_enc_key)
{
int i;
unsigned long per,Rnext;
_int64 exp;
for(i=0;i<15;i++)
{
exp=Expansion(RData);
exp^=compressed_enc_key[i];
per=Substitution(exp);
Rnext=LData^per;
LData=RData;
RData=Rnext;
}
exp=Expansion(RData);
exp^=compressed_enc_key[i];
per=Substitution(exp);
LData^=per;
}
void fast_desdec(unsigned long& LData,unsigned long& RData,
_int64* compressed_dec_key)
{
int i;
unsigned long per,Rnext;
_int64 exp;
for(i=0;i<15;i++)
{
exp=Expansion(RData);
exp^=compressed_dec_key[i];
per=Substitution(exp);
Rnext=LData^per;
LData=RData;
RData=Rnext;
}
exp=Expansion(RData);
exp^=compressed_dec_key[i];
per=Substitution(exp);
LData^=per;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -