概述 數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的一段代碼,通常稱為“密文”,使其只能在輸入相應的密鑰之後才能顯示出本來內容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。 該過程的逆過程為解密,即將該編碼信息轉化為其原來數據的過程。加密建立在對信息進行數學編碼和解碼的基礎上。加密類型分為兩種,對稱加密與非對稱加密,對稱加密雙方采用共同密鑰。非對稱加密,這種加密方式存在兩個密鑰,一個是公共密鑰(對外公開),一種是私人密鑰(對外保密)。 一、摘要算法 數據摘要算法是密碼學算法中非常重要的一個分支,它通過對所有數據提取指紋信息以實現數據簽名、數據完整性校驗等功能,由於其不可逆性,有時候會被用做敏感信息的加密。數據摘要算法也被稱為哈希(Hash)算法或散列算法。 應用范圍:密碼加密、數據完整性校驗、數字簽名等 這裡介紹常用的兩種摘要算法,MD5與SHA1。 1、MD5 哈希函數將任意長度的二進制字符串映射為固定長度的小型二進制字符串。 加密哈希函數有這樣一個屬性:在計算上不大可能找到散列為相同的值的兩個不同的輸入;也就是說,兩組數據的哈希值僅在對應的數據也匹配時才會匹配。 數據的少量更改會在哈希值中產生不可預知的大量更改。MD5 算法的哈希值大小為 128 位。 MD5 類的 ComputeHash 方法將哈希作為 16 字節的數組返回。 請注意,某些 MD5 實現會生成 32 字符的十六進制格式哈希。 若要與此類實現進行互操作,請將 ComputeHash 方法的返回值格式化為十六進制值。 MD5加密: 復制代碼 /// <summary> /// MD5加密為32字符長度的16進制字符串 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string EncryptByMD5(string input) { MD5 md5Hasher = MD5.Create(); byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input)); StringBuilder sBuilder = new StringBuilder(); //將每個字節轉為16進制 for (int i = 0; i < data.Length; i++) { sBuilder.Append(data[i].ToString("x2")); } return sBuilder.ToString(); } 復制代碼 2、SHA1 計算輸入數據的 SHA1 哈希值。 哈希值用作表示大量數據的固定大小的唯一值。 如果相應的數據也匹配,則兩個數據集的哈希應該匹配。 數據的少量更改會在哈希值中產生不可預知的大量更改。 SHA1 算法的哈希值大小為 160 位。 SHA1加密: 復制代碼 /// <summary> /// SHA1加密 /// </summary> /// <param name="input"></param> /// <returns></returns> public static string EncryptBySHA1(string input) { SHA1 sha = new SHA1CryptoServiceProvider(); byte[] bytes = Encoding.Unicode.GetBytes(input); byte[] result = sha.ComputeHash(bytes); return BitConverter.ToString(result); } 復制代碼 二、對稱加密 對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數的對稱算法中,加密密鑰和解密密鑰是相同的,所以也稱這種加密算法為秘密密鑰算法或單密鑰算法。 原理圖: 優點:算法公開、計算量小、加密速度快、加密效率高。 缺點:密鑰管理困難,使用成本較高。與公開密鑰加密算法比起來,對稱加密算法能夠提供加密和認證卻缺乏了簽名功能,使得使用范圍有所縮小。 常用的對稱加密算法有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等 應用場景:數據傳輸、大數據量加密、敏感數據加密等等 這裡重點介紹常用的DES與AES加密算法。 1、DES 最早、最著名的保密密鑰或對稱密鑰加密算法DES(Data Encryption Standard)是由IBM公司在70年代發展起來的,並經政府的加密標准篩選後,於1976年11月被美國政府采用,DES隨後被美國國家標准局和美國國家標准協會(American National Standard Institute,ANSI)承認。 DES使用56位密鑰對64位的數據塊進行加密,並對64位的數據塊進行16輪編碼。與每輪編碼時,一個48位的"每輪"密鑰值由56位的完整密鑰得出來。DES用軟件進行解碼需用很長時間,而用硬件解碼速度非常快。幸運的是,當時大多數黑客並沒有足夠的設備制造出這種硬件設備。在1977年,人們估計要耗資兩千萬美元才能建成一個專門計算機用於DES的解密,而且需要12個小時的破解才能得到結果。當時DES被認為是一種十分強大的加密方法。 隨著計算機硬件的速度越來越快,制造一台這樣特殊的機器的花費已經降到了十萬美元左右,而用它來保護十億美元的銀行,那顯然是不夠保險了。另一方面,如果只用它來保護一台普通服務器,那麼DES確實是一種好的辦法,因為黑客絕不會僅僅為入侵一個服務器而花那麼多的錢破解DES密文。 但是,這個算法,現在已經能夠輕易破解。不過對於日常的非機密文件同樣可以繼續使用。 加密: 復制代碼 /// <summary> /// 加密字符串 /// </summary> /// <param name="input"></param> /// <param name="sKey"></param> /// <returns></returns> public static string EncryptString(string input, string sKey) { byte[] data = Encoding.UTF8.GetBytes(input); using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = des.CreateEncryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return BitConverter.ToString(result); } } 復制代碼 解密: 復制代碼 /// <summary> /// 解密字符串 /// </summary> /// <param name="input"></param> /// <param name="sKey"></param> /// <returns></returns> public static string DecryptString(string input, string sKey) { string[] sInput = input.Split("-".ToCharArray()); byte[] data = new byte[sInput.Length]; for (int i = 0; i < sInput.Length; i++) { data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber); } using (DESCryptoServiceProvider des = new DESCryptoServiceProvider()) { des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); des.IV = ASCIIEncoding.ASCII.GetBytes(sKey); ICryptoTransform desencrypt = des.CreateDecryptor(); byte[] result = desencrypt.TransformFinalBlock(data, 0, data.Length); return Encoding.UTF8.GetString(result); } } 復制代碼