C#開發中經常使用的加密解密方法

相信不少人在開發過程當中常常會遇到須要對一些重要的信息進行加密處理,今天給你們分享我我的總結的一些加密算法:算法

常見的加密方式分爲可逆和不可逆兩種方式express

    可逆:RSA,AES,DES等數組

    不可逆:常見的MD5,SHAD等安全

1、MD5消息摘要算法

我想這是你們都常聽過的算法,可能也用的比較多。那麼什麼是MD5算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,也就是說沒法根據密文推導出明文。ide

MD5主要用途:函數

一、對一段信息生成信息摘要,該摘要對該信息具備惟一性,能夠做爲數字簽名ui

二、用於驗證文件的有效性(是否有丟失或損壞的數據)編碼

三、對用戶密碼的加密加密

四、在哈希函數中計算散列值spa

從上邊的主要用途中咱們看到,因爲算法的某些不可逆特徵,在加密應用上有較好的安全性。經過使用MD5加密算法,咱們輸入一個任意長度的字節串,都會生成一個128位的整數。因此根據這一點MD5被普遍的用做密碼加密。下面我就像你們演示一下怎樣進行密碼加密。

首先須要引入命名空間,先看一個比較簡單的MD5加密的例子:

using System.Security;

using System.Security.Cryptography;

public string ToMD5(string strs) 
{ MD5 md5
= new MD5CryptoServiceProvider(); byte[] bytes = Encoding.Default.GetBytes(strs);//將要加密的字符串轉換爲字節數組 byte[] encryptdata = md5.ComputeHash(bytes);//將字符串加密後也轉換爲字符數組 return Convert.ToBase64String(encryptdata);//將加密後的字節數組轉換爲加密字符串 }

這裏咱們須要注意的是,不管是在加密的過程當中,加密前要將加密字符串轉爲字節數組,加密後也要生成密文的字節數據,而後再轉化爲密文。

下面是關於MD5加密的其餘形式,能夠根據需求編寫大家本身須要的加密算法:

     /// <summary>
        /// 建立哈希字符串適用於任何 MD5 哈希函數 (在任何平臺) 上建立 32 個字符的十六進制格式哈希字符串
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static string Get32MD5One(string source)
        {
            using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
            {
                byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
                System.Text.StringBuilder sBuilder = new System.Text.StringBuilder();
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }

                string hash = sBuilder.ToString();
                return hash.ToUpper();
            }
        }

        /// <summary>
        /// 獲取16位md5加密
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static string Get16MD5One(string source)
        {
            using (System.Security.Cryptography.MD5 md5Hash = System.Security.Cryptography.MD5.Create())
            {
                byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(source));
                //轉換成字符串,並取9到25位
                string sBuilder = BitConverter.ToString(data, 4, 8);
                //BitConverter轉換出來的字符串會在每一個字符中間產生一個分隔符,須要去除掉
                sBuilder = sBuilder.Replace("-", "");
                return sBuilder.ToString().ToUpper();
            }
        }

        //// <summary>
        /// </summary>
        /// <param name="strSource">須要加密的明文</param>
        /// <returns>返回32位加密結果,該結果取32位加密結果的第9位到25位</returns>
        public static string Get32MD5Two(string source)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //獲取密文字節數組
            byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
            //轉換成字符串,32位
            string strResult = BitConverter.ToString(bytResult);
            //BitConverter轉換出來的字符串會在每一個字符中間產生一個分隔符,須要去除掉
            strResult = strResult.Replace("-", "");
            return strResult.ToUpper();
        }

        //// <summary>
        /// </summary>
        /// <param name="strSource">須要加密的明文</param>
        /// <returns>返回16位加密結果,該結果取32位加密結果的第9位到25位</returns>
        public static string Get16MD5Two(string source)
        {
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            //獲取密文字節數組
            byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(source));
            //轉換成字符串,並取9到25位
            string strResult = BitConverter.ToString(bytResult, 4, 8);
            //BitConverter轉換出來的字符串會在每一個字符中間產生一個分隔符,須要去除掉
            strResult = strResult.Replace("-", "");
            return strResult.ToUpper();
        }

2、DES加密

DES加密算法爲密碼體制中的對稱密碼體制,又被稱爲美國數據加密標準,是1972年美國IBM公司研製的對稱密碼體制加密算法。 明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第八、1六、2四、3二、40、4八、5六、64位是校驗位, 使得每一個密鑰都有奇數個1)分組後的明文組和56位的密鑰按位替代或交換的方法造成密文組的加密方法。

DES,全稱Data Encryption Standard,是一種對稱加密算法。因爲其安全性比較高(有限時間內,沒有一種加密方法能夠說是100%安全),極可能是最普遍的密鑰系統(咱們公司也在用,估計大家也有在用....),惟一一種方法能夠破解該算法,那就是窮舉法。

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="data">加密數據</param>
        /// <param name="key">8位字符的密鑰字符串</param>
        /// <param name="iv">8位字符的初始化向量字符串</param>
        /// <returns></returns>
        public static string DESEncrypt(string data, string key, string iv)
        {
            byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
            byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            int i = cryptoProvider.KeySize;
            MemoryStream ms = new MemoryStream();
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);

            StreamWriter sw = new StreamWriter(cst);
            sw.Write(data);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        }

        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="data">解密數據</param>
        /// <param name="key">8位字符的密鑰字符串(須要和加密時相同)</param>
        /// <param name="iv">8位字符的初始化向量字符串(須要和加密時相同)</param>
        /// <returns></returns>
        public static string DESDecrypt(string data, string key, string iv)
        {
            byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(key);
            byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(iv);

            byte[] byEnc;
            try
            {
                byEnc = Convert.FromBase64String(data);
            }
            catch
            {
                return null;
            }

            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream(byEnc);
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cst);
            return sr.ReadToEnd();
        }

此外還有AES加密算法,可是AES加密是一個新的能夠用於保護電子數據的加密算法。其產生的密碼是迭代對稱的分組密碼,代加密使用一個循環結構,在該循環中重複置換和替換輸入數據。

3、RSA加密算法

在談RSA加密算法以前,咱們須要先了解下兩個專業名詞,對稱加密和非對稱加密。

對稱加密即:含有一個稱爲密鑰的東西,在消息發送前使用密鑰對消息進行加密,在對方收到消息以後,使用相同的密鑰進行解密

非對稱加密即:加密和解密使用不一樣的密鑰的一類加密算法。這類加密算法一般有兩個密鑰A和B,使用密鑰A加密數據獲得的密文,只有密鑰B能夠進行解密操做(即便密鑰A也沒法解密),相反,使用了密鑰B加密數據獲得的密文,只有密鑰A能夠解密。這兩個密鑰分別稱爲私鑰和公鑰,顧名思義,私鑰就是你我的保留,不能公開的密鑰,而公鑰則是公開給加解密操做的另外一方的。根據不一樣用途,對數據進行加密所使用的密鑰也不相同(有時用公鑰加密,私鑰解密;有時相反用私鑰加密,公鑰解密)。非對稱加密的表明算法是RSA算法。

瞭解了這兩個名詞下面來說,RSA加密算法。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密算法,多用於數據加密和數字簽名。雖然有這麼大的影響力,可是同時它也有一些弊端,它產生密鑰很麻煩,受到素數產生技術的限制,於是難以作到一次一密,分組長度太大等。

下面經過示例演示使用RSA加密、解密,引用名稱空間System.Security.Cryptography;

     /// <summary> 
        /// RSA加密數據 
        /// </summary> 
        /// <param name="express">要加密數據</param> 
        /// <param name="KeyContainerName">密匙容器的名稱</param> 
        /// <returns></returns> 
        public static string RSAEncryption(string express, string KeyContainerName = null)
        {

            System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
            param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名稱,保持加密解密一致才能解密成功
            using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
            {
                byte[] plaindata = System.Text.Encoding.Default.GetBytes(express);//將要加密的字符串轉換爲字節數組
                byte[] encryptdata = rsa.Encrypt(plaindata, false);//將加密後的字節數據轉換爲新的加密字節數組
                return Convert.ToBase64String(encryptdata);//將加密後的字節數組轉換爲字符串
            }
        }
        /// <summary> 
        /// RSA解密數據 
        /// </summary> 
        /// <param name="express">要解密數據</param> 
        /// <param name="KeyContainerName">密匙容器的名稱</param> 
        /// <returns></returns> 
        public static string RSADecrypt(string ciphertext, string KeyContainerName = null)
        {
            System.Security.Cryptography.CspParameters param = new System.Security.Cryptography.CspParameters();
            param.KeyContainerName = KeyContainerName ?? "zhiqiang"; //密匙容器的名稱,保持加密解密一致才能解密成功
            using (System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(param))
            {
                byte[] encryptdata = Convert.FromBase64String(ciphertext);
                byte[] decryptdata = rsa.Decrypt(encryptdata, false);
                return System.Text.Encoding.Default.GetString(decryptdata);
            }
        }

4、Base64編碼

這個就不作過多解釋了,直接上代碼。

 #region Base64加密解密
        /// <summary>
        /// Base64加密
        /// </summary>
        /// <param name="input">須要加密的字符串</param>
        /// <returns></returns>
        public static string Base64Encrypt(string input)
        {
            return Base64Encrypt(input, new UTF8Encoding());
        }

        /// <summary>
        /// Base64加密
        /// </summary>
        /// <param name="input">須要加密的字符串</param>
        /// <param name="encode">字符編碼</param>
        /// <returns></returns>
        public static string Base64Encrypt(string input, Encoding encode)
        {
            return Convert.ToBase64String(encode.GetBytes(input));
        }

        /// <summary>
        /// Base64解密
        /// </summary>
        /// <param name="input">須要解密的字符串</param>
        /// <returns></returns>
        public static string Base64Decrypt(string input)
        {
            return Base64Decrypt(input, new UTF8Encoding());
        }

        /// <summary>
        /// Base64解密
        /// </summary>
        /// <param name="input">須要解密的字符串</param>
        /// <param name="encode">字符的編碼</param>
        /// <returns></returns>
        public static string Base64Decrypt(string input, Encoding encode)
        {
            return encode.GetString(Convert.FromBase64String(input));
        }
        #endregion

5、SHA安全散列算法

 SHA,全稱SecureHashAlgorithm,是一種數據加密算法,該算法的思想是接收一段明文,而後以一種不可逆的方式將它轉換成一段(一般更小)密文,也能夠簡單的理解爲取一串輸入碼(稱爲預映射或信息),並把它們轉化爲長度較短、位數固定的輸出序列即散列值(也稱爲信息摘要或信息認證代碼)的過程。

下面貼SHA各類加密算法代碼:

    //SHA爲不可逆加密方式
        public static string SHA1Encrypt(string Txt)
        {
            var bytes = System.Text.Encoding.Default.GetBytes(Txt);
            var SHA = new System.Security.Cryptography.SHA1CryptoServiceProvider();
            var encryptbytes = SHA.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public static string SHA256Encrypt(string Txt)
        {
            var bytes = System.Text.Encoding.Default.GetBytes(Txt);
            var SHA256 = new System.Security.Cryptography.SHA256CryptoServiceProvider();
            var encryptbytes = SHA256.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public static string SHA384Encrypt(string Txt)
        {
            var bytes = System.Text.Encoding.Default.GetBytes(Txt);
            var SHA384 = new System.Security.Cryptography.SHA384CryptoServiceProvider();
            var encryptbytes = SHA384.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }
        public string SHA512Encrypt(string Txt)
        {
            var bytes = System.Text.Encoding.Default.GetBytes(Txt);
            var SHA512 = new System.Security.Cryptography.SHA512CryptoServiceProvider();
            var encryptbytes = SHA512.ComputeHash(bytes);
            return Convert.ToBase64String(encryptbytes);
        }

6、AES加密算法 

 AES算法基於排列和置換運算。排列是對數據從新進行安排,置換是將一個數據單元替換爲另外一個。

AES 使用幾種不一樣的方法來執行排列和置換運算。    AES是一個迭代的、對稱密鑰分組的密碼,它可使用12八、192 和 256 位密鑰,而且用 128 位(16字節)分組加密和解密數據。與公共密鑰密碼使用密鑰對不一樣,對稱密鑰密碼使用相同的密鑰加密和解密數據。經過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重複置換和替換輸入數據。

     /// <summary>
        ///  AES 加密
        /// </summary>
        /// <param name="str">明文(待加密)</param>
        /// <param name="key">密文</param>
        /// <returns></returns>
        public string AesEncrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
 
            RijndaelManaged rm = new RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
 
            ICryptoTransform cTransform = rm.CreateEncryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return Convert.ToBase64String(resultArray);
        }
 
        /// <summary>
        ///  AES 解密
        /// </summary>
        /// <param name="str">明文(待解密)</param>
        /// <param name="key">密文</param>
        /// <returns></returns>
        public string AesDecrypt(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Convert.FromBase64String(str);
 
            RijndaelManaged rm = new RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = CipherMode.ECB,
                Padding = PaddingMode.PKCS7
            };
 
            ICryptoTransform cTransform = rm.CreateDecryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
 
            return Encoding.UTF8.GetString(resultArray);
        }

ok,今天關於C#常見加密算法的分享就到這裏了,喜歡的盆友能夠幫忙點個推薦,有什麼疑問的也歡迎留言指導!!!

相關文章
相關標籤/搜索