首页 > 编程 > C# > 正文

C#代码实现对AES加密解密

2020-01-24 01:20:13
字体:
来源:转载
供稿:网友

ES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预期能成为人们公认的加密包括金融、电信和政府数字信息的方法。

本文实例为大家介绍C#实现对AES加密解密的详细代码,分享给大家供大家参考,具体内容如下

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO;   namespace AESDemo {  public static class AESHelper  {   /// <summary>   /// AES加密   /// </summary>   /// <param name="Data">被加密的明文</param>   /// <param name="Key">密钥</param>   /// <param name="Vector">向量</param>   /// <returns>密文</returns>   public static Byte[] AESEncrypt(Byte[] Data, String Key, String Vector)   {    Byte[] bKey = new Byte[32];    Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);    Byte[] bVector = new Byte[16];    Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);      Byte[] Cryptograph = null; // 加密后的密文      Rijndael Aes = Rijndael.Create();    try    {     // 开辟一块内存流     using (MemoryStream Memory = new MemoryStream())     {      // 把内存流对象包装成加密流对象      using (CryptoStream Encryptor = new CryptoStream(Memory,       Aes.CreateEncryptor(bKey, bVector),       CryptoStreamMode.Write))      {       // 明文数据写入加密流       Encryptor.Write(Data, 0, Data.Length);       Encryptor.FlushFinalBlock();         Cryptograph = Memory.ToArray();      }     }    }    catch    {     Cryptograph = null;    }      return Cryptograph;   }     /// <summary>   /// AES解密   /// </summary>   /// <param name="Data">被解密的密文</param>   /// <param name="Key">密钥</param>   /// <param name="Vector">向量</param>   /// <returns>明文</returns>   public static Byte[] AESDecrypt(Byte[] Data, String Key, String Vector)   {    Byte[] bKey = new Byte[32];    Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);    Byte[] bVector = new Byte[16];    Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);      Byte[] original = null; // 解密后的明文      Rijndael Aes = Rijndael.Create();    try    {     // 开辟一块内存流,存储密文     using (MemoryStream Memory = new MemoryStream(Data))     {      // 把内存流对象包装成加密流对象      using (CryptoStream Decryptor = new CryptoStream(Memory,      Aes.CreateDecryptor(bKey, bVector),      CryptoStreamMode.Read))      {       // 明文存储区       using (MemoryStream originalMemory = new MemoryStream())       {        Byte[] Buffer = new Byte[1024];        Int32 readBytes = 0;        while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)        {         originalMemory.Write(Buffer, 0, readBytes);        }          original = originalMemory.ToArray();       }      }     }    }    catch    {     original = null;    }      return original;   }  } }   不使用向量的方式: public static class AESCrypto  { /// <summary> /// IV向量为固定值 /// </summary>   //private static byte[] _iV = {   // 85, 60, 12, 116,   // 99, 189, 173, 19,   // 138, 183, 232, 248,   // 82, 232, 200, 242   //};     public static byte[] Decrypt(byte[] encryptedBytes, byte[] key)   { MemoryStream mStream = new MemoryStream( encryptedBytes ); //mStream.Write( encryptedBytes, 0, encryptedBytes.Length ); //mStream.Seek( 0, SeekOrigin.Begin ); RijndaelManaged aes = new RijndaelManaged( );    aes.Mode = CipherMode.ECB;    aes.Padding = PaddingMode.PKCS7;    aes.KeySize = 128; aes.Key = key; //aes.IV = _iV; CryptoStream cryptoStream = new CryptoStream( mStream, aes.CreateDecryptor( ), CryptoStreamMode.Read ); try {   byte[] tmp = new byte[ encryptedBytes.Length + 32 ]; int len = cryptoStream.Read( tmp, 0, encryptedBytes.Length + 32 ); byte[] ret = new byte[ len ]; Array.Copy( tmp, 0, ret, 0, len ); return ret; } finally { cryptoStream.Close( ); mStream.Close( ); aes.Clear( ); } }     public static byte[] Encrypt(byte[] plainBytes, byte[] key)   {    MemoryStream mStream = new MemoryStream();    RijndaelManaged aes = new RijndaelManaged();      aes.Mode = CipherMode.ECB;    aes.Padding = PaddingMode.PKCS7;    aes.KeySize = 128;    //aes.Key = _key;      aes.Key = key;    //aes.IV = _iV;    CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);    try    {     cryptoStream.Write(plainBytes, 0, plainBytes.Length);     cryptoStream.FlushFinalBlock();     return mStream.ToArray();    }    finally    {     cryptoStream.Close();     mStream.Close();     aes.Clear();    }   }  }

希望通过这篇文章大家对AES加密解密有所了解,对C#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表