livia-test/Livia/Models/AesOperation.cs
2025-03-28 14:31:53 +08:00

73 lines
2.2 KiB
C#

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;
}
}
}