Jak szyfrować dane za pomocą algorytmu aes

0

zawartość pliku tekstowego zapisze do zaszyfrowanego algorytmem AES skompresowanego strumienia GZip a następnie odpakuje i odszyfruje

Mój kod:

public class Test
{
    public static void Main(string[] args)
    {
        var file = @"C:\Users\Mikołaj\Desktop\myfile.txt";
        var fs = File.OpenRead(file);

        using (AesCryptoServiceProvider myAes = new AesCryptoServiceProvider())
        {
            var Zipped = ZipStream(fs, myAes.Key, myAes.IV);
            var UnZipped = UnZipStream(Zipped, myAes.Key, myAes.IV);
            
        }
    }

    public static Stream ZipStream(Stream StreamIn, byte[] Key, byte[] IV) //pakowanie
    {
        var data = ConvertToByteArray(StreamIn);
        using (MemoryStream ms = new MemoryStream())
        {
            using (GZipStream gzStream = new GZipStream(ms, CompressionMode.Compress, true))
            {
                gzStream.Write(data, 0, data.Length);
            }

            return EncryptTextToMemory(ms.ToArray(), Key, IV);
        }
    }

    private static Stream EncryptTextToMemory(byte[] Data, byte[] Key, byte[] IV) //szyfrowanie
    {
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
            var msEncrypt = new MemoryStream();
            var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);

            csEncrypt.Write(Data, 0, Data.Length);

            return msEncrypt;
        }
    }

    public static Stream UnZipStream(Stream StreamIn, byte[] Key, byte[] IV) //rozpakowanie
    {
        const int BUFFER_SIZE = 4096;
        var EncryptedData = ConvertToByteArray(StreamIn);
        var DecryptedStream = DecryptTextFromMemory(EncryptedData, Key, IV);

        var Data = ConvertToByteArray(DecryptedStream);
        var GZipStream = new GZipStream(new MemoryStream(Data), CompressionMode.Decompress, true);
        var Buffer = new byte[BUFFER_SIZE];
        var MemStream = new MemoryStream();
        int BytesRead;

        while ((BytesRead = GZipStream.Read(Buffer, 0, BUFFER_SIZE)) > 0)
        {
            MemStream.Write(Buffer, 0, BytesRead);
        }

        return MemStream;
    }

    public static Stream DecryptTextFromMemory(byte[] Data, byte[] Key, byte[] IV) //odszyfrowanie
    {
        using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
        {
            aesAlg.Key = Key;
            aesAlg.IV = IV;

            var decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
            var msDecrypt = new MemoryStream(Data);
            var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);

            return csDecrypt;
        }
    }

    private static byte[] ConvertToByteArray(Stream StreamIn)
    {
        StreamIn.Position = 0; //not supportedexception was unhandled ... 
        using (var InputStream = new MemoryStream())
        {
            StreamIn.CopyTo(InputStream);
            return InputStream.ToArray();
        }
    }
}

Wyrzuca błąd na metodzie ConvertToByteArray. Błąd jest opisany przy linijce którą wyrzuca.
Nie wiem jak się za to zabrać.
Ktoś ma pomysł ? :(

0

Postaw warunek w ConvertToByteArray

        if (StreamIn.CanSeek)
        {
            StreamIn.Position = 0;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1