Вот чрезвычайно грубый пример того, что вы пытаетесь сделать.Есть много мест, где можно сделать улучшения, но это рабочий пример, на котором можно надеяться построить.
Сначала мы создадим класс, который реализует IDisposable
.Это позволяет нам использовать этот класс в using
инструкциях.Этот класс будет создавать экземпляры трех других нужных нам объектов и обрабатывать их удаление самостоятельно.
class MyCryptoStream : IDisposable
{
private FileStream fileStream = null;
private AesCryptoServiceProvider aes = null;
public CryptoStream cryptoStream = null;
public enum Mode
{
Write,
Read
}
public MyCryptoStream(string filepath, Mode mode, byte[] key, byte[] iv = null)
{
if(mode == Mode.Write)
{
fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Write);
fileStream.Write(iv, 0, 16);
aes = new AesCryptoServiceProvider() { Key = key, IV = iv };
cryptoStream = new CryptoStream(fileStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
}
else
{
iv = new byte[16];
fileStream = new FileStream(filepath, FileMode.Open, FileAccess.Read);
fileStream.Read(iv, 0, 16);
aes = new AesCryptoServiceProvider() { Key = key, IV = iv };
cryptoStream = new CryptoStream(fileStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
}
}
#region IDisposable Support
private bool disposedValue = false; // To detect redundant calls
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
if (cryptoStream != null)
{
cryptoStream.Dispose();
}
if (aes != null)
{
aes.Dispose();
}
if (fileStream != null)
{
fileStream.Dispose();
}
}
// TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
// TODO: set large fields to null.
disposedValue = true;
}
}
// TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources.
// ~UsingReduction() {
// // Do not change this code. Put cleanup code in Dispose(bool disposing) above.
// Dispose(false);
// }
// This code added to correctly implement the disposable pattern.
public void Dispose()
{
// Do not change this code. Put cleanup code in Dispose(bool disposing) above.
Dispose(true);
// TODO: uncomment the following line if the finalizer is overridden above.
// GC.SuppressFinalize(this);
}
#endregion
}
Теперь мы можем использовать этот класс следующим образом:
string path = "..\\..\\test.txt";
byte[] key = null;
byte[] iv = null;
using (AesCryptoServiceProvider myAes = new AesCryptoServiceProvider())
{
key = myAes.Key;
iv = myAes.IV;
}
using (MyCryptoStream ur = new MyCryptoStream(path, MyCryptoStream.Mode.Write, key, iv))
{
using (StreamWriter sw = new StreamWriter(ur.cryptoStream))
{
sw.Write("Test string");
}
}
string text = string.Empty;
using (MyCryptoStream ur = new MyCryptoStream(path, MyCryptoStream.Mode.Read, key))
{
using (StreamReader sr = new StreamReader(ur.cryptoStream))
{
text = sr.ReadToEnd();
}
}
Если вызапустив этот пример, вы увидите, что он записывает "Test string"
в файл, используя cryptostream
, а затем считывает тот же текст обратно из этого файла.Проверяя значение text
, мы видим, что оно все еще равно "Test string"
, что указывает на успешность процедуры.