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

來源:互聯網
上載者:User

標籤:.net   程式   efault   name   對稱式加密   ace   substring   esc   a演算法   

  

 

  又到周末,下午部落格園看了兩篇文章,關於老跳和老趙的程式員生涯,不禁感歎漫漫程式路,何去何從兮!

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

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

  感歎一會兒,生命不止,Code不止,繼續入坑!

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

  加解密過程:

  1、產生加密金鑰key,密碼越長,越難破解,窮舉太累

  2、加密:通過等分、移位、選取和迭代形成一套16個加密金鑰,分別供每一輪運算中使用

  3、解密:解密密鑰的次序相反

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

  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演算法寫到這裡喏,感謝大家的支援,您的支援是我的動力!

下一期給大家帶來的是加密可逆與無法復原的幾種方式,敬請期待!!!

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.