#include "stdafx.h" #include "BitOperation.h" BitOp::BitOp() { m_bInited = FALSE; m_encKey = 0; m_decKey = 0; m_encKey = 0; m_decKey = 0; m_Keys.Initialize( (DWORD)'b', 'i', 't' ); } inline DWORD BitOp::ConvertDWORD( DWORD src, DWORD mask ) { if( MASK::c_WORD & mask ) src = (src<<16) | (src>>16); if( MASK::c_BYTE & mask ) src = ((src<<8)&0xFF00FF00) | ((src>>8)&0x00FF00FF); if( MASK::c_4BIT & mask ) src = ((src<<4)&0xF0F0F0F0) | ((src>>4)&0x0F0F0F0F); if( MASK::c_2BIT & mask ) src = ((src<<2)&0xCCCCCCCC) | ((src>>2)&0x33333333); if( MASK::c_1BIT & mask ) src = ((src<<1)&0xAAAAAAAA) | ((src>>1)&0x55555555); return src; } inline WORD BitOp::ConvertWORD( WORD src, DWORD mask ) { if( MASK::c_BYTE & mask ) src = ((src<<8)&0xFF00FF00) | ((src>>8)&0x00FF00FF); if( MASK::c_4BIT & mask ) src = ((src<<4)&0xF0F0F0F0) | ((src>>4)&0x0F0F0F0F); if( MASK::c_2BIT & mask ) src = ((src<<2)&0xCCCCCCCC) | ((src>>2)&0x33333333); if( MASK::c_1BIT & mask ) src = ((src<<1)&0xAAAAAAAA) | ((src>>1)&0x55555555); return src; } inline BYTE BitOp::ConvertBYTE( BYTE src, DWORD mask ) { if( MASK::c_4BIT & mask ) src = ((src<<4)&0xF0F0F0F0) | ((src>>4)&0x0F0F0F0F); if( MASK::c_2BIT & mask ) src = ((src<<2)&0xCCCCCCCC) | ((src>>2)&0x33333333); if( MASK::c_1BIT & mask ) src = ((src<<1)&0xAAAAAAAA) | ((src>>1)&0x55555555); return src; } union U42 { DWORD* pDW; WORD* pW; BYTE* pB; }; void BitOp::EnCode(BYTE* IN OUT pSrc, DWORD uiSize, BYTE& crc ) { m_encKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwBaseKey ); m_decKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwPairKey ); m_Keys.NextRoundSNKey4Solar(); DWORD re = uiSize%sizeof(DWORD); BYTE checkSum = 0; U42 off; DWORD dwTempKey = ((DWORD)m_encKey << 24) | ((DWORD)m_encKey^(DWORD)m_decKey)<<16 | ((DWORD)m_decKey<<8) | (DWORD)m_encKey|(DWORD)m_decKey; off.pB = pSrc; DWORD dwSize = (DWORD)(uiSize/sizeof(DWORD)); //_tprintf( "DWORD size %d : remain %d\n", dwSize, re ); for( DWORD i=0 ; i