using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Infrastructure.Helpers
{
    public class AESHelper
    {
        //
        // 摘要:
        //     32位处理key
        //
        // 参数:
        //   key:
        //     原字节
        private static string GetAesKey(string key)
        {
            int length = key.Length;
            if (length < 32)
            {
                for (int i = 0; i < 32 - length; i++)
                {
                    key += "0";
                }

                return key;
            }

            return key[..32];
        }

        //
        // 摘要:
        //     使用AES加密字符串
        //
        // 参数:
        //   content:
        //     加密内容
        //
        //   key:
        //     秘钥
        //
        //   vi:
        //     偏移量
        //
        // 返回结果:
        //     Base64字符串结果
        public static string AesEncrypt(string content, string key, string vi = "1234567890000000")
        {
            byte[] bytes = Encoding.UTF8.GetBytes(GetAesKey(key));
            byte[] bytes2 = Encoding.UTF8.GetBytes(vi);
            byte[] bytes3 = Encoding.UTF8.GetBytes(content);
            SymmetricAlgorithm symmetricAlgorithm = Aes.Create();
            symmetricAlgorithm.IV = bytes2;
            symmetricAlgorithm.Key = bytes;
            symmetricAlgorithm.Mode = CipherMode.CBC;
            symmetricAlgorithm.Padding = PaddingMode.PKCS7;
            ICryptoTransform cryptoTransform = symmetricAlgorithm.CreateEncryptor();
            byte[] inArray = cryptoTransform.TransformFinalBlock(bytes3, 0, bytes3.Length);
            return Convert.ToBase64String(inArray);
        }

        //
        // 摘要:
        //     使用AES解密字符串
        //
        // 参数:
        //   content:
        //     内容
        //
        //   key:
        //     秘钥
        //
        //   vi:
        //     偏移量
        //
        // 返回结果:
        //     UTF8解密结果
        public static string AesDecrypt(string content, string key, string vi = "1234567890000000")
        {
            byte[] bytes = Encoding.UTF8.GetBytes(GetAesKey(key));
            byte[] bytes2 = Encoding.UTF8.GetBytes(vi);
            byte[] array = Convert.FromBase64String(content);
            SymmetricAlgorithm symmetricAlgorithm = Aes.Create();
            symmetricAlgorithm.IV = bytes2;
            symmetricAlgorithm.Key = bytes;
            symmetricAlgorithm.Mode = CipherMode.CBC;
            symmetricAlgorithm.Padding = PaddingMode.PKCS7;
            ICryptoTransform cryptoTransform = symmetricAlgorithm.CreateDecryptor();
            byte[] bytes3 = cryptoTransform.TransformFinalBlock(array, 0, array.Length);
            return Encoding.UTF8.GetString(bytes3);
        }
    }
}
