幾個密碼編譯演算法

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.