Пример #1
0
        private bool Decrypt(string sToken)
        {
            byte[] array = new byte[2048];
            this.Clear();
            int num  = sToken.Length;
            int num2 = 0;

            for (int i = 0; i < num; i++)
            {
                int    num3   = num2 >> 3;
                int    num4   = num2 & 7;
                int    num5   = (int)ScrambleTable.ReverseText[(int)sToken[i]];
                int    num6   = 6 - Math.Min(6, 8 - num4);
                byte[] array2 = array;
                int    num7   = num3;
                array2[num7] |= (byte)(num5 << 2 >> num4);
                if (num6 > 0)
                {
                    byte[] array3 = array;
                    int    num8   = num3 + 1;
                    array3[num8] |= (byte)(num5 << 8 - num6 & 255);
                }
                num2 += 6;
            }
            num = num2 + 1 >> 3;
            int num9 = ((int)array[0] << 8 | (int)array[1]) ^ (int)this.m_uPrivateKey;

            for (int i = 2; i < num; i += 2)
            {
                int num10 = (int)array[i] << 8 | (int)array[i + 1];
                array[i]     = (byte)(ScrambleTable.Reverse16[num10] >> 8 & 255);
                array[i + 1] = (byte)(ScrambleTable.Reverse16[num10] & 255);
                int num11 = (int)array[i] << 8 | (int)array[i + 1];
                array[i]     = (byte)((num11 ^ (int)ScrambleTable.Convert16[num9 + 17 & 65535]) >> 8 & 255);
                array[i + 1] = (byte)((num11 ^ (int)ScrambleTable.Convert16[num9 + 17 & 65535]) & 255);
                num9         = num10;
            }
            num = ((int)array[2] << 8 | (int)array[3]);
            int num12 = (num + 1) / 2 * 2;

            this.m_nHashValue = (long)((ulong)array[num12 + 4]);
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 5]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 6]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 7]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 8]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 9]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 10]));
            this.m_nHashValue = (this.m_nHashValue << 8 | (long)((ulong)array[num12 + 11]));
            if (this.m_nHashValue == ParamEncoder.GetHashValue(array, 4, num12))
            {
                Array.Copy(array, 4, this.m_aBuffer, 0, num12);
                this.m_nBufferSize = num;
                return(true);
            }
            return(false);
        }
Пример #2
0
        private string Encrypt()
        {
            byte[] array  = new byte[4096];
            Random random = new Random((int)DateTime.Now.Ticks);
            int    i      = 0;
            int    num    = 0;

            Encoding.ASCII.GetString(this.m_aBuffer);
            int num2 = (this.m_nBufferSize + 1) / 2 * 2;

            this.m_nHashValue = ParamEncoder.GetHashValue(this.m_aBuffer, 0, num2);
            int num3 = random.Next(0, 65535);

            array[0] = (byte)(num3 >> 8 & 255);
            array[1] = (byte)(num3 & 255);
            array[2] = (byte)(this.m_nBufferSize >> 8 & 255);
            array[3] = (byte)(this.m_nBufferSize & 255);
            Array.Copy(this.m_aBuffer, 0, array, 4, num2);
            array[num2 + 4]  = (byte)(this.m_nHashValue >> 56 & 255L);
            array[num2 + 5]  = (byte)(this.m_nHashValue >> 48 & 255L);
            array[num2 + 6]  = (byte)(this.m_nHashValue >> 40 & 255L);
            array[num2 + 7]  = (byte)(this.m_nHashValue >> 32 & 255L);
            array[num2 + 8]  = (byte)(this.m_nHashValue >> 24 & 255L);
            array[num2 + 9]  = (byte)(this.m_nHashValue >> 16 & 255L);
            array[num2 + 10] = (byte)(this.m_nHashValue >> 8 & 255L);
            array[num2 + 11] = (byte)(this.m_nHashValue & 255L);
            array[num2 + 12] = 0;
            for (int j = 2; j < num2 + 12; j += 2)
            {
                int num4 = ((int)array[j - 2] << 8 | (int)array[j - 1]) + 17 & 65535;
                int num5 = (int)array[j] << 8 | (int)array[j + 1];
                num5        ^= (int)ScrambleTable.Convert16[num4];
                array[j]     = (byte)(ScrambleTable.Convert16[num5] >> 8 & 255);
                array[j + 1] = (byte)(ScrambleTable.Convert16[num5] & 255);
            }
            array[0] = (byte)((int)array[0] ^ (this.m_uPrivateKey >> 8 & 255));
            array[1] = (byte)((ushort)array[1] ^ (this.m_uPrivateKey & 255));
            int num6 = num2 + 12 << 3;

            char[] array2 = new char[((num2 + 12) * 8 + 5) / 6];
            while (i < num6)
            {
                int num7  = i >> 3;
                int num8  = i & 7;
                int num9  = 6 - Math.Min(6, 8 - num8);
                int num10 = (int)array[num7] << num8 & 255;
                num10 >>= 2;
                if (num9 > 0)
                {
                    num10 |= array[num7 + 1] >> 8 - num9;
                }
                if (num10 > 64)
                {
                    return(null);
                }
                array2[num] = ScrambleTable.ConvertText[num10];
                num++;
                i += 6;
            }
            return(new string(array2));
        }