Trafiłem na dziwny problem. Próbuje zaszyfrować plik przy użyciu algorytmu rijndael i wszystko generalnie jest pięknie poza tym, że pomimo wybrania metody padding PKCS7 na końcu strumienia dodaje zera a przecież, z tego co rozumiem, powinien wypełniać to wartościami równymi ilości bajtów które musiał uzupełnić. Co za tym idzie nie pozbywa się paddingu przy dekodowaniu. Jakaś koncepcja? Może coś jest nie tak z długością strumienia wyjściowego, tzn podaje złą. Ale nie mam koncepcji jak podać właściwą.

Całość kodu na https://github.com/Siewier/SzyfratorPlikow

 
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;


namespace SzyfratorPlikow
{
    public class Encryptor
    {
        public bool EncryptFile(string inputFile, string outputFile, string key)
        {
            bool result = true;
            try
            {
                byte[] keyBytes;
                keyBytes = Encoding.Unicode.GetBytes(key);

                Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);

                RijndaelManaged rijndaelCSP = new RijndaelManaged();
                rijndaelCSP.Padding = PaddingMode.PKCS7;
                rijndaelCSP.BlockSize = 128;
                rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
                rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);

                ICryptoTransform encryptor = rijndaelCSP.CreateEncryptor();
                
                FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read);

                byte[] inputFileData = new byte[(int)inputFileStream.Length];
                inputFileStream.Read(inputFileData, 0, (int)inputFileStream.Length);

                FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);

                CryptoStream encryptStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write);
                encryptStream.Write(inputFileData, 0, (int)inputFileStream.Length);
                encryptStream.FlushFinalBlock();

                rijndaelCSP.Clear();
                encryptStream.Close();
                inputFileStream.Close();
                outputFileStream.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Szyfrowanie nieudane!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                result = false;
                return result;
            }

            MessageBox.Show("Szyfrowanie zakończone!");
            return result;
        }

        public bool DecryptFile(string inputFile, string outputFile, string key)
        {
            bool result = true;
            try
            {
                byte[] keyBytes = Encoding.Unicode.GetBytes(key);

                Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes);

                RijndaelManaged rijndaelCSP = new RijndaelManaged();
                rijndaelCSP.Padding = PaddingMode.PKCS7;
                rijndaelCSP.BlockSize = 128;
                rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize / 8);
                rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize / 8);

                ICryptoTransform decryptor = rijndaelCSP.CreateDecryptor();

                FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read);

                CryptoStream decryptStream = new CryptoStream(inputFileStream, decryptor, CryptoStreamMode.Read);

                byte[] inputFileData = new byte[(int)inputFileStream.Length];
                decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length);

                FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
                outputFileStream.Write(inputFileData, 0, inputFileData.Length);

                outputFileStream.Flush();

                rijndaelCSP.Clear();

                decryptStream.Close();
                inputFileStream.Close();
                outputFileStream.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Deszyfrowanie nieudane!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                result = false;
                return result;
            }

            MessageBox.Show("Deszyfrowanie zakończone!");
            return result;
        }
    }
}