Blame view

netcore/src/Infrastructure/NCC/DataEncryption/Encryptions/AESEncryption.cs 2.73 KB
de2bd2f9   “wangming”   项目初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  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
  {
      /// <summary>
      /// AES 加解密
      /// </summary>
      [SuppressSniffer]
      public class AESEncryption
      {
          /// <summary>
          /// 加密
          /// </summary>
          /// <param name="text">加密文本</param>
          /// <param name="skey">密钥</param>
          /// <returns></returns>
          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]);
          }
  
          /// <summary>
          /// 解密
          /// </summary>
          /// <param name="hash">加密后字符串</param>
          /// <param name="skey">密钥</param>
          /// <returns></returns>
          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();
          }
      }
  }