using NCC.Dependency;
using System;
using System.Buffers.Text;
using System.IO;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
namespace NCC.DataEncryption
{
///
/// AES 加解密
///
[SuppressSniffer]
public class AESEncryption
{
///
/// 加密
///
/// 加密文本
/// 密钥
///
public static string Encrypt(string text, string skey)
{
var encryptKey = Encoding.UTF8.GetBytes(skey);
using var aesAlg = Aes.Create();
using var encryptor = aesAlg.CreateEncryptor(encryptKey, aesAlg.IV);
using var msEncrypt = new MemoryStream();
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write, true))
using (var swEncrypt = new StreamWriter(csEncrypt, leaveOpen: true))
{
swEncrypt.Write(text);
}
var iv = aesAlg.IV;
var dataLength = iv.Length + (int)msEncrypt.Length;
var decryptedContent = msEncrypt.GetBuffer();
var base64Length = Base64.GetMaxEncodedToUtf8Length(dataLength);
var result = new byte[base64Length];
Unsafe.CopyBlock(ref result[0], ref iv[0], (uint)iv.Length);
Unsafe.CopyBlock(ref result[iv.Length], ref decryptedContent[0], (uint)msEncrypt.Length);
Base64.EncodeToUtf8InPlace(result, dataLength, out base64Length);
return Encoding.ASCII.GetString(result.AsSpan()[..base64Length]);
}
///
/// 解密
///
/// 加密后字符串
/// 密钥
///
public static string Decrypt(string hash, string skey)
{
var fullCipher = Convert.FromBase64String(hash);
var iv = new byte[16];
var cipher = new byte[fullCipher.Length - iv.Length];
Unsafe.CopyBlock(ref iv[0], ref fullCipher[0], (uint)iv.Length);
Unsafe.CopyBlock(ref cipher[0], ref fullCipher[iv.Length], (uint)(fullCipher.Length - iv.Length));
var decryptKey = Encoding.UTF8.GetBytes(skey);
using var aesAlg = Aes.Create();
using var decryptor = aesAlg.CreateDecryptor(decryptKey, iv);
using var msDecrypt = new MemoryStream(cipher);
using var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
using var srDecrypt = new StreamReader(csDecrypt);
return srDecrypt.ReadToEnd();
}
}
}