📄 des32.cpp
字号:
#include "stdafx.h"
#include "windows.h"
#include "des32.h"
#ifdef _WIN32
#define _DES32_ASM_
#else
#endif
#ifdef _DES32_ASM_
VOID EncryptDes32( DWORD key, BYTE *pSrc, BYTE *pDest, DWORD len )
{
WORD wSubKey[4];
LPVOID psubkey = wSubKey;
int i;
for( i = 0; i < 4; i++ )
{
wSubKey[i] = LOWORD( key );
key = key>>4;
}
__asm
{
mov esi, pSrc
mov edi, pDest
mov edx, psubkey
looplb:
cmp len, 4
jb outloop
mov eax, dword ptr [esi]
mov bx, ax
shr eax, 16
add esi, 4 // now ax is R, bx is L
mov cx, word ptr [edx] //subkey[0]
add cx, ax
xor bx, cx
mov cx, word ptr [edx+2] //subkey[1]
add cx, bx
xor ax, cx
ror bx, 8
ror ax, 8 // now bx is R, ax is L
mov cx, [edx+4] //subkey[2]
add cx, bx
xor ax, cx
mov cx, [edx+6] //subkey[3]
add cx, ax
xor bx, cx
ror ax, 8
ror bx, 8 // now ax is R, bx is L
mov cx, [edx+6] //subkey[3]
add cx, ax
xor bx, cx
mov cx, [edx+4] //subkey[2]
add cx, bx
xor ax, cx
ror bx, 8
ror ax, 8 // now bx is R, ax is L
mov cx, [edx+2] //subkey[1]
add cx, bx
xor ax, cx
mov cx, [edx] //subkey[0]
add cx, ax
xor bx, cx
shl eax, 16 // ax=0
or ax, bx //eax == LR(HIWORD,LOWORD)
mov dword ptr [edi], eax
add edi, 4
sub len, 4
jmp looplb
outloop:
mov ecx, len
surloop:
cmp ecx, 0
je quit
mov ah, byte ptr [esi]
not ah
mov byte ptr [edi], ah
inc esi
inc edi
dec ecx
jmp surloop
quit:
}
}
#else
VOID EncryptDes32( DWORD key, BYTE *pSrc, BYTE *pDest, DWORD len )
{
WORD wSubKey[4], L, R, t;
int i;
for( i = 0; i < 4; i++ )
{
wSubKey[i] = LOWORD( key );
key = key>>4;
}
while( len >=4 )
{
L = *(WORD*)pSrc;
pSrc += 2;
R = *(WORD*)pSrc;
pSrc += 2;
L = ( R+wSubKey[0] )^L;
R = (L+wSubKey[1])^R;
t = L;
L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
R = MAKEWORD( HIBYTE(t), LOBYTE(t) );
L = ( R+wSubKey[2] )^L;
R = (L+wSubKey[3])^R;
t = L;
L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
R = MAKEWORD( HIBYTE(t), LOBYTE(t) );
L = ( R+wSubKey[3] )^L;
R = (L+wSubKey[2])^R;
t = L;
L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
R = MAKEWORD( HIBYTE(t), LOBYTE(t) );
L = ( R+wSubKey[1] )^L;
R = (L+wSubKey[0])^R;
t = L;
L = R;
R = t;
*((DWORD*)pDest) = MAKELONG( L, R );
pDest += 4;
len -= 4;
}//while
for( i = 0; i < (int)len; i++ )
*pDest++ = ~(*pSrc++);
}
#endif //_DES32_ASM_
#undef _DES32_ASM_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -