C#实现AES加解密方法

[csharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using System.Security.Cryptography;  
  5. using System.IO;  
  6.   
  7. namespace Csharp  
  8. {  
  9.     class AESHelper  
  10.     {  
  11.         /// <summary>  
  12.         /// AES加密  
  13.         /// </summary>  
  14.         /// <param name="Data">被加密的明文</param>  
  15.         /// <param name="Key">密钥</param>  
  16.         /// <param name="Vector">向量</param>  
  17.         /// <returns>密文</returns>  
  18.         public static String AESEncrypt(String Data, String Key, String Vector)  
  19.         {  
  20.             Byte[] plainBytes = Encoding.UTF8.GetBytes(Data);  
  21.   
  22.             Byte[] bKey = new Byte[32];  
  23.             Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
  24.             Byte[] bVector = new Byte[16];  
  25.             Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);  
  26.   
  27.             Byte[] Cryptograph = null// 加密后的密文  
  28.   
  29.             Rijndael Aes = Rijndael.Create();  
  30.             try  
  31.             {  
  32.                 // 开辟一块内存流  
  33.                 using (MemoryStream Memory = new MemoryStream())  
  34.                 {  
  35.                     // 把内存流对象包装成加密流对象  
  36.                     using (CryptoStream Encryptor = new CryptoStream(Memory,  
  37.                      Aes.CreateEncryptor(bKey, bVector),  
  38.                      CryptoStreamMode.Write))  
  39.                     {  
  40.                         // 明文数据写入加密流  
  41.                         Encryptor.Write(plainBytes, 0, plainBytes.Length);  
  42.                         Encryptor.FlushFinalBlock();  
  43.   
  44.                         Cryptograph = Memory.ToArray();  
  45.                     }  
  46.                 }  
  47.             }  
  48.             catch  
  49.             {  
  50.                 Cryptograph = null;  
  51.             }  
  52.   
  53.             return Convert.ToBase64String(Cryptograph);  
  54.         }  
  55.   
  56.         /// <summary>  
  57.         /// AES解密  
  58.         /// </summary>  
  59.         /// <param name="Data">被解密的密文</param>  
  60.         /// <param name="Key">密钥</param>  
  61.         /// <param name="Vector">向量</param>  
  62.         /// <returns>明文</returns>  
  63.         public static String AESDecrypt(String Data, String Key, String Vector)  
  64.         {  
  65.             Byte[] encryptedBytes = Convert.FromBase64String(Data);  
  66.             Byte[] bKey = new Byte[32];  
  67.             Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
  68.             Byte[] bVector = new Byte[16];  
  69.             Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);  
  70.   
  71.             Byte[] original = null// 解密后的明文  
  72.   
  73.             Rijndael Aes = Rijndael.Create();  
  74.             try  
  75.             {  
  76.                 // 开辟一块内存流,存储密文  
  77.                 using (MemoryStream Memory = new MemoryStream(encryptedBytes))  
  78.                 {  
  79.                     // 把内存流对象包装成加密流对象  
  80.                     using (CryptoStream Decryptor = new CryptoStream(Memory,  
  81.                     Aes.CreateDecryptor(bKey, bVector),  
  82.                     CryptoStreamMode.Read))  
  83.                     {  
  84.                         // 明文存储区  
  85.                         using (MemoryStream originalMemory = new MemoryStream())  
  86.                         {  
  87.                             Byte[] Buffer = new Byte[1024];  
  88.                             Int32 readBytes = 0;  
  89.                             while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)  
  90.                             {  
  91.                                 originalMemory.Write(Buffer, 0, readBytes);  
  92.                             }  
  93.   
  94.                             original = originalMemory.ToArray();  
  95.                         }  
  96.                     }  
  97.                 }  
  98.             }  
  99.             catch  
  100.             {  
  101.                 original = null;  
  102.             }  
  103.             return Encoding.UTF8.GetString(original);  
  104.         }  
  105.   
  106.   
  107.   
  108.         /// <summary>  
  109.         /// AES加密(无向量)  
  110.         /// </summary>  
  111.         /// <param name="plainBytes">被加密的明文</param>  
  112.         /// <param name="key">密钥</param>  
  113.         /// <returns>密文</returns>  
  114.         public static string AESEncrypt(String Data, String Key)  
  115.         {  
  116.             MemoryStream mStream = new MemoryStream();  
  117.             RijndaelManaged aes = new RijndaelManaged();  
  118.   
  119.             byte[] plainBytes = Encoding.UTF8.GetBytes(Data);  
  120.             Byte[] bKey = new Byte[32];  
  121.             Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
  122.   
  123.             aes.Mode = CipherMode.ECB;  
  124.             aes.Padding = PaddingMode.PKCS7;  
  125.             aes.KeySize = 128;  
  126.             //aes.Key = _key;  
  127.             aes.Key = bKey;  
  128.             //aes.IV = _iV;  
  129.             CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);  
  130.             try  
  131.             {  
  132.                 cryptoStream.Write(plainBytes, 0, plainBytes.Length);  
  133.                 cryptoStream.FlushFinalBlock();  
  134.                 return Convert.ToBase64String(mStream.ToArray());  
  135.             }  
  136.             finally  
  137.             {  
  138.                 cryptoStream.Close();  
  139.                 mStream.Close();  
  140.                 aes.Clear();  
  141.             }  
  142.         }  
  143.   
  144.   
  145.         /// <summary>  
  146.         /// AES解密(无向量)  
  147.         /// </summary>  
  148.         /// <param name="encryptedBytes">被加密的明文</param>  
  149.         /// <param name="key">密钥</param>  
  150.         /// <returns>明文</returns>  
  151.         public static string AESDecrypt(String Data, String Key)  
  152.         {  
  153.             Byte[] encryptedBytes = Convert.FromBase64String(Data);  
  154.             Byte[] bKey = new Byte[32];  
  155.             Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);  
  156.               
  157.             MemoryStream mStream = new MemoryStream(encryptedBytes);  
  158.             //mStream.Write( encryptedBytes, 0, encryptedBytes.Length );  
  159.             //mStream.Seek( 0, SeekOrigin.Begin );  
  160.             RijndaelManaged aes = new RijndaelManaged();  
  161.             aes.Mode = CipherMode.ECB;  
  162.             aes.Padding = PaddingMode.PKCS7;  
  163.             aes.KeySize = 128;  
  164.             aes.Key = bKey;  
  165.             //aes.IV = _iV;  
  166.             CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateDecryptor(), CryptoStreamMode.Read);  
  167.             try  
  168.             {  
  169.                 byte[] tmp = new byte[encryptedBytes.Length + 32];  
  170.                 int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length + 32);  
  171.                 byte[] ret = new byte[len];  
  172.                 Array.Copy(tmp, 0, ret, 0, len);  
  173.                 return Encoding.UTF8.GetString(ret);  
  174.             }  
  175.             finally  
  176.             {  
  177.                 cryptoStream.Close();  
  178.                 mStream.Close();  
  179.                 aes.Clear();  
  180.             }  
  181.         }  
  182.   
  183.   
  184.   
  185.   
  186.     }  
  187. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值