我要XXTEA(MFC)的算法
谁有?
或者给个URL
谁有?
或者给个URL
解决方案 »
- 咨询
- 图像识别
- runtime error 问题
- AfxBeginThread 调用的多次,在结束的时候就报错了,在线程结束的时候要怎么写才能避免
- WSAGetLastError()结果为10106,怎么解决?
- 菜鸟提问:Platform SDK怎么用啊
- 怎么就没有一个windows系统程序支持一种3D模型文件标准格式?
- 怎样在对话框上画一条指定粗细及线型的线条。
- 哪有好的vc做数据库的资料啊?
- 希望能合作开发.
- opengl中画圆锥的问题
- 'wcscpy' : cannot convert parameter 2 from 'const class CString' to 'const unsigned short *' 这个如何解决?
class CXXTea
{
public:
/**
* Encrypt data with key.
*
* @param data
* @param key
* @return
*/
static bool 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);
} ///**
// * Decrypt data with key.
// *
// * @param data
// * @param key
// * @return
// */
static bool 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);
} /**
* Encrypt data with key.
*
* @param v
* @param k
* @return
*/
static CArray<int,int> & 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] += ((unsigned int)z >> 5 ^ y << 2) + ((unsigned int)y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
}
y = v[0];
z = (v[n] += ((unsigned int)z >> 5 ^ y << 2) + ((unsigned int)y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
} return v;
} /**
* Decrypt data with key.
*
* @param v
* @param k
* @return
*/
static CArray<int,int> & 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);
}
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] -= ((unsigned int)z >> 5 ^ y << 2) + ((unsigned int)y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
}
z = v[n];
y = v[0] -= ((unsigned int)z >> 5 ^ y << 2) + ((unsigned int)y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
sum -= delta;
sum -= delta >> 1;
}
return v;
}private: static void 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)); 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);
}
} static void 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);
}
}};
我用的是MFC
不太了解是不是C++中写的就一定可以放在MFC中应用,我的理解应该是不可以,都不一样的写法,谢谢啊