Fairly new to encryption in C# and trying to fulfill some requirements here. I am given a 32 byte ‘key’ and 32 byte ‘Iv’ and an encrypted file, and I need to decrypt it. I know this vendor is using NetSuite and an AES-256 CBC encryption, although they simply download from the tool and send it to me, so not much help on that end.
From my understanding, C# AesCryptoServiceProvider cannot use a 32 byte IV value as it is forced to 16 byte. Is there something I’m missing (maybe bouncy castle has something?) in order to decrypt this message? I keep running into errors such as ‘Specified block size is not valid for this algorithm’, specifying the block size doesnt work as the AesCryptoServiceProvider forces it to 16 bytes.
Any help/info would be greatly appreciated
Here is a snippet for my decryption thus far:
public async Task<string?> DecryptAES(IFormFile encryptedFile, IFormFile keyFile)
{
string? plainText = await GetFileString(encryptedFile);
var jsonKeyFile = JsonConvert.DeserializeObject<EncryptionFile>(await GetFileString(keyFile));
var key = Convert.FromBase64String(jsonKeyFile.Key);
var TSTiv = Convert.FromBase64String(jsonKeyFile.Iv);
var bytes = GetFileBytes(encryptedFile);
var aes = new AesCryptoServiceProvider();
using (var memStream = new System.IO.MemoryStream(bytes))
{
var iv = new byte[32];
aes.BlockSize = 32;
memStream.Read(iv, 0, 32); // Pull the IV from the first 16 bytes of the encrypted value
using (var cryptStream = new CryptoStream(memStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read))
{
using (var reader = new System.IO.StreamReader(cryptStream))
{
return reader.ReadToEnd();
}
}
}
}
private byte[] GetFileBytes(IFormFile file)
{
long length = file.Length;
if (length < 0)
{
throw new Exception("Something went wrong, please try again");
}
using var fileStream = file.OpenReadStream();
byte[] bytes = new byte[length];
fileStream.Read(bytes, 0, (int)file.Length);
return bytes;
}