private byte[] DecryptData(byte[] data)
{
if(_useDPAPI) {
try {
return ProtectedData.Unprotect(data, null, DataProtectionScope.CurrentUser);
}
catch(Exception e) {
Debug.ReportError("Failed to decrypt data using DPAPI. Exception: {0}", e.Message);
return new byte[0];
}
}
else {
RijndaelManaged aes = null;
MemoryStream inputStream = null;
CryptoStream decStream = null;
try {
InitEncryptionAlgorithm();
inputStream = new MemoryStream(data);
aes = new RijndaelManaged();
aes.IV = EncryptionIV;
aes.Key = _encryptionKey;
ICryptoTransform decryptor = aes.CreateDecryptor(_encryptionKey, EncryptionIV);
// decrypt
decStream = new CryptoStream(inputStream, decryptor, CryptoStreamMode.Read);
byte[] buffer = new byte[data.Length];
int length = decStream.Read(buffer, 0, data.Length);
if(length == 0) {
return new byte[0];
}
else {
byte[] decryptedData = new byte[data.Length];
buffer.CopyTo(decryptedData, 0);
return buffer;
}
}
catch(Exception e) {
Debug.ReportError("Failed to decrypt data using AES. Exception: {0}", e.Message);
return null;
}
finally {
if(aes != null) {
aes.Clear();
}
if(decStream != null) {
decStream.Close();
}
if(inputStream != null) {
inputStream.Close();
}
}
}
}