AesEncryptionHelper.cs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace MV485.util
  9. {
  10. public class AesEncryptionHelper
  11. {
  12. // 定义一个静态的密钥和初始化向量(IV),这两个值应该保密并且保持不变。
  13. //private static readonly byte[] Key = Encoding.UTF8.GetBytes("Your16ByteKeyHere!"); // 16, 24, or 32 bytes for AES-128, AES-192, or AES-256
  14. //private static readonly byte[] IV = Encoding.UTF8.GetBytes("Your16ByteIVHere!"); // 必须是16字节
  15. public static string key = "bjhcxd@aitest$tool!s"; // 密钥可以是任意长度,但会自动填充到 32 字节
  16. // AES 加密方法
  17. public static string EncryptString(string plainText, string key)
  18. {
  19. using (Aes aesAlg = Aes.Create())
  20. {
  21. // 设置密钥和生成随机的 IV
  22. byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadRight(32, '0').Substring(0, 32)); // 确保密钥长度为 32 字节
  23. aesAlg.Key = keyBytes;
  24. aesAlg.GenerateIV(); // 生成随机的 IV
  25. // 创建加密器
  26. ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
  27. // 将明文转换为字节数组
  28. byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
  29. // 使用内存流进行加密
  30. using (MemoryStream msEncrypt = new MemoryStream())
  31. {
  32. // 写入 IV 到输出流
  33. msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
  34. msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
  35. // 使用加密器加密数据
  36. using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
  37. using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
  38. {
  39. swEncrypt.Write(plainText);
  40. }
  41. // 返回加密后的数据作为 Base64 字符串
  42. return Convert.ToBase64String(msEncrypt.ToArray());
  43. }
  44. }
  45. }
  46. // AES 解密方法
  47. public static string DecryptString(string cipherText, string key)
  48. {
  49. using (Aes aesAlg = Aes.Create())
  50. {
  51. // 设置密钥
  52. byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadRight(32, '0').Substring(0, 32)); // 确保密钥长度为 32 字节
  53. aesAlg.Key = keyBytes;
  54. // 将 Base64 编码的密文转换为字节数组
  55. byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
  56. // 从密文中提取 IV
  57. int ivLength = BitConverter.ToInt32(cipherTextBytes, 0);
  58. byte[] iv = new byte[ivLength];
  59. Array.Copy(cipherTextBytes, sizeof(int), iv, 0, ivLength);
  60. aesAlg.IV = iv;
  61. // 创建解密器
  62. ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
  63. // 使用内存流进行解密
  64. using (MemoryStream msDecrypt = new MemoryStream(cipherTextBytes, sizeof(int) + ivLength, cipherTextBytes.Length - sizeof(int) - ivLength))
  65. using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
  66. using (StreamReader srDecrypt = new StreamReader(csDecrypt))
  67. {
  68. // 返回解密后的字符串
  69. return srDecrypt.ReadToEnd();
  70. }
  71. }
  72. }
  73. //-----------------------------------------------------------------------------
  74. }
  75. }