AES可逆加密算法

分享一段前段时间看到的AES可逆加密算法。

除去常见的MD5等加密方式,如果想要使用一些更加隐蔽的加密方式,则可以使用AES的RijndaelManaged加密算法。

 

关于加密,有很多复杂的算法,今天只跟大家分享一段摘取的结合动态密钥的对称AES RijndaelManaged加密解密算法,如果大家有兴趣了解更多,我们可以一起深入研究……

static void Main(string[] args)

        {

            string key = "8H[=}dKw+@3uV4D(";

            CryptoHelper helper = new CryptoHelper(key);

            if (args.Length == 2 && args[0] == "-e")

            {

                Console.WriteLine("Encrypt password: {0}", args[1]);

                string a = helper.Encrypt(args[1]);

                Console.WriteLine("Encrypt result is: {0}",a);

            }

            else if (args.Length == 2 && args[0] == "-d")

            {

                Console.WriteLine("Decrypt password: {0}", args[1]);

                string a = helper.Decrypt(args[1]);

                Console.WriteLine("Decrypt result is: {0}", a);

            }

        }

 

public class CryptoHelper

    {

        private const string _DefaultIntializationVector = "%1Az=-@qTx7h)5:-";

        private RijndaelManaged _crypto;

        private static Encoding _encoding = Encoding.ASCII;

        private CryptoHelper()

        {

        }

        /// <summary>

        /// RijndaelManaged (AES)

        /// </summary>

        /// <param name="key">the key for encrypt</param>

        public CryptoHelper(string key)

        {

            this._crypto = new RijndaelManaged();

            this._crypto.Key = CryptoHelper._encoding.GetBytes(key);

            this._crypto.IV = CryptoHelper._encoding.GetBytes("%1Az=-@qTx7h)5:-");

        }

 

        /// <summary>

        /// encrypt the string

        /// </summary>

        /// <param name="s">encrypt string</param>

        /// <returns>encrypt result</returns>

        public string Encrypt(string s)

        {

            byte[] bytes = CryptoHelper._encoding.GetBytes(s);

            MemoryStream memoryStream = new MemoryStream();

            CryptoStream cryptoStream = new CryptoStream(memoryStream, this._crypto.CreateEncryptor(), CryptoStreamMode.Write);

            cryptoStream.Write(bytes, 0, bytes.Length);

            cryptoStream.Close();

            memoryStream.Close();

            byte[] array = memoryStream.ToArray();

            if (array == null || array.Length == 0)

            {

                return "";

            }

            StringBuilder stringBuilder = new StringBuilder();

           byte[] array2 = array;

            for (int i = 0; i < array2.Length; i++)

            {

                byte b = array2[i];

                stringBuilder.Append(string.Format("{0:X2}", b));

            }

            return stringBuilder.ToString();

        }

 

        /// <summary>

        /// decrypt string

        /// </summary>

        /// <param name="hexValue"></param>

        /// <returns></returns>

        public string Decrypt(string hexValue)

        {

            byte[] array;

            if (hexValue == null || hexValue.Length == 0)

            {

                array = null;

            }

            else

            {

                int num = Convert.ToInt32(hexValue.Length / 2);

                array = new byte[num];

                for (int i = 0; i <= num - 1; i++)

                {

                    array[i] = Convert.ToByte(hexValue.Substring(i * 2, 2), 16);

                }

            }

            MemoryStream stream = new MemoryStream(array, 0, array.Length);

            byte[] array2 = new byte[array.Length - 1];

            CryptoStream cryptoStream = new CryptoStream(stream, this._crypto.CreateDecryptor(), CryptoStreamMode.Read);

            try

            {

                cryptoStream.Read(array2, 0, array.Length - 1);

            }

            catch (CryptographicException inner)

            {

                throw new CryptographicException("Unable to decrypt data. The provided key may be invalid.", inner);

            }

            finally

            {

                cryptoStream.Close();

            }

            int num2 = Array.IndexOf<byte>(array2, 0);

            if (num2 >= 0)

            {

                return CryptoHelper._encoding.GetString(array2, 0, num2);

            }

            return CryptoHelper._encoding.GetString(array2);

        }

    }

posted on 2015-04-10 17:10  cocoan  阅读(8167)  评论(0编辑  收藏  举报

导航