using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Xml; namespace Common { public static class MyDes { public const string AuthorizationCode = "D7CD0C3660F6A658C9668233516A5397"; private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(MyDes)); private static System.Security.Cryptography.DES mydes = new DESCryptoServiceProvider(); private static string m_key = "szblw_license"; private static string m_iv = "szblw_license"; private static object _lock = new object(); private static byte[] GetLegalKey() { string sTemp = m_key; mydes.GenerateKey(); byte[] bytTemp = mydes.Key; int KeyLength = bytTemp.Length; if (sTemp.Length > KeyLength) sTemp = sTemp.Substring(0, KeyLength); else if (sTemp.Length < KeyLength) sTemp = sTemp.PadRight(KeyLength, ' '); return ASCIIEncoding.ASCII.GetBytes(sTemp); } private static byte[] GetLegalIV() { string sTemp = m_iv; mydes.GenerateIV(); byte[] bytTemp = mydes.IV; int IVLength = bytTemp.Length; if (sTemp.Length > IVLength) sTemp = sTemp.Substring(0, IVLength); else if (sTemp.Length < IVLength) sTemp = sTemp.PadRight(IVLength, ' '); return ASCIIEncoding.ASCII.GetBytes(sTemp); } #region 解密 License /// /// 解密文件 /// /// /// /// /// /// public static bool DecodeFromFile(string inFileName, ref string result) { return Decode(File.ReadAllText(inFileName), ref result); } /// /// 解密文件 /// /// /// /// /// /// public static bool DecodeFromStream(Stream stream, ref string result) { using (StreamReader reader = new StreamReader(stream)) { return Decode(reader.ReadToEnd(), ref result); } } /// /// 解密文件 /// /// /// /// public static bool Decode(string base64License, ref string result) { try { mydes.IV = GetLegalIV(); mydes.Key = GetLegalKey(); byte[] btFile = Convert.FromBase64String(base64License); ICryptoTransform encrypto = mydes.CreateDecryptor(); using (MemoryStream mStream = new MemoryStream()) { using (CryptoStream encStream = new CryptoStream(mStream, encrypto, CryptoStreamMode.Write)) { encStream.Write(btFile, 0, btFile.Length); encStream.FlushFinalBlock(); result = Encoding.UTF8.GetString(mStream.ToArray()); } } } catch (Exception ex) { result = "解密文件失败!原因:" + ex.Message; if (logger.IsErrorEnabled) { logger.Error(result, ex); } return false; } return true; } #endregion #region 验证License /// /// 每次登录验证,验证成功时修改License文件的最后写入时间 /// /// /// public static bool Validate(ref string result) { string file = GetLicensePath(); if (!System.IO.File.Exists(file)) { result = "授权文件不存在!"; return false; } string strLicense = ""; if (!DecodeFromFile(file, ref strLicense)) { result = "无效的授权文件!"; return false; } bool ret = Validate(strLicense, ref result); if (ret) { File.SetLastWriteTime(file, DateTime.Now); } return ret; } /// /// 导入授权文件验证 /// /// /// /// public static bool ImportValidate(Stream licenseStream, ref string result) { string strLicense = ""; if (!Common.MyDes.DecodeFromStream(licenseStream, ref strLicense)) { result = "无效的授权文件!"; return false; } return Validate(strLicense, ref result); } /// /// 验证 License文件 /// /// /// /// public static bool Validate(string strLicense, ref string result) { License license = ReadLicense(strLicense); if (license == null) { result = "无效的授权文件!"; return false; } if (license.SystemTypeID != 0) { result = "授权文件不匹配本系统!"; return false; } //判断授权文件上的机器码是否符合当前电脑的机器码,如机器码是12个0,不做校验 if (license.MAC != Tools.GetMachineCode()) { result = "机器码与授权文件不匹配!"; return false; } DateTime now = GetServerDate(); if (now < license.StartDate || now > license.EndDate) { result = "授权到期!"; return false; } result = "验证成功!"; return true; } private static DateTime GetServerDate() { DateTime nowDate = DateTime.Now.Date; string file = GetLicensePath(); if (!File.Exists(file)) { return nowDate; } DateTime fileTime = File.GetLastWriteTime(file); if (fileTime > DateTime.Now) { return fileTime.Date; } return nowDate; } #endregion public static License GetLicense() { string result = ""; if (DecodeFromFile(GetLicensePath(), ref result)) { return ReadLicense(result); } return null; } public static string GetLicensePath() { return Tools.GetApplicationPath() + @"License\blw-t3s.lic"; } public static License ReadLicense(string strLicense) { try { lock (_lock) { if (strLicense.Contains("') + 1);//去掉xml header } XmlDocument doc = new XmlDocument(); doc.LoadXml(strLicense); XmlNode data = doc.DocumentElement.GetElementsByTagName("data")[0]; License license = new License() { ID = data.Attributes["id"].Value, CustomerID = data.Attributes["customerid"].Value, Customer = data.Attributes["customer"].Value, SN = data.Attributes["sn"].Value, Key = data.Attributes["key"].Value, MAC = data.Attributes["mac"].Value, Limit = Convert.ToInt32(data.Attributes["limit"].Value), StartDate = Convert.ToDateTime(data.Attributes["start"].Value), EndDate = Convert.ToDateTime(data.Attributes["end"].Value), SystemTypeID = Convert.ToInt32(data.Attributes["systemtypeid"].Value) }; data = null; doc = null; GC.Collect(); return license; } } catch (Exception ex) { logger.Error(string.Format("读取license失败:{0}", ex.ToString())); return null; } } } public class License { public string ID { get; set; } public string CustomerID { get; set; } public string Customer { get; set; } public string SN { get; set; } public string Key { get; set; } public string MAC { get; set; } public int Limit { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public int SystemTypeID { get; set; } } }