I have coded a little class for crypting/decrypting byte[] data with AES (System.Security.Cryptography.RijndaelManaged).
The problem is: if i try to encrypt and then decrypt 256-length byte array, it works fine. If i use any other length (probably any) of data, it raises errors like "Padding is incorrect and cannot be removed" or "Incorrect length of data to en/de crypt".
I tried many configurations for Padding/Mode property for RijndaelManaged instance. Here is the code (uses default config Mode.CBC+Padding.PCKS7).
int m_keySize;
byte[] m_key;
byte[] m_iv;
public AESEncryption(string key, int keySize = 128)
{
m_keySize = keySize;
byte[] entropy = Convert.FromBase64String(key);
int keySizeBytes = (int)m_keySize / 8;
if (entropy.Length == keySizeBytes)
m_key = entropy;
else
{
m_key = new byte[keySizeBytes];
Buffer.BlockCopy(entropy, 0, m_key, 0, keySizeBytes);
}
// Generate IV
RijndaelManaged temp = new RijndaelManaged { KeySize = m_keySize };
temp.GenerateIV();
m_iv = temp.IV;
}
// Simple Encrypt(byte[]) method
byte[] Encrypt(byte[] sourceData)
{
try
{
MemoryStream resultStream = new MemoryStream();
using (RijndaelManaged m_aes = new RijndaelManaged { KeySize = m_keySize })
using (ICryptoTransform crypto = m_aes.CreateEncryptor(m_key, m_iv))
using (CryptoStream cryptoStream = new CryptoStream(resultStream, crypto, CryptoStreamMode.Write))
cryptoStream.Write(sourceData, 0, sourceData.Length);
return resultStream.ToArray();
}
catch { return null; }
}
// Simple Decrypt(byte[]) method
byte[] Decrypt(byte[] sourceData)
{
try
{
MemoryStream resultStream = new MemoryStream();
using (RijndaelManaged m_aes = new RijndaelManaged { KeySize = m_keySize })
using (ICryptoTransform crypto = m_aes.CreateDecryptor(m_key, m_iv))
using (CryptoStream cryptoStream = new CryptoStream(resultStream, crypto, CryptoStreamMode.Write))
cryptoStream.Write(sourceData, 0, sourceData.Length);
return resultStream.ToArray();
}
catch { return null; }
}