/// <summary>
        ///     Encrypts the specified plain data.
        /// </summary>
        /// <param name="plainData">The plain data.</param>
        /// <param name="remotePublicKeyXML">The remote public key XML.</param>
        /// <returns>
        ///     The encrypted data.
        /// </returns>
        /// <externalUnit/>
        /// <revision revisor="dev01" date="1/26/2009" version="1.0.5.7">
        ///     Member Created
        /// </revision>
        public byte[] Encrypt(
            byte[] plainData,
            string remotePublicKeyXML)
        {
            // Ecnrypted data placeholder
            byte[] encryptedData = null;

            //Calculate the hash and append it to the data
            byte[] dataPlusHash =
                SequoiaCryptoProvider.AppendArrays(
                    this.CalculateHash(plainData),
                    plainData);

            // Symmetrically Encrypt data and hash with random key and IV
            byte[] encryptedDataPlusHash =
                this.SymmetricallyEncryptContent(dataPlusHash);

            // Create an Encrypted transport Key
            var transKey = new TransportKey(
                this.SymmetricCrypto.Key,
                this.SymmetricCrypto.IV,
                this);

            // Add transport Key to ecnrypted data
            encryptedData =
                SequoiaCryptoProvider.AppendArrays(
                    transKey.GenerateTransportKey(remotePublicKeyXML),
                    encryptedDataPlusHash);

            return(encryptedData);
        }
        /// <summary>
        ///     Generates the transport key.
        /// </summary>
        /// <param name="remotePublicKeyXML">The remote public key XML.</param>
        /// <returns>
        ///     The transport key.
        /// </returns>
        /// <externalUnit cref="AsymmetricAlgorithm"/>
        /// <revision revisor="dev01" date="1/30/2009" version="1.0.5.11">
        ///     Member Created
        /// </revision>
        public byte[] GenerateTransportKey(string remotePublicKeyXML)
        {
            if (encrypted == false)
            {
                this.encryptedData =
                    SequoiaCryptoProvider.AppendArrays(
                        this.AsymmetricallyEncryptContent(
                            this.key, remotePublicKeyXML),
                        this.AsymmetricallyEncryptContent(
                            this.initializationVector, remotePublicKeyXML));
                encrypted = true;
            }

            return(this.encryptedData);
        }