protected override void ProcessRecord()
        {
            var privateKey = PrivateKey.ToByteArrayFromBase64String();
            var publicKey = PublicKey.ToByteArrayFromBase64String();
            if (ParameterSetName == "File")
            {
                if (ReplaceFile.IsTrue())
                    OutFile = File;

                byte[] fileEndData = new byte[40];
                long dataEnd = 0;

                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    source.Seek(-24, SeekOrigin.End);
                    dataEnd = source.Position;
                    source.Read(fileEndData, 0, 24);
                }

                byte[] nonce = new byte[24];
                Array.Copy(fileEndData, 0, nonce, 0, 24);

                using (ICryptoTransform transform = new SodiumCryptoTransform(nonce, privateKey, publicKey, SodiumCryptoTransform.Direction.Decrypt))
                using (FileStream destination = new FileStream(OutFile, FileMode.CreateNew, FileAccess.Write, FileShare.None))
                using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                    source.CopyTo(cryptoStream);

            }
            else
            {
                byte[] message;
                message = PublicKeyBox.Open(rawMessage, Nonce.ToByteArrayFromBase64String(), privateKey, publicKey);

                if (Raw.IsTrue())
                {
                    WriteObject(message);
                }
                else
                {
                    var plainMessage = message.ToString(Encoding);
                    WriteObject(plainMessage);
                }
            }
        }
        protected override void ProcessRecord()
        {
            var key = Key.ToByteArrayFromBase64String();
            if (ParameterSetName == "File")
            {
                if (ReplaceFile.IsTrue())
                    OutFile = File;

                byte[] fileEndData = null;
                if (algo == SodiumCryptoTransform.SymmetricAlgorithm.ChaCha20)
                    fileEndData = new byte[8];
                else
                    fileEndData = new byte[24];
                long dataEnd = 0;

                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    source.Seek(-fileEndData.Length, SeekOrigin.End);
                    dataEnd = source.Position;
                    source.Read(fileEndData, 0, fileEndData.Length);
                }

                byte[] nonce = new byte[fileEndData.Length];
                Array.Copy(fileEndData, 0, nonce, 0, fileEndData.Length);

                using (ICryptoTransform transform = new SodiumCryptoTransform(nonce, key, SodiumCryptoTransform.Direction.Decrypt, algo))
                using (FileStream destination = new FileStream(OutFile, FileMode.CreateNew, FileAccess.Write, FileShare.None))
                using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                    source.CopyTo(cryptoStream);

            }
            else
            {
                byte[] message;
                byte[] nonce = Nonce.ToByteArrayFromBase64String();
                switch (algo)
                {
                    case SodiumCryptoTransform.SymmetricAlgorithm.ChaCha20:
                        message = StreamEncryption.DecryptChaCha20(rawMessage, nonce, key);
                        break;
                    case SodiumCryptoTransform.SymmetricAlgorithm.XSalsa:
                        message = StreamEncryption.Decrypt(rawMessage, nonce, key);
                        break;
                    case SodiumCryptoTransform.SymmetricAlgorithm.Default:
                    default:
                        message = SecretBox.Open(rawMessage, nonce, key);
                        break;
                }
                if (Raw.IsTrue())
                {
                    WriteObject(message);
                }
                else
                {
                    var plainMessage = message.ToString(Encoding);
                    WriteObject(plainMessage);
                }
            }
        }
        protected override void ProcessRecord()
        {
            var nonce = SecretBox.GenerateNonce();
            var privateKey = PrivateKey.ToByteArrayFromBase64String();
            var publicKey = PublicKey.ToByteArrayFromBase64String();
            if (ParameterSetName == "File")
            {
                if (ReplaceFile.IsTrue())
                    OutFile = Path.GetTempFileName();

                using (ICryptoTransform transform = new SodiumCryptoTransform(nonce, privateKey, publicKey, SodiumCryptoTransform.Direction.Encrypt))
                using (FileStream destination = new FileStream(OutFile, FileMode.CreateNew, FileAccess.Write, FileShare.None))
                using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    source.CopyTo(cryptoStream);
                    cryptoStream.FlushFinalBlock();
                    destination.Write(nonce, 0, nonce.Length);
                    destination.Flush();
                }

                if (ReplaceFile.IsTrue())
                {
                    System.IO.File.Delete(File);
                    System.IO.File.Move(OutFile, File);
                }
            }
            else
            {
                var encryptedMessage = PublicKeyBox.Create(rawMessage, nonce, privateKey, publicKey);
                var results = new EncryptedMessage()
                {
                    EncryptedType = "Asymetric",
                    Message = NoCompression.IsTrue() ? encryptedMessage.ToBase64String() : encryptedMessage.Compress(),
                    Nonce = nonce.ToBase64String(),
                    Compressed = !NoCompression
                };

                WriteObject(results);
            }
        }
        protected override void ProcessRecord()
        {
            var key = Key.ToByteArrayFromBase64String();
            if (ParameterSetName == "File")
            {
                if (ReplaceFile.IsTrue())
                    OutFile = Path.GetTempFileName();

                using (ICryptoTransform transform = new SodiumCryptoTransform(nonce, key, SodiumCryptoTransform.Direction.Encrypt, algo))
                using (FileStream destination = new FileStream(OutFile, FileMode.CreateNew, FileAccess.Write, FileShare.None))
                using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
                using (FileStream source = new FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    source.CopyTo(cryptoStream);
                    cryptoStream.FlushFinalBlock();
                    destination.Write(nonce, 0, nonce.Length);
                    destination.Flush();
                }

                if (ReplaceFile.IsTrue())
                {
                    System.IO.File.Delete(File);
                    System.IO.File.Move(OutFile, File);
                }
            }
            else
            {
                byte[] encryptedMessage = null;
                switch (algo)
                {
                    case SodiumCryptoTransform.SymmetricAlgorithm.ChaCha20:
                        encryptedMessage = StreamEncryption.EncryptChaCha20(rawMessage, nonce, key);
                        break;
                    case SodiumCryptoTransform.SymmetricAlgorithm.XSalsa:
                        encryptedMessage = StreamEncryption.Encrypt(rawMessage, nonce, key);
                        break;
                    case SodiumCryptoTransform.SymmetricAlgorithm.Default:
                    default:
                        encryptedMessage = SecretBox.Create(rawMessage, nonce, key);
                        break;
                }

                var results = new EncryptedMessage()
                {
                    EncryptedType = algo.GetDescription(),
                    Message = NoCompression.IsTrue() ? encryptedMessage.ToBase64String() : encryptedMessage.Compress(),
                    Nonce = nonce.ToBase64String(),
                    Compressed = !NoCompression
                };
                WriteObject(results);

            }
        }