«Поток не поддерживает поиск» с объектом CryptoStream

2

Я пытаюсь зашифровать некоторые данные с помощью следующего кода:

public static byte[] EncryptString(byte[] input, string password)
{
    PasswordDeriveBytes pderiver = new PasswordDeriveBytes(password, null);
    byte[] ivZeros = new byte[8];
    byte[] pbeKey = pderiver.CryptDeriveKey("RC2", "MD5", 128, ivZeros);

    RC2CryptoServiceProvider RC2 = new RC2CryptoServiceProvider();

    byte[] IV = new byte[8];
    ICryptoTransform encryptor = RC2.CreateEncryptor(pbeKey, IV);

    MemoryStream msEncrypt = new MemoryStream();
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    csEncrypt.Write(input, 0, input.Length);
    csEncrypt.FlushFinalBlock();

    return msEncrypt.ToArray();
}

Однако, когда он достигает инициализации моего объекта CryptoStream, он выдает следующую ошибку:

"Поток не поддерживает поиск". Чтобы уточнить, в приведенном выше коде нет обработки ошибок, поэтому просто запуск этого не будет "ломаться", сдерживать. Но, пройдя через код, объект CryptoStream покажет эту ошибку в своих свойствах после ее инициализации.

Почему это? И как я могу избежать этого?

  • 0
    Это потому, что этот поток не поддерживает поиск. Почему вы хотите избежать этого? Пока вы не используете Seek, все должно быть хорошо.
Теги:
encryption
cryptography

3 ответа

7
Лучший ответ

Итак, код действительно работает без исключения, но проблема в том, что вы просматриваете свойства в отладчике? Если это так, то простое - некоторые свойства (Position, например) полагаются на возможность поиска в потоке. Вы не можете сделать это с помощью CryptoStream - поэтому оценка свойства не удалась.

Вам не нужно это избегать - это отлично.

  • 0
    Таким образом, исключение происходит просто потому, что попытка просмотреть свойство Position недопустима в потоке, поэтому мне просто подтверждают, что я не могу просмотреть это?
  • 0
    Да, это именно так.
0

Чтобы избежать этой проблемы, ее гораздо проще в использовании:

    using (var reader = new StreamReader(csEncrypt))
    {
        return reader.ReadToEnd();
    }
  • 0
    Выдает CryptographicException : Padding is invalid and cannot be removed.
0

Можете ли вы использовать один из конструкторов в MemoryStream, где вы передаете "true" в параметр записи?

  • 0
    Какой байтовый массив я могу протолкнуть через этот конструктор, который все еще будет работать?
  • 0
    Я считаю, что MD5 хэширует до 16 байтов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню