using System; using System.IO; using System.Data; using System.Text; using System.Diagnostics; using System.Security; using System.Security.Cryptography; /* * .Net框架因爲擁有CLR提供的豐富庫支持,只需不多的代碼便可實現先前使用C等舊式語言很難實現的加密算法。本類實現一些經常使用機密算法,供參考。其中MD5算法返回Int的ToString字串。返回數字字母型結果的算法參見以前Blog文章 */ namespace 檔案數字化加工 { /// <summary> /// 類名:HashEncrypt /// 做用:對傳入的字符串進行Hash運算,返回經過Hash算法加密過的字串。 /// 屬性:[無] /// 構造函數額參數: /// IsReturnNum:是否返回爲加密後字符的Byte代碼 /// IsCaseSensitive:是否區分大小寫。 /// 方法:此類提供MD5,SHA1,SHA256,SHA512等四種算法,加密字串的長度依次增大。 /// </summary> public class HashEncrypt { //private string strIN; private bool isReturnNum; private bool isCaseSensitive; /// <summary> /// 類初始化,此類提供MD5,SHA1,SHA256,SHA512等四種算法,加密字串的長度依次增大。 /// </summary> /// <param name="IsCaseSensitive">是否區分大小寫</param> /// <param name="IsReturnNum">是否返回爲加密後字符的Byte代碼</param> public HashEncrypt(bool IsCaseSensitive, bool IsReturnNum) { this.isReturnNum = IsReturnNum; this.isCaseSensitive = IsCaseSensitive; } private string getstrIN(string strIN) { //string strIN = strIN; if (strIN.Length == 0) { strIN = "~NULL~"; } if (isCaseSensitive == false) { strIN = strIN.ToUpper(); } return strIN; } public string MD5Encrypt(string strIN) { //string strIN = getstrIN(strIN); byte[] tmpByte; MD5 md5 = new MD5CryptoServiceProvider(); tmpByte = md5.ComputeHash(GetKeyByteArray(getstrIN(strIN))); md5.Clear(); return GetStringValue(tmpByte); } public string SHA1Encrypt(string strIN) { //string strIN = getstrIN(strIN); byte[] tmpByte; SHA1 sha1 = new SHA1CryptoServiceProvider(); tmpByte = sha1.ComputeHash(GetKeyByteArray(strIN)); sha1.Clear(); return GetStringValue(tmpByte); } public string SHA256Encrypt(string strIN) { //string strIN = getstrIN(strIN); byte[] tmpByte; SHA256 sha256 = new SHA256Managed(); tmpByte = sha256.ComputeHash(GetKeyByteArray(strIN)); sha256.Clear(); return GetStringValue(tmpByte); } public string SHA512Encrypt(string strIN) { //string strIN = getstrIN(strIN); byte[] tmpByte; SHA512 sha512 = new SHA512Managed(); tmpByte = sha512.ComputeHash(GetKeyByteArray(strIN)); sha512.Clear(); return GetStringValue(tmpByte); } /// <summary> /// 使用DES加密(Added by niehl 2005-4-6) /// </summary> /// <param name="originalValue">待加密的字符串</param> /// <param name="key">密鑰(最大長度8)</param> /// <param name="IV">初始化向量(最大長度8)</param> /// <returns>加密後的字符串</returns> public string DESEncrypt(string originalValue, string key, string IV) { //將key和IV處理成8個字符 key += "12345678"; IV += "12345678"; key = key.Substring(0, 8); IV = IV.Substring(0, 8); SymmetricAlgorithm sa; ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; sa = new DESCryptoServiceProvider(); sa.Key = Encoding.UTF8.GetBytes(key); sa.IV = Encoding.UTF8.GetBytes(IV); ct = sa.CreateEncryptor(); byt = Encoding.UTF8.GetBytes(originalValue); ms = new MemoryStream(); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Convert.ToBase64String(ms.ToArray()); } public string DESEncrypt(string originalValue, string key) { return DESEncrypt(originalValue, key, key); } /// <summary> /// 使用DES解密(Added by niehl 2005-4-6) /// </summary> /// <param name="encryptedValue">待解密的字符串</param> /// <param name="key">密鑰(最大長度8)</param> /// <param name="IV">m初始化向量(最大長度8)</param> /// <returns>解密後的字符串</returns> public string DESDecrypt(string encryptedValue, string key, string IV) { //將key和IV處理成8個字符 key += "12345678"; IV += "12345678"; key = key.Substring(0, 8); IV = IV.Substring(0, 8); SymmetricAlgorithm sa; ICryptoTransform ct; MemoryStream ms; CryptoStream cs; byte[] byt; sa = new DESCryptoServiceProvider(); sa.Key = Encoding.UTF8.GetBytes(key); sa.IV = Encoding.UTF8.GetBytes(IV); ct = sa.CreateDecryptor(); byt = Convert.FromBase64String(encryptedValue); ms = new MemoryStream(); cs = new CryptoStream(ms, ct, CryptoStreamMode.Write); cs.Write(byt, 0, byt.Length); cs.FlushFinalBlock(); cs.Close(); return Encoding.UTF8.GetString(ms.ToArray()); } public string DESDecrypt(string encryptedValue, string key) { return DESDecrypt(encryptedValue, key, key); } private string GetStringValue(byte[] Byte) { string tmpString = ""; if (this.isReturnNum == false) { ASCIIEncoding Asc = new ASCIIEncoding(); tmpString = Asc.GetString(Byte); } else { int iCounter; for (iCounter = 0; iCounter < Byte.Length; iCounter++) { tmpString = tmpString + Byte[iCounter].ToString(); } } return tmpString; } private byte[] GetKeyByteArray(string strKey) { ASCIIEncoding Asc = new ASCIIEncoding(); int tmpStrLen = strKey.Length; byte[] tmpByte = new byte[tmpStrLen - 1]; tmpByte = Asc.GetBytes(strKey); return tmpByte; } } }