DESCryptoServiceProvider 類加密解密

解決疑問:爲什麼需要賦值?

                des.Key = keyBytes;
                des.IV = keyBytes;

DESCryptoServiceProvider  點擊查看介紹

加密解密輔助類:點擊查看

私鑰加密

定義:定義一個包裝對象來訪問加密服務提供程序 (CSP) 版本的數據加密標準 (DES) 算法。 此類不能被繼承。

研究這個類不如去研究它的父類,所以我們把重點轉移到 Des這個類

Des

定義:表示數據加密標準 (DES) 算法的基類,所有 DES 實現都必須從此基類派生。

 

你需要知道:  

 

你只用設置Key(祕鑰)和 IV(向量)。

 

 

 4.0以下

   des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));

4.5或以上就會顯示此類已過時,所以我們得換一種寫法。

我們可以根據密碼來加密

複製代碼

  public static string MD5(string str)
        {
            //微軟md5方法參考return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5");
            byte[] b = Encoding.Default.GetBytes(str);
            b = new MD5CryptoServiceProvider().ComputeHash(b); 
            string ret = "";
            for (int i = 0; i < b.Length; i++)
                ret += b[i].ToString("x").PadLeft(2, '0'); //轉成16進制,如果小於2位用0補充
            return ret;
        }

複製代碼

 

 

 

 

 我們配置好了Key和IV ,就可以使用這個了,你可以知道,加密和解密所配置的Key和IV必須爲一樣的。

  加密/解碼都返回這個接口

 

 

準備工作完成了。最後一個類

CryptoStream 類

 定義將數據流鏈接到加密轉換的流。

 

第一個參數         流,

第二個參數         接口 

第三個參數       枚舉

完整的一套加密: 

複製代碼

  ///// <summary> 
        ///// 加密數據 
        ///// </summary> 
        ///// <param name="text">加密字符串</param> 
        ///// <param name="skey">生成祕鑰,默認爲MATICSOFT</param> 
        ///// <returns>返回加密字符串</returns> 
        public static string Encrypt(string Text, string sKey = "MATICSOFT")
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray;
            inputByteArray = Encoding.Default.GetBytes(Text); //把文本轉成字節
            des.Key = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.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);//十六進制字符串,後面的2爲精度.
            }
            return ret.ToString();
        }


        /// <summary>
        /// 對祕鑰進行處理
        /// </summary>
        /// <param name="str">你的祕鑰</param>
        /// <returns></returns>
        public static string MD5(string str)
        {
            //微軟md5方法參考return FormsAuthentication.HashPasswordForStoringInConfigFile(str, "md5");
            byte[] b = Encoding.Default.GetBytes(str);
            b = new MD5CryptoServiceProvider().ComputeHash(b);
            string ret = "";
            for (int i = 0; i < b.Length; i++)
                ret += b[i].ToString("x").PadLeft(2, '0'); //轉成16進制,如果小於2位用0補充
            return ret;
        }

複製代碼

複製代碼

/// <summary> 
        /// 解密數據 
        /// </summary> 
        /// <param name="Text">加密的字符串</param> 
        /// <param name="sKey">解密祕鑰</param> 
        /// <returns>解密後的字符串</returns> 
        public static string Decrypt(string Text, string sKey = "MATICSOFT")
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            int len;
            len = Text.Length / 2;
            byte[] inputByteArray = new byte[len];
            int x, i;
            for (x = 0; x < len; x++)
            {
                i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
                inputByteArray[x] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(MD5(sKey).Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Encoding.Default.GetString(ms.ToArray());
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章