📄 xxtea.cpp
字号:
#include "StdAfx.h"
#include ".\xxtea.h"
CXXTea::CXXTea(void)
{
}
CXXTea::~CXXTea(void)
{
}
bool CXXTea::encrypt(CArray<unsigned char,unsigned char> & result, const unsigned char* pData, int nDataLen, const unsigned char* pKey, int nKeyLen)
{
if (nKeyLen == 0) {
return false;
}
CArray<int,int> data;
CArray<int,int> key;
toIntArray(data,pData,nDataLen,true);
toIntArray(key,pKey,nKeyLen,false);
toByteArray(result,encrypt(data, key),false);
return true;
//return toByteArray(encrypt(toIntArray(data, true), toIntArray(key, false)), false);
}
bool CXXTea::decrypt(CArray<unsigned char,unsigned char> & result, const unsigned char* pData, int nDataLen, const unsigned char* pKey, int nKeyLen)
{
if (nDataLen == 0) {
return false;
}
CArray<int,int> data;
CArray<int,int> key;
toIntArray(data,pData,nDataLen,false);
toIntArray(key,pKey,nKeyLen,false);
toByteArray(result,decrypt(data, key),true);
return true;
//return toByteArray(decrypt(toIntArray(data, false), toIntArray(key, false)), true);
}
#define MX ((unsigned int)z >> 5 ^ y << 2) + ((unsigned int)y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z)
CArray<int,int> & CXXTea::encrypt(CArray<int,int> & v, CArray<int,int> & k)
{
int n = (int)v.GetCount() - 1;
if (n < 1) {
return v;
}
if (k.GetCount() < 4) {
k.SetSize(4);
}
int z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e;
int p, q = 6 + 52 / (n + 1);
while (q-- > 0) {
sum += delta;
e = (unsigned int)sum >> 2 & 3;
for (p = 0; p < n; p++) {
y = v[p + 1];
z = (v[p] += MX);
}
y = v[0];
z = (v[n] += MX);
}
return v;
}
CArray<int,int> & CXXTea::decrypt(CArray<int,int> & v, CArray<int,int> & k)
{
int n = (int)v.GetCount() - 1;
if (n < 1) {
return v;
}
if (k.GetCount() < 4) {
k.SetSize(4);
}
//delta = 0x9E3779B9
int z = v[n], y = v[0], delta = 0x9E3779B9, sum, e;
int p, q = 6 + 52 / (n + 1);
sum = q * delta;
while (sum != 0) {
e = (unsigned int)sum >> 2 & 3;
for (p = n; p > 0; p--) {
z = v[p - 1];
y = (v[p] -= MX);
}
z = v[n];
y = (v[0] -= MX);
sum -= delta;
}
return v;
}
void CXXTea::toIntArray(CArray<int,int>& result, const unsigned char * pData, unsigned nDataLen, bool includeLength)
{
int n = (((nDataLen & 3) == 0) ? ((unsigned int)nDataLen >> 2)
: (((unsigned int)nDataLen >> 2) + 1));
//int[] result;
if (includeLength) {
result.SetSize(n + 1);
//result = new int[n + 1];
result[n] = nDataLen;
} else {
result.SetSize(n);
}
n = nDataLen;
for (int i = 0; i < n; i++) {
result[(unsigned int)i >> 2] |= (0x000000ff & pData[i]) << ((i & 3) << 3);
}
}
void CXXTea::toByteArray(CArray<unsigned char,unsigned char>& result, CArray<int,int>& data, bool includeLength)
{
int n = data.GetCount() << 2;
if (includeLength) {
int m = data[data.GetCount() - 1];
if (m > n) {
return;
} else {
n = m;
}
}
result.SetSize(n);
for (int i = 0; i < n; i++) {
result[i] = (byte) ((data[i >> 2] >> ((i & 3) << 3)) & 0xff);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -