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

📄 des32.cpp

📁 DES32加密解密算法
💻 CPP
字号:
#include "stdafx.h"
#include "des32.h"

#ifdef	_WIN32
#define _DES32_ASM_
#else
#endif

CDes32::CDes32( DWORD key )
{
	for( int i=0; i<4; i++ )
	{
		m_SubKey[i] = LOWORD( key );
		key = key>>4;
	}
}

#ifdef _DES32_ASM_

void CDes32::Encrypt( BYTE *pSrc, BYTE *pDest, DWORD len )
{
	__asm
	{
		mov		esi, pSrc
		mov		edi, pDest
		mov		edx, this

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 CDes32::Encrypt( BYTE *pSrc, BYTE *pDest, DWORD len )
{
	WORD L,R,t;

	while( len >=4 )
	{
		L = *(WORD*)pSrc;
		pSrc += 2;
		R = *(WORD*)pSrc;
		pSrc += 2;

		L = ( R+m_SubKey[0] )^L;
		R = (L+m_SubKey[1])^R;
		t = L;
		L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
		R = MAKEWORD( HIBYTE(t), LOBYTE(t) );

		L = ( R+m_SubKey[2] )^L;
		R = (L+m_SubKey[3])^R;
		t = L;
		L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
		R = MAKEWORD( HIBYTE(t), LOBYTE(t) );

		L = ( R+m_SubKey[3] )^L;
		R = (L+m_SubKey[2])^R;
		t = L;
		L = MAKEWORD( HIBYTE(R), LOBYTE(R) );
		R = MAKEWORD( HIBYTE(t), LOBYTE(t) );

		L = ( R+m_SubKey[1] )^L;
		R = (L+m_SubKey[0])^R;
		t = L;
		L = R;
		R = t;

		*((DWORD*)pDest) = MAKELONG( L, R );
		pDest += 4;
		len -= 4;
	}//while
	for( DWORD i=0; i<len; i++ )
		*pDest++ = ~(*pSrc++);
}

#endif //_DES32_ASM_
#undef _DES32_ASM_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -