Asp.Net 經常使用工具類之加密——對稱加密DES算法(2)

  

 

  又到週末,下午博客園看了兩篇文章,關於老跳和老趙的程序員生涯,不由感嘆漫漫程序路,何去何從兮!程序員

  轉眼畢業的第三個年頭,去過蘇州,跑過上海,從一開始的凌雲壯志,去年背起行囊默默回到了長沙準備買房,也想有個家(畢竟年級不小了),有盼頭的工做前景。算法

  看到老趙和老跳兩位前輩的故事,真實且現實,同時也有一丟丟的小迷茫,敢問路在何方!安全


  感嘆一下子,生命不止,Code不止,繼續入坑!ide

  昨天分享了一下非對稱加密RSA算法,今天給朋友們分享一下對稱加密DES算法案例。ui

  加解密過程:加密

  一、生成加密密鑰key,密碼越長,越難破解,窮舉太累spa

  二、加密:經過等分、移位、選取和迭代造成一套16個加密密鑰,分別供每一輪運算中使用code

  三、解密:解密密鑰的次序相反orm

  上述我理解的DES加解密過程,固然咯,這裏涉及到密碼安全學,本人涉及粗淺。詳情百度《DES加密算法原理》。blog

  C#中大多加解密算法都集中在 System.Security.Cryptography 空間,謹記。

  下面經過一個案例給你們展現一下:

using System;
using System.Globalization;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Utils.PassWord
{
    /// <summary>
    /// DES加解密
    /// </summary>
    public static class DES
    {
        /// <summary>
        /// 生成key
        /// </summary>
        public static void Generator(out string key)
        {
            DESCryptoServiceProvider des = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
            key = ASCIIEncoding.ASCII.GetString(des.Key);
        }

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="password"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string DESEncrypt(string password, string key)
        {
            byte[] data = Encoding.UTF8.GetBytes(password);
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
            ICryptoTransform desEncrypt = DES.CreateEncryptor();
            byte[] result = desEncrypt.TransformFinalBlock(data, 0, data.Length);
            return BitConverter.ToString(result);
        }

        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="password"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string DESDecrypt(string password, string key)
        {
            string[] sinput = password.Split("-".ToCharArray());
            byte[] data = new byte[sinput.Length];
            for (int i = 0; i < sinput.Length; i++)
            {
                data[i] = byte.Parse(sinput[i], NumberStyles.HexNumber);
            }
            DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
            DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
            DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
            ICryptoTransform desencrypt = DES.CreateDecryptor();
            byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
            return Encoding.UTF8.GetString(result);
        }

        /// <summary>   
        /// 加密數據   MD5方式
        /// </summary>   
        /// <param name="str"></param>   
        /// <param name="key">加密密鑰</param>   
        /// <returns></returns>   
        public static string DESEncryptMD5(string str, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray;
            inputByteArray = Encoding.Default.GetBytes(str); 
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").Substring(0, 8));
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
                ret.AppendFormat("{0:X2}", b);
            return ret.ToString();
        }

        /// <summary>   
        /// 解密數據   MD5方式
        /// </summary>   
        /// <param name="str"></param>   
        /// <param name="key">加密密鑰</param>   
        /// <returns></returns>   
        public static string DESDecryptMD5(string str, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            int len;
            len = str.Length / 2;
            byte[] inputByteArray = new byte[len];
            int x, i;
            for (x = 0; x < len; x++)
            {
                i = Convert.ToInt32(str.Substring(x * 2, 2), 16);
                inputByteArray[x] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").Substring(0, 8));
            MemoryStream ms = new  MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Encoding.Default.GetString(ms.ToArray());
        }
    } 
}

調用方式

public static void des()
{
    string key = "";
    DES.Generator(out key);
    var aaa = DES.DESEncryptMD5("123456789", "12312312");
    var bbb = DES.DESDecryptMD5(aaa, "12312312");
    var cc = DES.DESEncrypt("123456789", key);
    var dd = DES.DESDecrypt(cc, key);
}
 
 

 

 

 

OK,各位看官,這一期的文章對稱加密DES算法寫到這裏喏,感謝你們的支持,您的支持是個人動力!

下一期給你們帶來的是加密可逆與不可逆的幾種方式,敬請期待!!!

相關文章
相關標籤/搜索