public virtual void Encrypt(string iv, string key)
{
// Padding
{
int paddingByte, blockSizeInByte = 16;
// (Size - 2) = Encrypt data size
// -4 = CRC data
paddingByte = blockSizeInByte - (Size - 2) % blockSizeInByte - 4;
if (paddingByte < 0)
paddingByte = blockSizeInByte + paddingByte;
if (paddingByte > 0)
Write(_tempBuffer, 0, paddingByte);
}
// CRC
{
uint crc = GetCRC32(Buffer, 2, Size - 2);
PutUInt32(crc);
}
// Encrypt
using (Aes aes = Aes.Create())
using (MemoryStream memoryStream = new MemoryStream())
{
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.None;
aes.KeySize = 128;
aes.BlockSize = 128;
aes.Key = Encoding.ASCII.GetBytes(key);
aes.IV = Encoding.ASCII.GetBytes(iv);
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
ushort packetSize = Size;
cryptoStream.Write(Buffer, 2, packetSize - 2);
byte[] encrypted = memoryStream.ToArray();
Overwrite(encrypted, 0, encrypted.Length, 2);
cryptoStream.Close();
}
memoryStream.Close();
}
}