Ultima modifica da un moderatore:
Nel caso in cui vi servisse...
Codice:
void CPacket::Encrypt(INT64 key)
{
if(!m_pHeader) return;
INT64 llCheckSum = 0;
DWORD dwDataSize = m_pHeader->m_wSize - PACKET_HEADER_SIZE;
DWORD body = dwDataSize / sizeof(INT64);
DWORD left = dwDataSize % sizeof(INT64);
PINT64 lpBody = (PINT64)(m_pBuf + PACKET_HEADER_SIZE);
for(DWORD i = 0; i < body; i++)
{
llCheckSum ^= lpBody[i];
lpBody[i] ^= key;
}
LPBYTE lpLeft = (LPBYTE)&lpBody[i];
LPBYTE pchKey = (LPBYTE)&key;
for(i = 0; i < left; i++)
{
llCheckSum ^=(BYTE)lpLeft[i];
lpLeft[i] ^= (BYTE)pchKey[i];
}
m_pHeader->m_llChkSUM = llCheckSum;
}
void CPacket::EncryptHeader(INT64 key)
{
if(!m_pHeader) return;
LPBYTE lpHeader = (LPBYTE)((LPBYTE)m_pHeader+sizeof(WORD));
WORD wID = m_pHeader->m_wID;
for(BYTE i=0; i<PACKET_HEADER_SIZE-sizeof(WORD); i++)
{
if(i<2)
lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wSize + i);
else
lpHeader[i] ^= (BYTE)(key + wID + i);
}
}
BOOL CPacket::Decrypt(INT64 key)
{
if(!m_pHeader) return FALSE;
INT64 llCheckSum1 = 0;
INT64 llCheckSum2 = m_pHeader->m_llChkSUM;
DWORD dwDataSize = m_pHeader->m_wSize - PACKET_HEADER_SIZE;
DWORD body = dwDataSize / sizeof(INT64);
DWORD left = dwDataSize % sizeof(INT64);
PINT64 lpBody = (PINT64)(m_pBuf + PACKET_HEADER_SIZE);
for(DWORD i = 0; i < body; i++)
{
lpBody[i] ^= key;
llCheckSum1 ^= lpBody[i];
}
LPBYTE lpLeft = (LPBYTE)&lpBody[i];
LPBYTE pchKey = (LPBYTE)&key;
for(i = 0; i < left; i++)
{
lpLeft[i] ^= (BYTE)pchKey[i];
llCheckSum1 ^= (BYTE)lpLeft[i];
}
if( llCheckSum1 != llCheckSum2 ) return FALSE;
return TRUE;
}
void CPacket::DecryptHeader(INT64 key)
{
if(!m_pHeader) return;
LPBYTE lpHeader = (LPBYTE)((LPBYTE)m_pHeader+sizeof(WORD));
for(BYTE i=0; i<PACKET_HEADER_SIZE-sizeof(WORD); i++)
{
if(i<2)
lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wSize + i);
else
lpHeader[i] ^= (BYTE)(key + m_pHeader->m_wID + i);
}
}