using System.IO; using System.Security.Cryptography; using System.Text; using Microsoft.Extensions.Logging; namespace Livia.Models; //from https://www.c-sharpcorner.com/article/encryption-and-decryption-using-a-symmetric-key-in-c-sharp/ public interface IAesOperation { string EncryptString(string key, string plainText); string DecryptString(string key, string cipherText); } internal class AesOperation(ILogger logger) : IAesOperation { public string EncryptString(string key, string plainText) { try { byte[] iv = new byte[16]; byte[] array; using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv; ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); using MemoryStream memoryStream = new(); using CryptoStream cryptoStream = new(memoryStream, encryptor, CryptoStreamMode.Write); using (StreamWriter streamWriter = new(cryptoStream)) { streamWriter.Write(plainText); } array = memoryStream.ToArray(); } return Convert.ToBase64String(array); } catch (Exception e) { logger.LogError(e, "Encrypt failed"); return string.Empty; } } public string DecryptString(string key, string cipherText) { try { byte[] iv = new byte[16]; byte[] buffer = Convert.FromBase64String(cipherText); using Aes aes = Aes.Create(); aes.Key = Encoding.UTF8.GetBytes(key); aes.IV = iv; ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); using MemoryStream memoryStream = new(buffer); using CryptoStream cryptoStream = new(memoryStream, decryptor, CryptoStreamMode.Read); using StreamReader streamReader = new(cryptoStream); return streamReader.ReadToEnd(); } catch (Exception e) { logger.LogError(e, "Decrypt failed"); return string.Empty; } } }