幾個加密算法

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中讀入指定的緩衝區中完成任務。

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