Невозможно создать CryptoStream для чтения из - System.NotSupportedException

Существует действительно простой код для расшифровки файла (тройное шифрование):

        FileStream fin = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
        TripleDES tdes = new TripleDESCryptoServiceProvider();
        CryptoStream cs = new CryptoStream(fin, tdes.CreateDecryptor(key, iv),CryptoStreamMode.Read); //<---- Exceptions

И это не работает. 'cs' недопустим, и с него невозможно прочитать. Есть несколько исключений при создании CryptoStream:

Length = 'cs.Length' threw an exception of type 'System.NotSupportedException'
base {System.SystemException} = {"Stream does not support seeking."}

Почему я не могу создать криптопоток и прочитать из него и как исправить эту проблему?

[Добавлено]

Спасибо за ответы, теперь для меня это более понятно. Но, тем не менее, это невозможно прочитать из "cs".

Шифрование:

FileStream fout = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write);
TripleDES tdes = new TripleDESCryptoServiceProvider();
CryptoStream cs = new CryptoStream(fout, tdes.CreateEncryptor(key, iv), CryptoStreamMode.Write);

byte[] d = Encoding.ASCII.GetBytes(Data);
cs.Write(d, 0, d.Length);
cs.WriteByte(0);

cs.Close();
fout.Close();

Существует iv и ключ, определенный где-то еще. И расшифровка - весь метод:

    FileStream fin = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
    TripleDES tdes = new TripleDESCryptoServiceProvider();
    CryptoStream cs = new CryptoStream(fin, tdes.CreateDecryptor(key, iv),CryptoStreamMode.Read);

    StringBuilder SB = new StringBuilder();
    int ch;
    for (int i = 0; i < fin.Length; i++)
    {
     ch = cs.ReadByte(); //Exception - CryptographicException: Bad data
     if (ch == 0)
     break;
     SB.Append(Convert.ToChar(ch));
    }
  cs.Close();
  fin.Close();

Как видите, там есть тот же ключ и iv, что и в коде шифрования. Но "все еще невозможно прочитать из потока cs" - исключение выброшено. Как вы думаете - что здесь не так?

Это мой ключ и iv используется:

public static byte[] key = { 21, 10, 64, 10, 100, 40, 200, 4,
                    21, 54, 65, 246, 5, 62, 1, 54,
                    54, 6, 8, 9, 65, 4, 65, 9};

    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0 };

2 ответа

Мне кажется, что вы смотрите sc.Length Свойство в Visual Studio инструмент, предназначенный для проверки переменных, и вы получите исключения там. Если это так, просто игнорируйте их, они будут актуальны, если вы используете Length в вашем коде. Вполне нормально, что потоки не поддерживают функции, которые требуют знания всех данных, которые находятся внутри.

редактировать

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

пытаться:

var textReader = new StreamReader(cs);// you might need to specify encoding 
var text = textReader.ReadToEnd();

Обратите внимание, что при этом весь файл будет считан в память, и это будет проблемой для больших файлов.

Если бы я написал этот код, я бы использовал StreamWritter написать CryptoStream а также StreamReader читать из него код просто.

Ваш код не выдает ошибок на моем компьютере (VS2010, .NET 4, Windows). На каком клиентском профиле / платформе вы работаете? Ошибка указывает, что ваш FileStream относится к типу, который не поддерживает поиск, является нормальным.NET FileStream?

Другие вопросы по тегам