Как читать содержимое MemoryStream, передаваемого криптопотоком - PullRequest
0 голосов
/ 19 мая 2019

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

Я пробовал несколько разных способов чтения,

ms.Position = 0;
return new StreamReader(ms, Encoding.ASCII).ReadToEnd()
OR
using (StreamReader sr = new StreamReader(cs)) {
return sr.ReadToEnd();
}
OR
byte[] enc = ms.ToArray();
string ret=null;
foreach (byte b in enc) {
ret += b.ToString();
}

Вот фрагмент кода.

 using (AesManaged aesMan = new AesManaged()) {
                if (keystr.Length == aesSize/8)
                {
                    //Its a valid key
                    aesMan.KeySize = aesSize;
                    aesMan.Key = Encoding.UTF8.GetBytes(keystr);
                    aesMan.IV = Encoding.UTF8.GetBytes(ivstr);

                    ICryptoTransform encryptor aesMan.CreateEncryptor(aesMan.Key, aesMan.IV);
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                        {
                            using (StreamWriter sw = new StreamWriter(cs))
                            {
                                sw.Write(inpstr);
                                using (StreamReader sr = new StreamReader(ms)) {
                                    return sr.ReadToEnd();
                                }


                            }
                        }

Я получаю различные ошибки, например, что поток не читается или что он не может прочитать закрытый поток, а также возвращается пустая строка.У кого-нибудь есть идеи?Я в растерянности

1 Ответ

0 голосов
/ 19 мая 2019

Большинство из этих функций потока, таких как StreamReader, StreamWriter и т. Д., Закрывают основной поток, когда вы Dispose() их.Старайтесь не утилизировать их, пока не закончите, или не используйте конструкторы, которые позволяют вам не закрывать основной поток.В редких случаях мне приходилось внедрять фиктивную оболочку вокруг потока, чтобы предотвратить закрытие основного потока

...