using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.IO; namespace Ella.ToolKit { /// <summary> /// 加密/解密操作类 /// <para/>Author : AnDequan /// <para/>Date : 2011-1-4 /// </summary> public sealed class EncryptHelper : Singleton<EncryptHelper> { /// <summary> /// 加密 /// <para/>Author : AnDequan /// <para/>Date : 2010-8-12 /// </summary> /// <param name="enStr">要加密字符串</param> /// <param name="key">密钥(长度只能为8)</param> /// <returns>加密后字符串</returns> public string EnCode(string enStr, string key) { StringBuilder sbNew = new StringBuilder(); if (ValidateHelper.Instance.NotEmpty(key) && key.Length == 8) { DESCryptoServiceProvider DSP = new DESCryptoServiceProvider(); DSP.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8)); DSP.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8)); byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(enStr); MemoryStream MS = new MemoryStream(); CryptoStream CS = new CryptoStream(MS, DSP.CreateEncryptor(), CryptoStreamMode.Write); CS.Write(bytes, 0, bytes.Length); CS.FlushFinalBlock(); foreach (byte num in MS.ToArray()) { sbNew.AppendFormat("{0:X2}", num); } MS.Close(); } return sbNew.ToString(); } /// <summary> /// 解密 /// <para/>Author : AnDequan /// <para/>Date : 2010-8-12 /// </summary> /// <param name="deStr">要解密的字符串</param> /// <param name="key">密钥(长度只能为8)</param> /// <returns>加密后字符串</returns> public string DeCode(string deStr, string key) { DESCryptoServiceProvider DSP = new DESCryptoServiceProvider(); DSP.Key = Encoding.ASCII.GetBytes(key.Substring(0, 8)); DSP.IV = Encoding.ASCII.GetBytes(key.Substring(0, 8)); byte[] buffer = new byte[deStr.Length / 2]; for (int i = 0; i < deStr.Length / 2; i++) { int num2 = Convert.ToInt32(deStr.Substring(i * 2, 2), 0x10); buffer[i] = (byte)num2; } MemoryStream Ms = new MemoryStream(); CryptoStream CS = new CryptoStream(Ms, DSP.CreateDecryptor(), CryptoStreamMode.Write); CS.Write(buffer, 0, buffer.Length); CS.FlushFinalBlock(); Ms.Close(); return Encoding.GetEncoding("GB2312").GetString(Ms.ToArray()); } /// <summary> /// 技术点分析:加密的手段是对ASCII码进行操作,如加密时取各个字符的ASCII码 /// 并加上一个整数。解密时,取各个字符的ASCII码减去这个整数 /// <para/>Author : AnDequan /// <para/>Date : 2011-1-5 /// </summary> /// <param name="vale">要加密字符串</param> /// <returns>加密后字符串</returns> public string Encrypt(string vale) { Encoding ascii = Encoding.ASCII;//获取ASCII编码 string encryptString = string.Empty; for (int i = 0; null != vale && i < vale.Length; i++) { int j; byte[] b = new byte[1]; j = Convert.ToInt16(ascii.GetBytes(vale[i].ToString())[0]); j = j + 1; b[0] = Convert.ToByte(j); encryptString = encryptString + ascii.GetString(b); } return encryptString; } /// <summary> /// 解密 /// <para/>Author : AnDequan /// <para/>Date : 2011-1-5 /// </summary> /// <param name="value">要解密字符串</param> /// <returns>解密后字符串</returns> public string Decryptor(string value) { Encoding ascii = Encoding.ASCII; string decryptorString = string.Empty; for (int i = 0; i < value.Length; i++) { int j; byte[] b = new byte[1]; j = Convert.ToInt32(ascii.GetBytes(value[i].ToString())[0]); j = j - 1;//ASCII码减密 b[0] = Convert.ToByte(j); decryptorString = decryptorString + ascii.GetString(b); } return decryptorString; } } }