Files
Web_CRICS_Server_VS2010_Prod/Common/MyDes.cs

284 lines
9.5 KiB
C#
Raw Normal View History

2025-12-11 09:17:16 +08:00
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
/// <summary>
/// 解密文件
/// </summary>
/// <param name="inFileName"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool DecodeFromFile(string inFileName, ref string result)
{
return Decode(File.ReadAllText(inFileName), ref result);
}
/// <summary>
/// 解密文件
/// </summary>
/// <param name="inFileName"></param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <param name="result"></param>
/// <returns></returns>
public static bool DecodeFromStream(Stream stream, ref string result)
{
using (StreamReader reader = new StreamReader(stream))
{
return Decode(reader.ReadToEnd(), ref result);
}
}
/// <summary>
/// 解密文件
/// </summary>
/// <param name="base64License"></param>
/// <param name="result"></param>
/// <returns></returns>
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
/// <summary>
/// 每次登录验证验证成功时修改License文件的最后写入时间
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 导入授权文件验证
/// </summary>
/// <param name="licenseStream"></param>
/// <param name="result"></param>
/// <returns></returns>
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);
}
/// <summary>
/// 验证 License文件
/// </summary>
/// <param name="strLicense"></param>
/// <param name="result"></param>
/// <returns></returns>
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("<?"))
{
strLicense = strLicense.Substring(strLicense.IndexOf('>') + 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; }
}
}