加密算法C#实现:AES

5.1 原理简述

  AES(高级加密算法,Advanced Encryption Standard),美国政府提出,该加密算法采用对称分组密码体制,提供128位、192位和256位三种密钥长度,算法应易于各种硬件和软件实现。这种加密算法是美国联邦政府采用的区块加密标准。AES本身就是为了取代DES的,AES具有更好的安全性、效率和灵活性。.

5.2 C#代码

// AES(高级加密算法,Advanced Encryption Standard),美政府提出

public sealed class AES

{

    /// <summary>

    /// AES加密

    /// </summary>

    /// <param name="plaintext">明文</param>

    /// <param name="key">密钥,长度16byte</param>

    /// <param name="IV">初始化向量,长度16byte</param>

    /// <returns>返回密文</returns>

    public static string AESEncrypt(string plaintext, string key, string iv)

    {

        if (plaintext == "") return "";

        try

        {

            byte[] btKey = Encoding.UTF8.GetBytes(key);

            byte[] btIV = Encoding.UTF8.GetBytes(iv);

 

            byte[] inputByteArray = Encoding.UTF8.GetBytes(plaintext);

            using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())

            {

                using (MemoryStream mStream = new MemoryStream())

                {

                    CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write);

                    cStream.Write(inputByteArray, 0, inputByteArray.Length);

                    cStream.FlushFinalBlock();

                    cStream.Close();

                    return Convert.ToBase64String(mStream.ToArray());

                }

            }

        }

        catch { }

        return "AES加密出错";

    }

 

    /// <summary>

    /// AES解密

    /// </summary>

    /// <param name="ciphertext">密文</param>

    /// <param name="key">密钥,长度16byte</param>

    /// <param name="iv">初始化向量,长度16byte</param>

    /// <returns>返回明文</returns>

    public static string AESDecrypt(string ciphertext, string key, string iv)

    {

        if (ciphertext == "") return "";

        try

        {

            byte[] btKey = Encoding.UTF8.GetBytes(key);

            byte[] btIV = Encoding.UTF8.GetBytes(iv);

 

            byte[] inputByteArray = Convert.FromBase64String(ciphertext);

            using (AesCryptoServiceProvider provider = new AesCryptoServiceProvider())

            {

                using (MemoryStream mStream = new MemoryStream())

                {

                    CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write);

                    cStream.Write(inputByteArray, 0, inputByteArray.Length);

                    cStream.FlushFinalBlock();

                    cStream.Close();

                    return Encoding.UTF8.GetString(mStream.ToArray());

                }

            }

        }

        catch { }

        return "AES解密出错";

    }

}