⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xxtea.cpp

📁 xxtea 加解密算法 MFC 实现
💻 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 + -