using System.Security.Cryptography;
namespace XFEExtension.NetCore.ServerInteractive.Utilities.Helpers;
///
/// AES加密帮助
///
public static class AesHelper
{
///
/// 生成随机密钥
///
///
public static string GenerateRandomKey()
{
var key = new byte[32];
RandomNumberGenerator.Fill(key);
return Convert.ToBase64String(key);
}
///
/// 生成随机向量
///
///
public static string GenerateRandomIv()
{
var iv = new byte[16];
RandomNumberGenerator.Fill(iv);
return Convert.ToBase64String(iv);
}
///
/// 加密
///
///
///
///
public static string Encrypt(string plainText, string key)
{
using var aes = Aes.Create();
aes.Key = Convert.FromBase64String(key);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
using (var writer = new StreamWriter(cryptoStream))
{
writer.Write(plainText);
}
var encryptedBytes = memoryStream.ToArray();
var iv = aes.IV;
var combined = new byte[iv.Length + encryptedBytes.Length];
Buffer.BlockCopy(iv, 0, combined, 0, iv.Length);
Buffer.BlockCopy(encryptedBytes, 0, combined, iv.Length, encryptedBytes.Length);
return Convert.ToBase64String(combined);
}
///
/// 解密
///
///
///
///
public static string Decrypt(string cipherTextBase64, string key)
{
var cipherBytes = Convert.FromBase64String(cipherTextBase64);
using var aes = Aes.Create();
aes.Key = Convert.FromBase64String(key);
aes.Mode = CipherMode.CBC;
var iv = new byte[aes.BlockSize / 8];
Buffer.BlockCopy(cipherBytes, 0, iv, 0, iv.Length);
aes.IV = iv;
aes.Padding = PaddingMode.PKCS7;
var contentBytes = new byte[cipherBytes.Length - iv.Length];
Buffer.BlockCopy(cipherBytes, iv.Length, contentBytes, 0, contentBytes.Length);
using var memoryStream = new MemoryStream(contentBytes);
using var cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(), CryptoStreamMode.Read);
using var reader = new StreamReader(cryptoStream);
return reader.ReadToEnd();
}
}