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

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#程序设计有所帮助。

(0)

相关推荐

  • C#的3DES加密解密算法实例代码

    C#类如下: 复制代码 代码如下: using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO; namespace ConsoleApplication1{    /// <summary>    /// 加解密类    /// </summary>    public class EncryptHelper  

  • C#实现对AES加密和解密的方法

    AES简介 AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范.它被预期能成为人们公认的加密包括金融.电信和政府数字信息的方法. AES 是一个新的可以用于保护电子数据的加密算法.明确地说,AES 是一个迭代的.对称密钥分组的密码,它可以使用128.192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据.通过分组密码返回的加密数据

  • C# 3DES加密详解

    最近一个项目中,因为服务端是用的java开发的,客户端是用的C#,由于通信部分采用到了3DES加密,所以做个记录,以备以后需要的时候直接用. 这是对方(java)的加密算法,和网上流传的代码也差不多(主密钥直接写死了,方便测试) package org.zwork.market.mina.msg; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import

  • Javascript C#真正可以交互的DES加解密代码

    因项目需要,要用js加密后,提交给C#解密, 在网上找了半天,网上有无数个版本,却找不到一个能互相使用的 甚至就连都是js版本的,都不能互通,汗一个. 因为时间关系,没有去深究加密代码,就随便下载了一个JS版本的, 并把它改写成C#版本的 这样JS加密后的结果,C#也能解密 反之C#加密后的结果,JS也能解密 我把它发出来给大家共享吧 注:源代码是VS.Net2008版本创建的,里面包含js的加解密函数和C#的加解密函数 如果你找到什么bug,或有啥好建议,不妨联系一下俺,呵呵: btw:在改写

  • C#实现的AES加密解密完整实例

    本文实例讲述了C#实现的AES加密解密.分享给大家供大家参考,具体如下: /****************************************************************** * 创建人:HTL * 说明:C# AES加密解密 *******************************************************************/ using System; using System.Security.Cryptography;

  • C#使用DES和AES实现加密解密功能示例

    本文实例讲述了C#使用DES和AES实现加密解密功能.分享给大家供大家参考,具体如下: using System; using System.Text; using System.Security.Cryptography; using System.IO; namespace MyCryptography { /// <summary> /// DES加密解密 /// </summary> public class DES { /// <summary> /// 获取

  • c#通过DES加密算法加密大文件的方法

    本文实例讲述了c#通过DES加密算法加密大文件的方法.分享给大家供大家参考.具体实现方法如下: using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using Syst

  • C#对称加密(AES加密)每次生成的结果都不同的实现思路和代码实例

    思路:使用随机向量,把随机向量放入密文中,每次解密时从密文中截取前16位,其实就是我们之前加密的随机向量. 代码: public static string Encrypt(string plainText, string AESKey) { RijndaelManaged rijndaelCipher = new RijndaelManaged(); byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组

  • C#编写DES加密、解密类

    这个C#类封装的DES加密解密,可以使用默认秘钥进行加密.解密,也可以自定义秘钥进行加密.解密,调用简单方便. 示例一: using System; using System.Security.Cryptography; using System.Text; namespace DotNet.Utilities { /// <summary> /// DES加密/解密类. /// </summary> public class DESEncrypt { public DESEncr

  • C# DES加密算法中向量的作用详细解析

    DES一共就有4个参数参与运作:明文.密文.密钥.向量.为了初学者容易理解,可以把4个参数的关系写成:密文=明文+密钥+向量:明文=密文-密钥-向量.为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复,那么这个词加上密钥形成的密文,仍然会重复,这给破解者有机可乘,破解者可以根据重复的内容,猜出是什么词,然而一旦猜对这个词,那么,他就能算出密钥,整篇文章就被破解了!加上向量这个参数以后,每块文字段都会依次加上一段值,这样,即使相同的文字,加密出来的密文,也是不一样的,算法的安全性大大提高!

随机推荐