C #: Ошибка AES: Заполнение недействительно и не может быть удалено. Тот же ключ и все остальное, помогите

Я новичок в C #, так что проявите ко мне терпение. Я знаю, что этот вопрос задавали много раз, но я не мог найти ответа на свою проблему.

Я сохраняю некоторые данные и перед записью их в файл конвертирую их в двоичный и сохраняю в массиве, который я шифрую, а затем записываю в файл. Я шифрую данные кусками (32 байта). Таким же образом я читаю данные кусками по 32 байта, затем расшифровываю эти данные, и это должно повторяться до конца файла. Но когда дело доходит до дешифрования, возникает следующая ошибка:

Заполнение недействительно и не может быть удалено.

Я использую тот же ключ и iv (жестко запрограммирован до тех пор, пока он не заработает)

Вот мой код шифрования, который работает без проблем:

        //result
        byte[] data = new byte[32];

        //setup encryption (AES)
        SymmetricAlgorithm aes = Aes.Create();
        byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9,50};
        byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
        ICryptoTransform encryptor = aes.CreateEncryptor(key, iv);

        FileStream fStream = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read, 1024, false);

        //prepare data to write (byte array 'data') ...

        //encrypt
               MemoryStream m = new MemoryStream();
               using (Stream c = new CryptoStream(m, encryptor, CryptoStreamMode.Write))
                   c.Write(data, 0, data.Length);
               data = m.ToArray();
               fStream.Write(data, 0, data.Length);

А вот мой код дешифрования:

FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false);

            //setup encryption (AES)
            SymmetricAlgorithm aes = Aes.Create();
            byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
            byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
            ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);

            //result
            byte[] data = new byte[32];

            //loop for reading the whole file ...
            int len = fStream.Read(data, 0, 32);

            //decrypt
                MemoryStream m = new MemoryStream();
                using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
                    c.Write(data, 0, data.Length); //The exception is thrown in this line                  
                data = m.ToArray();

                //using the decrypted data and then looping back to reading and decrypting...

Я перепробовал все, что мог придумать (что немного, потому что я новичок в криптографии), я искал везде и не мог найти решения моей проблемы. Я также помог себе с книгой C # в двух словах .

Если у кого-то есть идеи, почему это могло произойти, я буду очень благодарен, потому что у меня нет идей.

Спасибо за ваше время. и ответы.

РЕДАКТИРОВАТЬ:

FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false);

            //setup encryption (AES)
            SymmetricAlgorithm aes = Aes.Create();
            byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
            byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
            ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);

            //result
            byte[] data = new byte[32];

            //loop for reading the whole file ...
            int len = fStream.Read(data, 0, 32);

            //decrypt
                MemoryStream m = new MemoryStream();
                using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
                    c.Write(data, 0, data.Length); //The exception is thrown in this line                  
                data = m.ToArray();

                //using the decrypted data and then looping back to reading and decrypting...

Я перепробовал все, что мог придумать (что немного, потому что я новичок в криптографии), я искал везде и не мог найти решения своей проблемы. Я также помог себе с книгой C # в двух словах .

Если у кого-то есть идеи, почему это могло произойти, я буду очень благодарен, потому что у меня нет идей.

Спасибо за ваше время. и ответы.

РЕДАКТИРОВАТЬ:

FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false);

            //setup encryption (AES)
            SymmetricAlgorithm aes = Aes.Create();
            byte[] key = { 145, 12, 32, 245, 98, 132, 98, 214, 6, 77, 131, 44, 221, 3, 9, 50 };
            byte[] iv = { 15, 122, 132, 5, 93, 198, 44, 31, 9, 39, 241, 49, 250, 188, 80, 7 };
            ICryptoTransform decryptor = aes.CreateDecryptor(key, iv);

            //result
            byte[] data = new byte[32];

            //loop for reading the whole file ...
            int len = fStream.Read(data, 0, 32);

            //decrypt
                MemoryStream m = new MemoryStream();
                using (Stream c = new CryptoStream(m, decryptor, CryptoStreamMode.Write))
                    c.Write(data, 0, data.Length); //The exception is thrown in this line                  
                data = m.ToArray();

                //using the decrypted data and then looping back to reading and decrypting...

Я перепробовал все, что мог придумать (что немного, потому что я новичок в криптографии), я искал везде и не мог найти решения своей проблемы. Я также помог себе с книгой C # в двух словах .

Если у кого-то есть идеи, почему это могло произойти, я буду очень благодарен, потому что у меня нет идей.

Спасибо за ваше время. и ответы.

РЕДАКТИРОВАТЬ: Кажется, что размер зашифрованных данных составляет 48 байт (на 12 байт больше, чем у оригинала). Почему это так? Я думал, что он добавляет байты, только если они не кратны размеру блока (16 байтов, мои данные - 32 байта). Данные всегда больше и с постоянным увеличением (мне нужно знать это, чтобы правильно читать и расшифровывать).

Примечание: я не могу напрямую использовать другие потоки, потому что мне нужно контролировать выходной формат, и я считаю шифрование в памяти также безопаснее и быстрее.

6
задан Ben 22 February 2011 в 15:50
поделиться