csharp/499116344/qqProtocol/QQ.Framework/Utils/XXTeaCrypter.cs

XXTeaCrypter.cs
namespace QQ.Framework.Utils
{
    public static clast XXTeaCrypter
    {
        public static byte[] Encrypt(byte[] data, byte[] key)
        {
            if (data.Length == 0)
            {
                return data;
            }

            return ToByteArray(Encrypt(ToUInt32Array(data, true), ToUInt32Array(key, false)), false);
        }

        public static byte[] Decrypt(byte[] data, byte[] key)
        {
            try
            {
                return data.Length == 0
                    ? data
                    : ToByteArray(Decrypt(ToUInt32Array(data, false), ToUInt32Array(key, false)), true);
            }
            catch
            {
                return null;
            }
        }

        public static uint[] Encrypt(uint[] v, uint[] k)
        {
            var num = v.Length - 1;
            if (num < 1)
            {
                return v;
            }

            if (k.Length < 4)
            {
                var array = new uint[4];
                k.CopyTo(array, 0);
                k = array;
            }

            var num2 = v[num];
            var num9 = v[0];
            var num3 = 2654435769u;
            var num4 = 0u;
            var num5 = 6 + 52 / (num + 1);
            while (num5-- > 0)
            {
                num4 += num3;
                var num7 = (num4 >> 2) & 3;
                int i;
                uint num8;
                for (i = 0; i < num; i++)
                {
                    num8 = v[i + 1];
                    num2 = v[i] += (((num2 >> 5) ^ (num8 > 3) ^ (num2 > 5) ^ (num8 > 3) ^ (num2 > 2) & 3;
                int num7;
                uint num8;
                for (num7 = num; num7 > 0; num7--)
                {
                    num8 = v[num7 - 1];
                    num2 = v[num7] -= (((num8 >> 5) ^ (num2 > 3) ^ (num8 > 5) ^ (num2 > 3) ^ (num8 > 2 : (data.Length >> 2) + 1;
            uint[] array;
            if (includeLength)
            {
                array = new uint[num + 1];
                array[num] = (uint) data.Length;
            }
            else
            {
                array = new uint[num];
            }

            num = data.Length;
            for (var i = 0; i < num; i++)
            {
                array[i >> 2] |= (uint) (data[i] > ((i & 3)