DES加解密算法实现类

来源:互联网 发布:对数据直报系统的认识 编辑:程序博客网 时间:2024/05/16 11:21
    /// <summary>    ///  加密和解密类    ///  </summary>    public class EnOrDeCrypt    {        //密钥,可写成字符串,这里是从配置文件中获取        public static string strKey = Convert.ToString(ConfigurationSettings.AppSettings["strKey"]);        public EnOrDeCrypt()        {            //            // TODO: 在此处添加构造函数逻辑,可以什么都不写            //        }        #region Des算法加密过程        /// <summary>        /// Des算法加密过程        /// </summary>        /// <param name="strEncrypt"></param>        /// <param name="strKey"></param>        /// <returns></returns>        public static string DesEncrypt(string strEncrypt, string strkey = null)        {            DESCryptoServiceProvider des = new DESCryptoServiceProvider();            //把字符串放到byte数组中            byte[] inputByteArray = Encoding.Default.GetBytes(strEncrypt);            //建立加密对象的密钥和偏移量            //建议密码长度为8位            if (String.IsNullOrEmpty(strkey))            {                strKey = matchToKey(strKey, 8);                des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);                des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);            }            else            {                strkey = matchToKey(strkey, 8);                des.Key = ASCIIEncoding.ASCII.GetBytes(strkey);                des.IV = ASCIIEncoding.ASCII.GetBytes(strkey);            }            //内存流            MemoryStream ms = new MemoryStream();            //加密转换流            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);            //将byte数组通过加密器写入内存流            cs.Write(inputByteArray, 0, inputByteArray.Length);            cs.FlushFinalBlock();            //得到加密后的字符串            StringBuilder ret = new StringBuilder();            foreach (byte b in ms.ToArray())            {                ret.AppendFormat("{0:X2}", b);            }            ret.ToString();            return ret.ToString();        }        #endregion        #region Des算法解密过程        /// <summary>        /// Des算法解密过程        /// </summary>        /// <param name="strDecrypt"></param>        /// <param name="strKey"></param>        /// <returns></returns>        public static string DesDecrypt(string strDecrypt)        {            //内存流            MemoryStream ms = new MemoryStream();            try            {                DESCryptoServiceProvider des = new DESCryptoServiceProvider();                //将字符串转换成byte型数组                byte[] inputByteArray = new byte[strDecrypt.Length / 2];                for (int x = 0; x < strDecrypt.Length / 2; x++)                {                    int i = (Convert.ToInt32(strDecrypt.Substring(x * 2, 2), 16));                    inputByteArray[x] = (byte)i;                }                //转换成8位的密码                strKey = matchToKey(strKey, 8);                des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);                des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);                //解密转换流                CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);                //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象                StringBuilder ret = new StringBuilder();                //将加密后的数据通解密器转化成内存流                cs.Write(inputByteArray, 0, inputByteArray.Length);                cs.FlushFinalBlock();            }            catch (Exception ex)            {                ms.Dispose();                string url = "/Train/error.aspx?ErrorMessage=" + "参数错误。";                System.Web.HttpContext.Current.Response.Redirect(url);            }            return System.Text.Encoding.Default.GetString(ms.ToArray());        }        #endregion        #region 将字符串转换成指定位数,不足补'A',多了截取        /// <summary>        /// 将字符串转换成指定位数,不足补'A',多了截取        /// </summary>        /// <param name="strKey">初始字符串</param>        /// <param name="iLength">要得到的字符串长度</param>        /// <returns>转换后的结果</returns>        public static string matchToKey(string strKey, int iLength)        {            if (strKey.Length < iLength)            {                string strTemp = "";                for (int i = 0; i < iLength - strKey.Length; i++)                {                    strTemp += "A";//不足位用字母'A'补齐                }                strKey += strTemp;            }            else            {                strKey = strKey.Substring(0, iLength);            }            return strKey;        }        #endregion        #region .net中md5不可逆加密算法实现        /// <summary>        /// .net中md5不可逆加密算法实现        /// </summary>        /// <param name="strData">初始数据</param>        /// <returns>加密后的结果字符串</returns>        public static string MD5(string strData)        {            //将字符串转换成Byte型数组            byte[] btData = System.Text.Encoding.Default.GetBytes(strData);            //得到加密后的Byte型数组            btData = new MD5CryptoServiceProvider().ComputeHash(btData);            //将加密后的Byte型数组转换成字符串            string ret = "";            for (int i = 0; i < btData.Length; i++)            {                ret += btData[i].ToString("x").PadLeft(2, '0');            }            return ret;        }        #endregion    }

原创粉丝点击