相信很多人在開發過程中經常會遇到需要對一些重要的信息進行加密處理,今天給大家分享我個人總結的一些加密演算法: 常見的加密方式分為可逆和不可逆兩種方式 可逆:RSA,AES,DES等 不可逆:常見的MD5,SHAD等 一、MD5消息摘要演算法 我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5 ...
相信很多人在開發過程中經常會遇到需要對一些重要的信息進行加密處理,今天給大家分享我個人總結的一些加密演算法:
常見的加密方式分為可逆和不可逆兩種方式
可逆:RSA,AES,DES等
不可逆:常見的MD5,SHAD等
一、MD5消息摘要演算法
我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5演算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,也就是說無法根據密文推導出明文。
MD5主要用途:
1、對一段信息生成信息摘要,該摘要對該信息具有唯一性,可以作為數字簽名
2、用於驗證文件的有效性(是否有丟失或損壞的數據)
3、對用戶密碼的加密
4、在哈希函數中計算散列值
從上邊的主要用途中我們看到,由於演算法的某些不可逆特征,在加密應用上有較好的安全性。通過使用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(); }
二、DES加密
DES加密演算法為密碼體制中的對稱密碼體制,又被稱為美國數據加密標準,是1972年美國IBM公司研製的對稱密碼體制加密演算法。 明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、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加密是一個新的可以用於保護電子數據的加密演算法。其產生的密碼是迭代對稱的分組密碼,代加密使用一個迴圈結構,在該迴圈中重覆置換和替換輸入數據。
三、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); } }
四、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
五、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); }
六、AES加密演算法
AES演算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。
AES 使用幾種不同的方法來執行排列和置換運算。 AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、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#常見加密演算法的分享就到這裡了,喜歡的盆友可以幫忙點個推薦,有什麼疑問的也歡迎留言指導!!!