几个加密算法

1,单向加密:SHA1和MD5,只能加密而不能解密,常用语密码的存储。使用方法各有两种。

public static string EncrtptMD5(string pData,string pEncode)
        {
            MD5CryptoServiceProvider sMD5 = new MD5CryptoServiceProvider();
            try
            {
                byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
                byte[] sRes = sMD5.ComputeHash(sData, 0, sData.Length);
                return Convert.ToBase64String(sRes, 0, sRes.Length);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
                return "";
            }
        }

        public static string EncryptSHA1(string pData, string pEncode)
        {
            SHA1CryptoServiceProvider sSHA1 = new SHA1CryptoServiceProvider();
            try
            {
                byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
                byte[] sRes = sSHA1.ComputeHash(sData, 0, sData.Length);
                return Convert.ToBase64String(sRes);
            }
            catch (Exception E)
            {
                MessageBox.Show(E.Message);
                return "";
            }
        }

        public static string EncryptMD5(string pData)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(pData, "MD5");
        }

        public static string EncryptSHA1(string pData)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(pData,"SHA1");
        }

2,双向加密DES,由于不怎么安全实际用的不是很多

public static string EncryptDES(string pData, string pKey, string pV, string pEncode)
        {
            if (pKey.Length > 8)
                pKey = pKey.Substring(0, 8);
            else if (pKey.Length < 8)
                pKey = pKey + "abcdefgh".Substring(0,8-pKey.Length);

            DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
            byte[] sData = Encoding.GetEncoding(pEncode).GetBytes(pData);
            byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
            byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);

            MemoryStream sMemStream = new MemoryStream();
            CryptoStream sCrptStream = new CryptoStream(sMemStream, sDes.CreateEncryptor(sKey, sV), CryptoStreamMode.Write);
            sCrptStream.Write(sData, 0, sData.Length);
            sCrptStream.FlushFinalBlock();

            return Convert.ToBase64String(sMemStream.ToArray());
        }
        public static string DecryptDES(string pData, string pKey, string pV, string pEncode)
        {
            if (pKey.Length > 8)
                pKey = pKey.Substring(0, 8);
            else if (pKey.Length < 8)
                pKey = pKey + "abcdefgh".Substring(0, 8 - pKey.Length);

/*          DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
            byte[] sData = Convert.FromBase64String(pData);
            byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
            byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);

            MemoryStream sMemStream = new MemoryStream();
            CryptoStream sCryStream = new CryptoStream(sMemStream, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Write);
            sCryStream.Write(sData, 0, sData.Length);
            sCryStream.FlushFinalBlock();

            return Encoding.UTF8.GetString(sMemStream.ToArray());//Convert.ToBase64String(sMemStream.ToArray());*/
            DESCryptoServiceProvider sDes = new DESCryptoServiceProvider();
            byte[] sData = Convert.FromBase64String(pData);
            byte[] sKey = Encoding.GetEncoding(pEncode).GetBytes(pKey);
            byte[] sV = Encoding.GetEncoding(pEncode).GetBytes(pV);

            MemoryStream sMem = new MemoryStream(sData);
            CryptoStream sCrypt = new CryptoStream(sMem, sDes.CreateDecryptor(sKey, sV), CryptoStreamMode.Read);

           

            /*byte[] sRes = new byte[sData.Length];
            sCrypt.Read(sRes, 0, sData.Length);
            return Encoding.GetEncoding(pEncode).GetString(sRes);不怎么好,因为字节数组大小不好确定*/

            StreamReader sReader = new StreamReader(sCrypt);//比较好,要注意,Reader流只能与Read模式配合
            return sReader.ReadToEnd();
        }

3,关于加密算法有两点需要说明

(a)最好不要用Encoding类把加密的数据转化为字符串,因为它会验证和转换Unicode不允许使用的无效值,这样的话就可能使得将字符串转换回字节数组时得到不同的结果。用Convert.ToBase64String是个不错的选择,所以上面的代码需要一些微小的改动。

(b)DES的解密算法中既可以为CryptoStream指定写模式也可为它指定读模式。处于写模式时MemStream的初始化不需要数据,通过Write方法将数据写入Memstream中,最后将Memstream流转换为数组完成任务;处于读模式时Memstream的初始化需要数据,通过Read方法将数据从Memstream中读入指定的缓冲区中完成任务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章