Для начала это условие цикла никогда не подходит:
while (s_MemoryStream.Length < s_MemoryStream.Position)
Как позиция может быть за пределами длины?
Вместо того, чтобы использовать длину потока, обычным шаблоном для копирования потока является повторное считывание, пока возвращаемое значение не станет положительным. В любом случае, поскольку вы делаете это дважды в этом коде, вы можете также инкапсулировать его:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int read;
while ( (read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}
Также лучше использовать using
операторы для очистки строк. Кроме того, свойство Encoding.Unicode
означает, что вам не нужно создавать новый UnicodeEncoding
самостоятельно. Кроме того, я обычно нахожу, что установка свойства Position
более читаема, чем использование Seek
Наконец, нет смысла в методе, возвращающем значение, если оно всегда будет true
. Итак, ваш код станет:
public void EncryptStream()
{
string password = @"myKey123"; // Your Key Here
byte[] key = Encoding.Unicode.GetBytes(password);
s_EncryptedStream = new MemoryStream();
s_MemoryStream.Position = 0;
RijndaelManaged RMCrypto = new RijndaelManaged();
using (Stream crytpoStream = new CryptoStream(s_EncryptedStream,
RMCrypto.CreateEncryptor(key, key),
CryptoStreamMode.Write))
{
CopyStream(s_MemoryStream, cryptoStream);
}
s_MemoryStream.Position = 0;
s_EncryptedStream.Position = 0;
CopyStream(s_EncryptedStream, s_MemoryStream);
}
public void DecryptStream()
{
string password = @"myKey123"; // Your Key Here
byte[] key = Encoding.Unicode.GetBytes(password);
s_DecryptedStream = new MemoryStream();
s_MemoryStream.Position = 0;
RijndaelManaged RMCrypto = new RijndaelManaged();
using (Stream crytpoStream = new CryptoStream(s_MemoryStream,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read))
{
CopyStream(cryptoStream, s_DecryptedStream);
}
s_DecryptedStream.Position = 0;
s_MemoryStream.Position = 0;
CopyStream(s_DecryptedStream, s_MemoryStream);
}
Даже после внесения изменений в этот код вы чувствуете, что здесь слишком много нелокальных переменных. Я не могу понять, почему любой из этого должен быть в переменных экземпляра. Сделайте поток для шифрования или дешифрования параметра (вместе с паролем) и верните поток памяти с зашифрованными / дешифрованными данными или просто байтовый массив.