File Encryption & Decryption Helper
Create EncryptUtil
/// <summary>
/// RSA와 SymmetricAlgorithm를 이용해 파일을 암호화합니다.
/// </summary>
public static bool EncryptFile<T>(string Input, string Output, byte[]Key, RSACryptoServiceProvider RSA) where T : SymmetricAlgorithm
{
try
{
using (FileStream OutputStream = new FileStream(Output, FileMode.Create))
{
byte[] RSAKey = RSA.Encrypt(Key, false);
T Algorithm = Activator.CreateInstance<T>();
OutputStream.Write(BitConverter.GetBytes(RSAKey.Length), 0, 4);
OutputStream.Write(BitConverter.GetBytes(Algorithm.IV.Length), 0, 4);
OutputStream.Write(RSAKey, 0, RSAKey.Length);
OutputStream.Write(Algorithm.IV, 0, Algorithm.IV.Length);
using (CryptoStream cs = new CryptoStream(OutputStream, Algorithm.Encryptor(Key), CryptoStreamMode.Write))
{
using (FileStream InputStream = new FileStream(Input, FileMode.Open))
{
byte[] Buffer = new byte[InputStream.Length];
InputStream.Read(Buffer, 0, Buffer.Length);
cs.Write(Buffer, 0, Buffer.Length);
}
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// RSA와 SymmetricAlgorithm를 이용해 파일을 복호화합니다.
/// </summary>
public static bool DecryptFile<T>(string Input, string Output,RSACryptoServiceProvider RSA) where T : SymmetricAlgorithm
{
try
{
using (FileStream InputStream = new FileStream(Input, FileMode.Open))
{
using (BinaryReader Reader = new BinaryReader(InputStream))
{
byte[] Key = new byte[Reader.ReadInt32()];
byte[] IV = new byte[Reader.ReadInt32()];
Reader.Read(Key, 0, Key.Length);
Reader.Read(IV, 0, IV.Length);
Key = RSA.Decrypt(Key, false);
using (CryptoStream CryptoStream = new CryptoStream(InputStream, Activator.CreateInstance<T>().Decryptor(Key, IV), CryptoStreamMode.Read))
{
using (FileStream fsOut = new FileStream(Output, FileMode.Create))
{
byte[] Buffer = new byte[10240];
do
{
int ReadCount = CryptoStream.Read(Buffer, 0, Buffer.Length);
if (ReadCount == 0) break;
fsOut.Write(Buffer, 0, ReadCount);
} while (true);
}
}
}
}
return true;
}
catch
{
return false;
}
}
위에서 말씀드린 과정을 수행하기 위해서 위와 같은 기능을 가진 EncryptUtil클래스를 생성했습니다. EncryptFile 메서드와 DecryptFile 메서드는 SymmetricAlgorithm 타입을 받는 제너릭 메서드로 구현되어 있으며 사용하실 때에는 아래와 같이 AesCryptoServiceProvider 혹은 DESCryptoServiceProvider를 넘겨서 사용하시면됩니다.
EncryptUtil.EncryptFile<AesCryptoServiceProvider>("Kuru.jpg", "Kuru.Encrypt", RSACryptoServiceProvider);
EncryptUtil.DecryptFile<AesCryptoServiceProvider>("Kuru.Encrypt", "Kuru.jpg", RSACryptoServiceProvider);
EncryptUtil.EncryptFile<DESCryptoServiceProvider>("Kuru.jpg", "Kuru.Encrypt", RSACryptoServiceProvider);
EncryptUtil.DecryptFile<DESCryptoServiceProvider>("Kuru.Encrypt", "Kuru.jpg", RSACryptoServiceProvider);
샘플 코드의 전체 소스코드 첨부합니다.