MostafaLotfy1999

Untitled

Sep 8th, 2020
929
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2.  
  3. namespace Conquer_Online_Server.Network.Cryptography
  4. {
  5.     public static class AuthCryptography
  6.     {
  7.         class CryptCounter
  8.         {
  9.             UInt16 m_Counter = 0;
  10.  
  11.             public byte Key2
  12.             {
  13.                 get { return (byte)(m_Counter >> 8); }
  14.             }
  15.  
  16.             public byte Key1
  17.             {
  18.                 get { return (byte)(m_Counter & 0xFF); }
  19.             }
  20.  
  21.             public void Increment()
  22.             {
  23.                 m_Counter++;
  24.             }
  25.         }
  26.  
  27.         private static CryptCounter _decryptCounter;
  28.         private static CryptCounter _encryptCounter;
  29.         private static byte[] _cryptKey1;
  30.         private static byte[] _cryptKey2;
  31.         private static byte[] _cryptKey3;
  32.         private static byte[] _cryptKey4;
  33.         private static bool Decrypt2 = false;
  34.  
  35.         public static void PrepareAuthCryptography()
  36.         {
  37.             if (_cryptKey1 != null)
  38.             {
  39.                 if (_cryptKey1.Length != 0)
  40.                     return;
  41.             }
  42.  
  43.             _decryptCounter = new CryptCounter();
  44.             _encryptCounter = new CryptCounter();
  45.             _cryptKey1 = new byte[0x100];
  46.             _cryptKey2 = new byte[0x100];
  47.             byte i_key1 = 0x9D;
  48.             byte i_key2 = 0x62;
  49.             for (int i = 0; i < 0x100; i++)
  50.             {
  51.                 _cryptKey1[i] = i_key1;
  52.                 _cryptKey2[i] = i_key2;
  53.                 i_key1 = (byte)((0x0F + (byte)(i_key1 * 0xFA)) * i_key1 + 0x13);
  54.                 i_key2 = (byte)((0x79 - (byte)(i_key2 * 0x5C)) * i_key2 + 0x6D);
  55.             }
  56.         }
  57.  
  58.         public static void Encrypt(byte[] buffer)
  59.         {
  60.             lock (_encryptCounter)
  61.             {
  62.                 _encryptCounter = new CryptCounter();
  63.                 for (int i = 0; i < buffer.Length; i++)
  64.                 {
  65.                     buffer[i] ^= (byte)0xAB;
  66.                     buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4);
  67.                     buffer[i] ^= (byte)(_cryptKey1[_encryptCounter.Key1] ^ _cryptKey2[_encryptCounter.Key2]);
  68.                     _encryptCounter.Increment();
  69.                 }
  70.             }
  71.         }
  72.  
  73.         public static void Decrypt(byte[] buffer)
  74.         {
  75.             lock (_decryptCounter)
  76.             {
  77.                 _decryptCounter = new CryptCounter();
  78.                 if (!Decrypt2)
  79.                 {
  80.                     for (int i = 0; i < buffer.Length; i++)
  81.                     {
  82.                         buffer[i] ^= (byte)0xAB;
  83.                         buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4);
  84.                         buffer[i] ^= (byte)(_cryptKey2[_decryptCounter.Key2] ^ _cryptKey1[_decryptCounter.Key1]);
  85.                         _decryptCounter.Increment();
  86.                     }
  87.                 }
  88.                 else
  89.                 {
  90.                     for (int i = 0; i < buffer.Length; i++)
  91.                     {
  92.                         buffer[i] ^= (byte)0xAB;
  93.                         buffer[i] = (byte)(buffer[i] >> 4 | buffer[i] << 4);
  94.                         buffer[i] ^= (byte)(_cryptKey4[_decryptCounter.Key2] ^ _cryptKey3[_decryptCounter.Key1]);
  95.                         _decryptCounter.Increment();
  96.                     }
  97.                 }
  98.             }
  99.         }
  100.  
  101.         public static void GenerateKeys(UInt32 CryptoKey, UInt32 AccountID)
  102.         {
  103.             UInt32 tmpkey1 = 0, tmpkey2 = 0;
  104.             tmpkey1 = ((CryptoKey + AccountID) ^ (0x4321)) ^ CryptoKey;
  105.             tmpkey2 = tmpkey1 * tmpkey1;
  106.             _cryptKey3 = new byte[256];
  107.             _cryptKey4 = new byte[256];
  108.  
  109.             for (int i = 0; i < 256; i++)
  110.             {
  111.                 int right = ((3 - (i % 4)) * 8);
  112.                 int left = ((i % 4)) * 8 + right;
  113.                 _cryptKey3[i] = (byte)(_cryptKey1[i] ^ tmpkey1 << right >> left);
  114.                 _cryptKey4[i] = (byte)(_cryptKey2[i] ^ tmpkey2 << right >> left);
  115.             }
  116.             Decrypt2 = true;
  117.         }
  118.         public static void GenerateKeys2(byte[] InKey1, byte[] InKey2)
  119.         {
  120.             byte[] addKey1 = new byte[4];
  121.             byte[] addKey2 = new byte[4];
  122.             byte[] addResult = new byte[4];
  123.             //addKey1.i = 0;
  124.             //addKey2.i = 0;
  125.             byte[] tempKey = new byte[4];
  126.  
  127.             long LMULer;
  128.             //          InKey1[0] = 0x20;
  129.             //          InKey1[1] = 0x5c;
  130.             //          InKey1[2] = 0x48;
  131.             //          InKey1[3] = 0xf4;
  132.             //          InKey2[0] = 0x00;
  133.             //          InKey2[1] = 0x44;
  134.             //          InKey2[2] = 0xa6;
  135.             //          InKey2[3] = 0x2e;
  136.  
  137.             //if (Key3) delete [] Key3;
  138.             //if (Key4) delete [] Key4;
  139.             _cryptKey3 = new byte[256];
  140.             _cryptKey4 = new byte[256];
  141.             for (int x = 0; x < 4; x++)
  142.             {
  143.                 addKey1[x] = InKey1[3 - x];
  144.                 addKey2[x] = InKey2[3 - x];
  145.             }
  146.             //cout << "Key1: " << addKey1.i << endl;
  147.             //cout << "Key2: " << addKey2.i << endl;
  148.             uint Adder1;
  149.             uint Adder2;
  150.             uint Adder3;
  151.             Adder1 = (uint)((addKey1[3] << 24) | (addKey1[2] << 16) | (addKey1[1] << 8) | (addKey1[0]));
  152.             Adder2 = (uint)((addKey2[3] << 24) | (addKey2[2] << 16) | (addKey2[1] << 8) | (addKey2[0]));
  153.             Adder3 = Adder1 + Adder2;
  154.             addResult[0] = (byte)(Adder3 & 0xff);
  155.             addResult[1] = (byte)((Adder3 >> 8) & 0xff);
  156.             addResult[2] = (byte)((Adder3 >> 16) & 0xff);
  157.             addResult[3] = (byte)((Adder3 >> 24) & 0xff);
  158.             for (int b = 3; b >= 0; b--)
  159.             {
  160.                 //  printf("%.2x ", addResult.c[b]);
  161.                 tempKey[3 - b] = addResult[b];
  162.             }
  163.             tempKey[2] = (byte)(tempKey[2] ^ (byte)0x43);
  164.             tempKey[3] = (byte)(tempKey[3] ^ (byte)0x21);
  165.  
  166.             for (int b = 0; b < 4; b++)
  167.             {
  168.                 tempKey[b] = (byte)(tempKey[b] ^ InKey1[b]);
  169.             }
  170.  
  171.             //Build the 3rd Key
  172.             for (int b = 0; b < 256; b++)
  173.             {
  174.                 _cryptKey3[b] = (byte)(tempKey[3 - (b % 4)] ^ _cryptKey1[b]);
  175.             }
  176.  
  177.  
  178.             for (int x = 0; x < 4; x++)
  179.             {
  180.                 addResult[x] = tempKey[3 - x];
  181.             }
  182.             Adder3 = (uint)((addResult[3] << 24) | (addResult[2] << 16) | (addResult[1] << 8) | (addResult[0]));
  183.             LMULer = Adder3 * Adder3;
  184.             LMULer = LMULer << 32;
  185.             LMULer = LMULer >> 32;
  186.  
  187.             Adder3 = Convert.ToUInt32(LMULer & 0xffffffff);
  188.  
  189.             addResult[0] = (byte)(Adder3 & 0xff);
  190.             addResult[1] = (byte)((Adder3 >> 8) & 0xff);
  191.             addResult[2] = (byte)((Adder3 >> 16) & 0xff);
  192.             addResult[3] = (byte)((Adder3 >> 24) & 0xff);
  193.  
  194.             for (int b = 3; b >= 0; b--)
  195.             {
  196.                 tempKey[3 - b] = addResult[b];
  197.             }
  198.             //Build the 4th Key
  199.             for (int b = 0; b < 256; b++)
  200.             {
  201.                 _cryptKey4[b] = Convert.ToByte(tempKey[3 - (b % 4)] ^ _cryptKey2[b]);
  202.             }
  203.             Decrypt2 = true;
  204.             //cout << "Int representation: " << charadd.i << endl;
  205.         }
  206.     }
  207. }
  208.  
RAW Paste Data