public virtual bool Decrypt(string iv, string key)
{
ushort packetSize = Size;
// Block Size가 일치하지 않으면 복호화를 할 수 없다.
if ((packetSize - 2) % 16 != 0)
{
Logger.Err(LogMask.Aegis, "BlockSize is not match(packetsize={0}).", packetSize);
return false;
}
// Decrypt AES
{
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.CreateDecryptor(), CryptoStreamMode.Write))
{
cryptoStream.Write(Buffer, 2, packetSize - 2);
byte[] decrypted = memoryStream.ToArray();
Overwrite(decrypted, 0, decrypted.Length, 2);
cryptoStream.Close();
}
memoryStream.Close();
}
}
// Check CRC
{
uint crc = GetCRC32(Buffer, 2, packetSize - 4 - 2);
uint packetCRC = BitConverter.ToUInt32(Buffer, packetSize - 4);
if (crc != packetCRC)
{
Logger.Err(LogMask.Aegis, "Invalid CRC.");
return false;
}
}
return true;
}