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); }
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)); }