61 lines
2 KiB
C#
61 lines
2 KiB
C#
using System.IO;
|
|
using System.Security.Cryptography;
|
|
|
|
namespace ES3Internal
|
|
{
|
|
public class AESEncryptionAlgorithm : EncryptionAlgorithm
|
|
{
|
|
private const int ivSize = 16;
|
|
|
|
private const int keySize = 16;
|
|
|
|
private const int pwIterations = 100;
|
|
|
|
public override byte[] Encrypt(byte[] bytes, string password, int bufferSize)
|
|
{
|
|
using MemoryStream input = new MemoryStream(bytes);
|
|
using MemoryStream memoryStream = new MemoryStream();
|
|
Encrypt(input, memoryStream, password, bufferSize);
|
|
return memoryStream.ToArray();
|
|
}
|
|
|
|
public override byte[] Decrypt(byte[] bytes, string password, int bufferSize)
|
|
{
|
|
using MemoryStream input = new MemoryStream(bytes);
|
|
using MemoryStream memoryStream = new MemoryStream();
|
|
Decrypt(input, memoryStream, password, bufferSize);
|
|
return memoryStream.ToArray();
|
|
}
|
|
|
|
public override void Encrypt(Stream input, Stream output, string password, int bufferSize)
|
|
{
|
|
input.Position = 0L;
|
|
using Aes aes = Aes.Create();
|
|
aes.Mode = CipherMode.CBC;
|
|
aes.Padding = PaddingMode.PKCS7;
|
|
aes.GenerateIV();
|
|
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, aes.IV, 100);
|
|
aes.Key = rfc2898DeriveBytes.GetBytes(16);
|
|
output.Write(aes.IV, 0, 16);
|
|
using ICryptoTransform transform = aes.CreateEncryptor();
|
|
using CryptoStream output2 = new CryptoStream(output, transform, CryptoStreamMode.Write);
|
|
EncryptionAlgorithm.CopyStream(input, output2, bufferSize);
|
|
}
|
|
|
|
public override void Decrypt(Stream input, Stream output, string password, int bufferSize)
|
|
{
|
|
using (Aes aes = Aes.Create())
|
|
{
|
|
byte[] array = new byte[16];
|
|
input.Read(array, 0, 16);
|
|
aes.IV = array;
|
|
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, aes.IV, 100);
|
|
aes.Key = rfc2898DeriveBytes.GetBytes(16);
|
|
using ICryptoTransform transform = aes.CreateDecryptor();
|
|
using CryptoStream input2 = new CryptoStream(input, transform, CryptoStreamMode.Read);
|
|
EncryptionAlgorithm.CopyStream(input2, output, bufferSize);
|
|
}
|
|
output.Position = 0L;
|
|
}
|
|
}
|
|
}
|