我要XXTEA(MFC)的算法
谁有?
或者给个URL

解决方案 »

  1.   

    http://blog.chinaunix.net/u1/44087/showart_379001.html
      

  2.   

    这个里面都有,不过是 pascal 的http://www.shokhirev.com/nikolai/programs/code/Cryptography/uTeaSet_pas.html
      

  3.   

    谢谢啊,是delphi,可我只要MFC的,因为我不太懂MFC,不会改,知道xxtea改起来不难,难就难在我不太会MFC,哎,郁闷
      

  4.   

    这是我译的代码
    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);
            }
    }};
      

  5.   

    给你加分算了,好人啊
    我用的是MFC
    不太了解是不是C++中写的就一定可以放在MFC中应用,我的理解应该是不可以,都不一样的写法,谢谢啊