Я пытаюсь зашифровать некоторые данные с помощью следующего кода:
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 покажет эту ошибку в своих свойствах после ее инициализации.
Почему это? И как я могу избежать этого?
Итак, код действительно работает без исключения, но проблема в том, что вы просматриваете свойства в отладчике? Если это так, то простое - некоторые свойства (Position
, например) полагаются на возможность поиска в потоке. Вы не можете сделать это с помощью CryptoStream
- поэтому оценка свойства не удалась.
Вам не нужно это избегать - это отлично.
Чтобы избежать этой проблемы, ее гораздо проще в использовании:
using (var reader = new StreamReader(csEncrypt))
{
return reader.ReadToEnd();
}
CryptographicException : Padding is invalid and cannot be removed.
Можете ли вы использовать один из конструкторов в MemoryStream, где вы передаете "true" в параметр записи?