patterncsharpMinor
Getting a decryptor object
Viewed 0 times
objectgettingdecryptor
Problem
I need to lock on my AesManaged instance
_Aes to call CreateDecryptor() however the CreateDecryptor() method is not thread safe and this function could be called by multiple threads. Is this the correct way to create a disposable object while needing to use a lock on the parent creating the object?byte[] encryptedTextBlob = GetEncryptedTextBlob();
ICryptoTransform decryptor = null;
lock(_Aes)
{
decryptor = _Aes.CreateDecryptor();
}
using (decryptor)
using (var encryptedStream = new MemoryStream(encryptedTextBlob))
using (var decrypedStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read))
using (var textReader = new StreamReader(decrypedStream))
{
return textReader.ReadToEnd();
}Solution
I would say you're not using AES correctly - don't hold on to an instance of it in your class (guessing by the underscore in the name) but rather create it as needed, while holding AES's parameters (the key and IV) in your class:
using (var aes = new AesManaged() { IV = _IV, Key = _Key })
using (var decryptor = aes.CreateDecryptor())
using (var encryptedStream = new MemoryStream(encryptedTextBlob))
using (var decrypedStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read))
using (var textReader = new StreamReader(decrypedStream))
{
return textReader.ReadToEnd();
}Code Snippets
using (var aes = new AesManaged() { IV = _IV, Key = _Key })
using (var decryptor = aes.CreateDecryptor())
using (var encryptedStream = new MemoryStream(encryptedTextBlob))
using (var decrypedStream = new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read))
using (var textReader = new StreamReader(decrypedStream))
{
return textReader.ReadToEnd();
}Context
StackExchange Code Review Q#20904, answer score: 4
Revisions (0)
No revisions yet.