// xxTea.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <tchar.h>
#include "xxTea.h"
BOOL xxTeaDecrypt(PLONG v, LONG n, PLONG k)
{
unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
LONG p, q ;
if (n > 1)
{/* Decoding Part */
q = 6 + 52/n;
sum = q*DELTA ;
while (sum != 0)
{
e = (sum >> 2) & 3;
for (p=n-1; p>0; p--)
{
z = v[p-1], y = v[p] -= MX;
}
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
}
return TRUE;
}
return FALSE;
}
BOOL xxTeaEncrypt(PLONG v, LONG n, PLONG k)
{
ULONG z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
LONG p, q ;
if (n > 1)
{/* Coding Part */
q = 6 + 52/n;
while (q-- > 0)
{
sum += DELTA;
e = (sum >> 2) & 3;
for (p=0; p<n-1; p++)
{
y = v[p+1], z = v[p] += MX;
}
y = v[0];
z = v[n-1] += MX;
}
return TRUE ;
}
return FALSE;
}
DWORD LongLen(PLONG plData)
{
DWORD dwLen = 0;
while(*plData!=0x0)
{
plData++;
dwLen++;
}
return dwLen;
}
PCHAR LongToStr(PLONG plData)
{
DWORD dwLongLen = LongLen(plData)+1;
PCHAR pszStr = new CHAR[dwLongLen*ULONGSIZE];
for(DWORD i=0; i<dwLongLen; i++)
{
DWORD dwBase = i*ULONGSIZE;
for (DWORD j=0; j<ULONGSIZE; j++)
{
pszStr[dwBase+j] = (plData[i]>>(8*j))&0xFF;
}
}
return pszStr;
}
PCHAR LongToHexStr(PLONG plData)
{
DWORD dwLongLen = LongLen(plData)+1;
PCHAR pszStr = new CHAR[dwLongLen*ULONGSIZE];
for(DWORD i=0; i<dwLongLen; i++)
{
DWORD dwBase = i*ULONGSIZE;
for (DWORD j=0; j<ULONGSIZE; j++)
{
pszStr[dwBase+j] = (plData[i]>>(8*j))&0xFF;
}
}
return pszStr;
}
PLONG StrToLong(PCHAR pszStr, DWORD dwStrLen)
{
DWORD dwLonglen = (dwStrLen>>2)+1;
PLONG pLongVar = new LONG[dwLonglen+1];
ZeroMemory(pLongVar, (dwLonglen+1)*4);
for(DWORD i = 0; i<dwLonglen; i++)
{
DWORD dwBase = i*ULONGSIZE;
DWORD dwLeft = dwStrLen-dwBase;
dwLeft = (ULONGSIZE<dwLeft)?ULONGSIZE:dwLeft;
for(DWORD j = 0; j<dwLeft; j++)
{
ULONG lTmp = 0;
lTmp = (UCHAR)pszStr[dwBase+j];
pLongVar[i] |= lTmp<<(8*j);
}
}
return pLongVar;
}
PCHAR xxTeaEncryptStr(PCHAR pszStr, PCHAR pszKey, DWORD dwDataLen)
{
PCHAR pszEncStr = NULL;
PLONG plData = StrToLong(pszStr, dwDataLen);
PLONG plKey = StrToLong(pszKey, lstrlenA(pszKey));
xxTeaEncrypt(plData, LongLen(plData), plKey);
pszEncStr = LongToStr(plData);
delete []plData;
delete []plKey;
return pszEncStr;
}
PCHAR xxTeaDecryptStr(PCHAR pszData, PCHAR pszKey, DWORD dwDataLen)
{
PCHAR pszDecStr = NULL;
PLONG plData = StrToLong(pszData, dwDataLen);
PLONG plKey = StrToLong(pszKey, lstrlenA(pszKey));
xxTeaDecrypt(plData, LongLen(plData), plKey);
pszDecStr = LongToStr(plData);
delete []plData;
delete []plKey;
return pszDecStr;
}
/*
int _tmain(int argc, _TCHAR* argv[])
{
PCHAR pszKey = "AAAABBCDd";
PCHAR pszStr = "Hello, xxTea!";
PLONG plData = StrToLong(pszStr);
printf((PCHAR)plData);
printf("\n");
xxTeaEncrypt(plData, LongLen(plData), StrToLong(pszKey));
printf(LongToHexStr(plData));
printf("\n");
xxTeaDecrypt(plData, LongLen(plData), StrToLong(pszKey));
printf(LongToStr(plData));
printf("\n");
delete []plData;
getchar();
return 0;
}
*/