Files
Sun1602/Server/MolaCrypt/SRC.MOLA_DDA/JSCode.cpp
T
2022-10-26 12:25:11 +08:00

144 lines
2.8 KiB
C++

#include "stdafx.h"
#include "JSCode.h"
JSCode::JSCode()
{
Init();
}
VOID JSCode::Init()
{
m_bAction = 0;
m_encKey = 0;
m_decKey = 0;
m_Keys.Initialize( (DWORD)'J', 'S', 'C' );
}
VOID JSCode::EnCode(BYTE* IN OUT pSrc, DWORD uiSize, BYTE& crc )
{
if(!m_bAction) return;
if( pSrc == NULL ) return;
m_encKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwBaseKey );
m_decKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwPairKey );
m_Keys.NextRoundSNKey4Solar();
//m_encKey++; m_decKey++;
//BYTE local_key1 = m_encKey;
//BYTE local_key2 = m_decKey;
//BYTE local_key2_prev;
//// EnCode와 CheckSum을 동시에 실행한다.
//BYTE cCheckSum = 0;
//for(int i=0; i < uiSize; i++)
//{
// local_key2_prev = local_key2;
// local_key1 ^= pSrc[i];
// local_key2 += pSrc[i];
// pSrc[i] = local_key1 + local_key2_prev;
// cCheckSum ^= pSrc[i];
//}
DWORD re = uiSize%sizeof(DWORD);
DWORD* off = (DWORD*)pSrc;
DWORD dwSize = (DWORD)(uiSize/sizeof(DWORD));
DWORD local_key1
= ((DWORD)m_encKey << 24)
| ((DWORD)m_encKey^(DWORD)m_decKey)<<16
| ((DWORD)m_decKey<<8)
| (DWORD)m_encKey|(DWORD)m_decKey;
DWORD local_key2 = ~local_key1;
DWORD local_key2_prev;
BYTE cCheckSum = 0;
for( DWORD i=0 ; i<dwSize ; ++i )
{
local_key2_prev = local_key2;
local_key1 ^= *off;
local_key2 += *off;
*off = local_key1 + local_key2_prev;
cCheckSum ^= (*off)&0xFF;
off++;
}
for( DWORD i=(uiSize-re) ; i<uiSize ; ++i )
{
pSrc[i] = pSrc[i]^m_decKey;
cCheckSum ^= pSrc[i];
}
crc = cCheckSum^m_decKey;
}
BOOL JSCode::DeCode(BYTE* IN OUT pSrc, DWORD uiSize, BYTE& crc )
{
if(!m_bAction || !pSrc ) return FALSE;
m_encKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwBaseKey );
m_decKey = m_Keys.GetSolarSNKey( RandomSNKey::c_dwPairKey );
m_Keys.NextRoundSNKey4Solar();
//m_encKey++; m_decKey++;
//BYTE local_key1 = m_encKey;
//BYTE local_key2 = m_decKey;
//// DeCode를 하기전에 ChekcSum을 구한다.
//BYTE cCheckSum = 0;
//for(int i=0; i < uiSize; i++)
//{
// cCheckSum ^= pSrc[i];
// pSrc[i] = (pSrc[i] - local_key2) ^ local_key1;
// local_key1 ^= pSrc[i];
// local_key2 += pSrc[i];
//}
DWORD re = uiSize%sizeof(DWORD);
DWORD* off = (DWORD*)pSrc;
DWORD dwSize = (DWORD)(uiSize/sizeof(DWORD));
DWORD local_key1
= ((DWORD)m_encKey << 24)
| ((DWORD)m_encKey^(DWORD)m_decKey)<<16
| ((DWORD)m_decKey<<8)
| (DWORD)m_encKey|(DWORD)m_decKey;
DWORD local_key2 = ~local_key1;
//DWORD local_key2_prev;
BYTE cCheckSum = 0;
crc = crc^m_decKey;
for( DWORD i=(uiSize-re) ; i<uiSize ; ++i )
{
cCheckSum ^= pSrc[i];
pSrc[i] = pSrc[i]^m_decKey;
}
for( DWORD i=0 ; i<dwSize ; ++i )
{
cCheckSum ^= (*off)&0xFF;
*off = (*off - local_key2) ^ local_key1;
local_key1 ^= *off;
local_key2 += *off;
off++;
}
if(crc == cCheckSum)
return TRUE;
else
{
//_tprintf("JSCode : [DeCode] CheckSum Error! \n");
return FALSE;
}
}