using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace SimApi.Helpers;
public static class SimApiAesUtil
{
// 密钥长度:256位 (32字节)
private const int KeySize = 256;
// 块大小:128位 (16字节)
private const int BlockSize = 128;
// 加密模式 - 重命名以避免与枚举类型冲突
private const CipherMode AesCipherMode = CipherMode.CBC;
// 填充模式 - 重命名以避免与枚举类型冲突
private const PaddingMode AesPaddingMode = PaddingMode.PKCS7;
///
/// AES 加密
///
/// 明文
/// 字符串密钥(将被处理为256位)
/// 加密后的Base64字符串(包含IV)
public static string Encrypt(string plainText, string key)
{
if (string.IsNullOrEmpty(plainText))
throw new ArgumentNullException(nameof(plainText));
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key));
// 处理密钥为指定长度
var keyBytes = ProcessKey(key);
// 生成随机IV
var iv = GenerateRandomIv();
using var aes = CreateAesProvider(keyBytes, iv);
using var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using var ms = new MemoryStream();
// 先写入IV,解密时需要用到
ms.Write(iv, 0, iv.Length);
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
using (var sw = new StreamWriter(cs))
{
sw.Write(plainText);
}
return Convert.ToBase64String(ms.ToArray());
}
///
/// AES 解密
///
/// 加密后的Base64字符串
/// 字符串密钥(与加密时相同)
/// 解密后的明文
public static string Decrypt(string cipherText, string key)
{
if (string.IsNullOrEmpty(cipherText))
throw new ArgumentNullException(nameof(cipherText));
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key));
var cipherBytes = Convert.FromBase64String(cipherText);
// 从加密数据中提取IV
var iv = new byte[BlockSize / 8];
Array.Copy(cipherBytes, 0, iv, 0, iv.Length);
// 处理密钥为指定长度
var keyBytes = ProcessKey(key);
using var aes = CreateAesProvider(keyBytes, iv);
using var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using var ms = new MemoryStream(cipherBytes, iv.Length, cipherBytes.Length - iv.Length);
using var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);
using var sr = new StreamReader(cs);
return sr.ReadToEnd();
}
///
/// 处理密钥为指定长度(256位)
///
private static byte[] ProcessKey(string key)
{
// 使用SHA256哈希处理密钥,确保得到32字节(256位)的密钥
return SHA256.HashData(Encoding.UTF8.GetBytes(key));
}
///
/// 生成随机初始化向量
///
private static byte[] GenerateRandomIv()
{
using var aes = Aes.Create();
aes.BlockSize = BlockSize;
aes.GenerateIV();
return aes.IV;
}
///
/// 创建并配置AES加密服务提供器
///
private static Aes CreateAesProvider(byte[] key, byte[] iv)
{
var aes = Aes.Create();
aes.KeySize = KeySize;
aes.BlockSize = BlockSize;
aes.Mode = AesCipherMode;
aes.Padding = AesPaddingMode;
aes.Key = key;
aes.IV = iv;
return aes;
}
}