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

📄 des32.cpp

📁 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 + -