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());
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章