private void ProcessKeyExchange(KeyExchangeRequest Request)
        {
            RSA RSAEncryption = RSA.Create();

            RSAEncryption.KeySize = Request.RSAKeySize;

            RSAParameters PublicParameters = new RSAParameters()
            {
                Exponent = Request.RSAExponent, Modulus = Request.RSAModulus
            };

            RSAEncryption.ImportParameters(PublicParameters);

            Cryptor         = new AesManaged();
            Cryptor.KeySize = Request.AESKeySize;
            Cryptor.GenerateIV();
            Cryptor.GenerateKey();
            Cryptor.Mode    = CipherMode.CBC;
            Cryptor.Padding = PaddingMode.PKCS7;

            KeyExchangeResponse Response = new KeyExchangeResponse()
            {
                Accepted = true, EncryptedAESIV = RSAEncryption.Encrypt(Cryptor.IV, RSAEncryptionPadding.Pkcs1), EncryptedAESKey = RSAEncryption.Encrypt(Cryptor.Key, RSAEncryptionPadding.Pkcs1), ID = Request.ID
            };

            Send(Response);
        }
        public async Task <bool> InitializeEncryption(RSAParameters?Parameters = null, int AESKeySize = 256)
        {
            RSA           RSAEncryption = RSA.Create();
            RSAParameters PublicParameters;

            RSAEncryption.KeySize = Parameters?.D?.Length * 8 ?? 4096;

            if (Parameters != null)
            {
                RSAEncryption.ImportParameters(Parameters.Value);
            }

            PublicParameters = RSAEncryption.ExportParameters(false);

            KeyExchangeRequest Request = new KeyExchangeRequest()
            {
                RSAKeySize = RSAEncryption.KeySize, AESKeySize = AESKeySize, RSAExponent = PublicParameters.Exponent, RSAModulus = PublicParameters.Modulus
            };
            KeyExchangeResponse Response = await Send <KeyExchangeResponse>(Request);

            if (Response?.Accepted ?? false)
            {
                Cryptor         = new AesManaged();
                Cryptor.KeySize = AESKeySize;
                Cryptor.IV      = RSAEncryption.Decrypt(Response.EncryptedAESIV, RSAEncryptionPadding.Pkcs1);
                Cryptor.Key     = RSAEncryption.Decrypt(Response.EncryptedAESKey, RSAEncryptionPadding.Pkcs1);
                Cryptor.Mode    = CipherMode.CBC;
                Cryptor.Padding = PaddingMode.PKCS7;

                return(true);
            }

            return(false);
        }