Ejemplo n.º 1
0
        public static byte[] Decrypt(byte[] Payload, KeyPair keyPair)
        {
            ushort Id;
            int    Length;
            ushort Version;

            using (Reader reader = new Reader(Payload))
            {
                Id      = reader.ReadUInt16();
                Length  = reader.ReadInt24();
                Version = reader.ReadUInt16();
                Payload = Payload.Skip(2).Skip(3).Skip(2).ToArray();
            }
            if (!Form1.Config.UseRC4)
            {
                switch (Id)
                {
                case 20100:
                    decryptedPayload = Payload;
                    break;

                case 20103:
                    decryptedPayload = Payload;
                    break;

                case 20104:
                    ClientConfig.ServerNonce = GenericHash.Hash(ClientConfig.SNonce.Concat(keyPair.PublicKey).Concat(Keys.ServerKey).ToArray(), null, 24);
                    decryptedPayload         = PublicKeyBox.Open(Payload, ClientConfig.ServerNonce, keyPair.PrivateKey, Keys.ServerKey);
                    ClientConfig.RNonce      = decryptedPayload.Take(24).ToArray();
                    ClientConfig.SharedKey   = decryptedPayload.Skip(24).Take(32).ToArray();
                    decryptedPayload         = decryptedPayload.Skip(24).Skip(32).ToArray();
                    break;

                default:
                    ClientConfig.RNonce = Utilities.Increment(Utilities.Increment(ClientConfig.RNonce));
                    byte[] toDecrypt = new byte[16].Concat(Payload).ToArray();
                    decryptedPayload = SecretBox.Open(toDecrypt, ClientConfig.RNonce, ClientConfig.SharedKey);
                    Logger.Write(Encoding.UTF8.GetString(decryptedPayload), "Decrypted OHD");
                    break;
                }
            }
            else if (Form1.Config.UseRC4)
            {
                decryptedPayload = RC4.Decrypt(Payload);
            }
            else
            {
            }
            return(decryptedPayload);
        }