接上一篇:Licensing实例(一)
/**/
/// <summary> /// 加密许可证提供者 /// </summary>
public
class
EncryptedLicenseProvider : LicenseProvider
...
{ private static byte[] _designSignature; private static byte[] _desIV = new byte[] ...{ 173, 63, 198, 17, 71, 144, 221, 161 }; private static byte[] _desKey = new byte[] ...{ 146, 21, 56, 161, 18, 237, 179, 194 }; private static string _rsaParameters; private static byte[] _runtimeSignature; private static EncryptedLicense _systemLicense; private const string _systemParameters = ""; private const int keyLength = 7; public EncryptedLicenseProvider() ...{ } /**//// <summary> /// 数组匹配 /// </summary> /// <param name="a1"></param> /// <param name="a2"></param> /// <returns></returns> private static bool ArrayEqual(byte[] a1, byte[] a2) ...{ if (a1 != a2) ...{ if ((a1 == null) || (a2 == null)) ...{ return false; } if (a1.Length != a2.Length) ...{ return false; } for (int num1 = 0; num1 < a1.Length; num1++) ...{ if (a1[num1] != a2[num1]) ...{ return false; } } } return true; } /**//// <summary> /// 序列尺寸 /// </summary> /// <param name="length"></param> /// <returns></returns> private static int ArraySize(int length) ...{ return length; } /**//// <summary> /// 提取许可证信息 /// </summary> /// <param name="licenseKey">许可证键值</param> /// <param name="password">密码</param> /// <returns></returns> internal EncryptedLicense ExtractLicense(string licenseKey, string password) ...{ try ...{ //从哈希转到byte byte[] buffer1 = EncryptedLicenseProvider.FromHex(licenseKey); byte[] buffer2 = new byte[] ...{ 62, 126, 142, 55, 68, 165, 193, 63 }; //获取公钥标识 byte[] buffer3 = Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken(); if (!EncryptedLicenseProvider.ArrayEqual(buffer3, buffer2)) ...{ EncryptedLicenseProvider._desKey.CopyTo(buffer2, 0); } DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider(); provider1.Key = EncryptedLicenseProvider._desKey; provider1.IV = EncryptedLicenseProvider._desIV; byte[] buffer4 = provider1.CreateDecryptor().TransformFinalBlock(buffer1, 0, buffer1.Length); byte[] buffer5 = new byte[EncryptedLicenseProvider.ArraySize(8)]; byte[] buffer6 = new byte[EncryptedLicenseProvider.ArraySize(buffer4.Length - 7)]; Array.Copy(buffer4, 0, buffer5, 0, 7); Array.Copy(buffer4, 7, buffer6, 0, buffer6.Length); byte[] buffer7 = EncryptedLicenseProvider.GetEncryptionKey(password); if (!EncryptedLicenseProvider.ArrayEqual(buffer5, buffer7)) ...{ return null; } provider1.IV = buffer5; byte[] buffer8 = provider1.CreateDecryptor().TransformFinalBlock(buffer6, 0, buffer6.Length); byte[] buffer9 = new byte[EncryptedLicenseProvider.ArraySize(buffer8.Length - 2)]; Array.Copy(buffer8, 2, buffer9, 0, buffer9.Length); ushort num1 = BitConverter.ToUInt16(buffer8, 0); string text1 = Encoding.UTF8.GetString(buffer9); return new EncryptedLicense(licenseKey, num1, text1); } catch ...{ return null; } } /**//// <summary> /// 从哈希转到byte /// </summary> /// <param name="hex"></param> /// <returns></returns> private static byte[] FromHex(string hex) ...{ string text1 = EncryptedLicenseProvider.Strip(hex, " -"); if ((text1 == null) || ((text1.Length % 2) != 0)) ...{ throw new FormatException("Invalid hexadecimal string"); } byte[] buffer1 = new byte[EncryptedLicenseProvider.ArraySize(text1.Length / 2)]; int num1 = 0; for (int num2 = 0; num1 < text1.Length; num2++) ...{ string text2 = text1.Substring(num1, 2); buffer1[num2] = byte.Parse(text2, NumberStyles.HexNumber); num1 += 2; } return buffer1; } /**//// <summary> /// 生成键值 /// </summary> /// <param name="password">密码</param> /// <param name="productInfo">产品信息</param> /// <param name="serialNo">序列号</param> /// <returns></returns> public virtual string GenerateKey(string password, string productInfo, ushort serialNo) ...{ byte[] buffer1 = new byte[] ...{ 0x3e, 0x7e, 0x8e, 0x37, 0x44, 0xa5, 0xc1, 0x3f }; byte[] buffer2 = EncryptedLicenseProvider.GetEncryptionKey(password); byte[] buffer3 = Encoding.UTF8.GetBytes(productInfo); byte[] buffer4 = BitConverter.GetBytes(serialNo); byte[] buffer5 = new byte[EncryptedLicenseProvider.ArraySize(buffer3.Length + buffer4.Length)]; byte[] buffer6 = Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken(); buffer4.CopyTo(buffer5, 0); buffer3.CopyTo(buffer5, 2); if (EncryptedLicenseProvider.SystemLicense == null) ...{ if (password != "TEST") ...{ throw new LicenseException(typeof(EncryptedLicenseProvider), this, "The only allowable password in evaluation mode is 'TEST'"); } if ((serialNo < 0) || (serialNo > 1)) ...{ throw new LicenseException(typeof(EncryptedLicenseProvider), this, "The only allowable serial numbers in evaluation mode are '0' or '1'"); } } if (!EncryptedLicenseProvider.ArrayEqual(buffer6, buffer1)) ...{ EncryptedLicenseProvider._desKey.CopyTo(buffer2, 0); } DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider(); provider1.Key = EncryptedLicenseProvider._desKey; provider1.IV = buffer2; byte[] buffer7 = provider1.CreateEncryptor().TransformFinalBlock(buffer5, 0, buffer5.Length); byte[] buffer8 = new byte[EncryptedLicenseProvider.ArraySize(7 + buffer7.Length)]; buffer2.CopyTo(buffer8, 0); buffer7.CopyTo(buffer8, 7); provider1.IV = EncryptedLicenseProvider._desIV; byte[] buffer9 = provider1.CreateEncryptor().TransformFinalBlock(buffer8, 0, buffer8.Length); return EncryptedLicenseProvider.ToHex(buffer9); } /**//// <summary> /// 生成许可证参数 /// </summary> /// <param name="password">密码</param> /// <returns></returns> public string GenerateLicenseParameters(string password) ...{ CspParameters parameters1 = new CspParameters(); if (!Environment.UserInteractive) ...{ parameters1.Flags = CspProviderFlags.UseMachineKeyStore; } RSACryptoServiceProvider provider1 = new RSACryptoServiceProvider(0x400, parameters1); string text1 = provider1.ToXmlString(false); byte[] buffer1 = EncryptedLicenseProvider.GetEncryptionKey(password); byte[] buffer2 = provider1.SignData(buffer1, new SHA1CryptoServiceProvider()); DESCryptoServiceProvider provider2 = new DESCryptoServiceProvider(); provider2.Key = EncryptedLicenseProvider._desKey; provider2.IV = buffer1; byte[] buffer3 = provider2.CreateEncryptor().TransformFinalBlock(buffer1, 0, buffer1.Length); byte[] buffer4 = new byte[EncryptedLicenseProvider.ArraySize(8)]; Array.Copy(buffer3, 0, buffer4, 0, 7); byte[] buffer5 = provider1.SignData(buffer4, new SHA1CryptoServiceProvider()); MemoryStream stream1 = new MemoryStream(); XmlTextWriter writer1 = new XmlTextWriter(stream1, Encoding.ASCII); writer1.WriteStartElement("LicenseParameters"); writer1.WriteRaw(text1); writer1.WriteElementString("DesignSignature", Convert.ToBase64String(buffer2)); writer1.WriteElementString("RuntimeSignature", Convert.ToBase64String(buffer5)); writer1.WriteEndElement(); writer1.Close(); string text2 = Encoding.ASCII.GetString(stream1.ToArray()); stream1.Close(); return text2; } /**//// <summary> /// 获取加密键值 /// </summary> /// <param name="password">密码</param> /// <returns></returns> private static byte[] GetEncryptionKey(string password) ...{ byte[] buffer1 = new byte[] ...{ 0xf2, 0xa1, 3, 0x9d, 0x63, 0x87, 0x35, 0x5e }; byte[] buffer2 = new byte[] ...{ 0xab, 0xb8, 0x94, 0x7e, 0x1d, 0xe5, 0xd1, 0x33 }; DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider(); provider1.Key = buffer1; provider1.IV = buffer2; if (password.Length < 8) ...{ password = password.PadRight(8, '*'); } byte[] buffer3 = Encoding.ASCII.GetBytes(password); byte[] buffer4 = provider1.CreateEncryptor().TransformFinalBlock(buffer3, 0, buffer3.Length); byte[] buffer5 = new byte[EncryptedLicenseProvider.ArraySize(8)]; Array.Copy(buffer4, 0, buffer5, 0, 7); return buffer5; } /**//// <summary> /// 获取许可证 /// </summary> /// <param name="licenseFile">许可证文件</param> /// <returns></returns> public virtual EncryptedLicense GetLicense(string licenseFile) ...{ string text1 = this.GetLicenseDirectory(LicenseManager.CurrentContext, null); string text2 = Path.Combine(text1, licenseFile); string text3 = this.ReadKeyFromFile(text2); EncryptedLicense license1 = null; if (text3 != null) ...{ license1 = this.LoadLicense(LicenseManager.CurrentContext, null, text3); } return license1; } /**//// <summary> /// 获取许可证 /// </summary> /// <param name="licenseParameters">许可证参数</param> /// <param name="licenseFile">许可证文件</param> /// <returns></returns> public virtual EncryptedLicense GetLicense(string licenseParameters, string licenseFile) ...{ EncryptedLicenseProvider.SetParameters(licenseParameters); return this.GetLicense(licenseFile); } /**//// <summary> /// 获取许可证 /// </summary> /// <param name="context">指定何时可使用授权的对象,并且提供一种方法,用以获取为支持在其域内运行的许可证所需要的附加服务。</param> /// <param name="assembly"></param> /// <param name="type">类型</param> /// <returns></returns> public virtual EncryptedLicense GetLicense(LicenseContext context, Assembly assembly, Type type) ...{ if (assembly == null) ...{ return null; } EncryptedLicense license1 = null; string text1 = this.GetSavedLicenseKey(assembly, type); if (text1 != null) ...{ license1 = this.LoadLicense(context, null, text1); } return license1; } /**//// <summary> /// 获取许可证 /// </summary> /// <param name="context"></param> /// <param name="type"></param> /// <param name="instance">实例</param> /// <param name="allowExceptions"></param> /// <returns></returns> public override License GetLicense(LicenseContext context, Type type, object instance, bool allowExceptions) ...{ string text1 = this.GetLicenseKey(context, type); License license1 = this.LoadLicense(context, type, text1); if ((license1 == null) && allowExceptions) ...{ if (instance == null) ...{ throw new LicenseException(type); } throw new LicenseException(type, instance); } return license1; } /**//// <summary> /// 获取许可证目录 /// </summary> /// <param name="context"></param> /// <param name="type"></param> /// <returns></returns> protected virtual string GetLicenseDirectory(LicenseContext context, Type type) ...{ string text1 = null; if ((context != null) && (type != null)) ...{ ITypeResolutionService service1 = (ITypeResolutionService)context.GetService(typeof(ITypeResolutionService)); if (service1 != null) ...{ text1 = service1.GetPathOfAssembly(type.Assembly.GetName()); } } if (text1 == null) ...{ if (type == null) ...{ text1 = AppDomain.CurrentDomain.BaseDirectory; } else ...{ text1 = type.Assembly.CodeBase; if (text1.StartsWith("file:///")) ...{ text1 = text1.Replace("file:///", ""); } else ...{ text1 = type.Module.FullyQualifiedName; } } } return Path.GetDirectoryName(text1); } /**//// <summary> /// 获取许可证目录 /// </summary> /// <param name="context"></param> /// <param name="type"></param> /// <returns></returns> protected virtual string GetLicenseFilePath(LicenseContext context, Type type) ...{ string text1 = this.GetLicenseDirectory(context, type); return string.Format(@"{0}{1}.lic", text1, type.FullName); } /**//// <summary> /// 获取许可证键值 /// </summary> /// <param name="context"></param> /// <param name="type"></param> /// <returns></returns> protected virtual string GetLicenseKey(LicenseContext context, Type type) ...{ string text1 = null; if (context.UsageMode == LicenseUsageMode.Runtime) ...{ text1 = context.GetSavedLicenseKey(type, null); } if (text1 == null) ...{ text1 = this.ReadKeyFromFile(this.GetLicenseFilePath(context, type)); } return text1; } /**//// <summary> /// 获取已经保存的许可证键值 /// </summary> /// <param name="assembly"></param> /// <param name="type"></param> /// <returns></returns> private string GetSavedLicenseKey(Assembly assembly, Type type) ...{ string text1 = null; string text2 = assembly.GetName().Name + ".dll.licenses"; Stream stream1 = assembly.GetManifestResourceStream(text2); if (stream1 != null) ...{ IFormatter formatter1 = new BinaryFormatter(); object[] objArray1 = formatter1.Deserialize(stream1) as object[]; if (objArray1 != null) ...{ Hashtable hashtable1 = objArray1[1] as Hashtable; if (hashtable1 != null) ...{ foreach (DictionaryEntry entry1 in hashtable1) ...{ string text3 = entry1.Key as string; if (text3 != null) ...{ text3 = text3.Trim(); if (text3.IndexOf(type.FullName) == 0) ...{ text1 = entry1.Value as string; break; } } } } } stream1.Close(); } return text1; } /**//// <summary> /// 安装许可证文件 /// </summary> /// <param name="licenseFile"></param> /// <param name="licenseKey"></param> /// <returns></returns> public virtual EncryptedLicense InstallLicense(string licenseFile, string licenseKey) ...{ EncryptedLicense license1 = this.LoadLicense(LicenseManager.CurrentContext, null, licenseKey); if (license1 != null) ...{ string text1 = this.GetLicenseDirectory(LicenseManager.CurrentContext, null); string text2 = Path.Combine(text1, licenseFile); this.WriteKeyToFile(text2, licenseKey); } return license1; } /**//// <summary> /// 安装许可证文件 /// </summary> /// <param name="type"></param> /// <param name="licenseKey"></param> /// <returns></returns> public virtual EncryptedLicense InstallLicense(Type type, string licenseKey) ...{ EncryptedLicense license1 = this.LoadLicense(LicenseManager.CurrentContext, type, licenseKey); if (license1 != null) ...{ string text1 = this.GetLicenseFilePath(LicenseManager.CurrentContext, type); this.WriteKeyToFile(text1, licenseKey); } return license1; } /**//// <summary> /// 安装许可证文件 /// </summary> /// <param name="licenseParameters"></param> /// <param name="licenseFile"></param> /// <param name="licenseKey"></param> /// <returns></returns> public virtual EncryptedLicense InstallLicense(string licenseParameters, string licenseFile, string licenseKey) ...{ EncryptedLicenseProvider.SetParameters(licenseParameters); return this.InstallLicense(licenseFile, licenseKey); } /**//// <summary> /// 载入许可证文件 /// </summary> /// <param name="context"></param> /// <param name="type"></param> /// <param name="licenseKey"></param> /// <returns></returns> private EncryptedLicense LoadLicense(LicenseContext context, Type type, string licenseKey) ...{ if (((EncryptedLicenseProvider._rsaParameters == null) || (EncryptedLicenseProvider._designSignature == null)) || (EncryptedLicenseProvider._runtimeSignature == null)) ...{ throw new InvalidOperationException(); } if (licenseKey == null) ...{ return null; } try ...{ byte[] buffer1 = EncryptedLicenseProvider.FromHex(licenseKey); DESCryptoServiceProvider provider1 = new DESCryptoServiceProvider(); provider1.Key = EncryptedLicenseProvider._desKey; provider1.IV = EncryptedLicenseProvider._desIV; byte[] buffer2 = provider1.CreateDecryptor().TransformFinalBlock(buffer1, 0, buffer1.Length); byte[] buffer3 = new byte[EncryptedLicenseProvider.ArraySize(8)]; byte[] buffer4 = new byte[EncryptedLicenseProvider.ArraySize(buffer2.Length - 7)]; Array.Copy(buffer2, 0, buffer3, 0, 7); Array.Copy(buffer2, 7, buffer4, 0, buffer4.Length); CspParameters parameters1 = new CspParameters(); if (!Environment.UserInteractive) ...{ parameters1.Flags = CspProviderFlags.UseMachineKeyStore; } RSACryptoServiceProvider provider2 = new RSACryptoServiceProvider(parameters1); provider2.FromXmlString(EncryptedLicenseProvider._rsaParameters); if (context.UsageMode == LicenseUsageMode.Designtime) ...{ if (!provider2.VerifyData(buffer3, new SHA1CryptoServiceProvider(), EncryptedLicenseProvider._designSignature)) ...{ return null; } } else if (!provider2.VerifyData(buffer3, new SHA1CryptoServiceProvider(), EncryptedLicenseProvider._runtimeSignature) && !provider2.VerifyData(buffer3, new SHA1CryptoServiceProvider(), EncryptedLicenseProvider._designSignature)) ...{ return null; } provider1.IV = buffer3; byte[] buffer5 = provider1.CreateDecryptor().TransformFinalBlock(buffer4, 0, buffer4.Length); byte[] buffer6 = new byte[EncryptedLicenseProvider.ArraySize(buffer5.Length - 2)]; Array.Copy(buffer5, 2, buffer6, 0, buffer6.Length); ushort num1 = BitConverter.ToUInt16(buffer5, 0); string text1 = Encoding.UTF8.GetString(buffer6); if ((context.UsageMode == LicenseUsageMode.Designtime) && (type != null)) ...{ byte[] buffer7 = provider1.CreateEncryptor().TransformFinalBlock(buffer3, 0, buffer3.Length); byte[] buffer8 = new byte[EncryptedLicenseProvider.ArraySize(8)]; Array.Copy(buffer7, 0, buffer8, 0, 7); provider1.IV = buffer8; buffer4 = provider1.CreateEncryptor().TransformFinalBlock(buffer5, 0, buffer5.Length); buffer2 = new byte[EncryptedLicenseProvider.ArraySize(7 + buffer4.Length)]; buffer8.CopyTo(buffer2, 0); buffer4.CopyTo(buffer2, 7); provider1.IV = EncryptedLicenseProvider._desIV; buffer1 = provider1.CreateEncryptor().TransformFinalBlock(buffer2, 0, buffer2.Length); string text2 = EncryptedLicenseProvider.ToHex(buffer1); context.SetSavedLicenseKey(type, text2); } return new EncryptedLicense(licenseKey, num1, text1); } catch ...{ return null; } } /**//// <summary> /// 从许可证文件中读取键值 /// </summary> /// <param name="licenseFile"></param> /// <returns></returns> protected virtual string ReadKeyFromFile(string licenseFile) ...{ string text1 = null; if (File.Exists(licenseFile)) ...{ Stream stream1 = new FileStream(licenseFile, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader reader1 = new StreamReader(stream1); text1 = reader1.ReadToEnd(); reader1.Close(); } return text1; } /**//// <summary> /// 设置许可证参数。 /// </summary> /// <param name="licenseParameters"></param> public static void SetParameters(string licenseParameters) ...{ XmlReader reader1 = new XmlTextReader(licenseParameters, XmlNodeType.Element, null); while (reader1.Read()) ...{ if (reader1.IsStartElement()) ...{ if (reader1.LocalName == "RSAKeyValue") ...{ EncryptedLicenseProvider._rsaParameters = reader1.ReadOuterXml(); } if (reader1.LocalName == "DesignSignature") ...{ string text1 = reader1.ReadElementString(); EncryptedLicenseProvider._designSignature = Convert.FromBase64String(text1); } if (reader1.LocalName == "RuntimeSignature") ...{ string text2 = reader1.ReadElementString(); EncryptedLicenseProvider._runtimeSignature = Convert.FromBase64String(text2); } } } reader1.Close(); } /**//// <summary> /// 在字符串中查找指定的字符 /// </summary> /// <param name="value"></param> /// <param name="characters"></param> /// <returns></returns> private static string Strip(string value, string characters) ...{ if (value == null) ...{ return null; } StringBuilder builder1 = new StringBuilder(); foreach (char ch1 in value) ...{ if (characters.IndexOf(ch1, 0) < 0) ...{ builder1.Append(ch1); } } return builder1.ToString(); } /**//// <summary> /// 转为哈希 /// </summary> /// <param name="data"></param> /// <returns></returns> private static string ToHex(byte[] data) ...{ StringBuilder builder1 = new StringBuilder(); for (int num1 = 0; num1 < data.Length; num1++) ...{ if ((num1 > 0) && ((num1 % 2) == 0)) ...{ builder1.Append("-"); } builder1.Append(data[num1].ToString("X2")); } return builder1.ToString(); } /**//// <summary> /// 校验许可证键值 /// </summary> /// <param name="licenseKey"></param> /// <returns></returns> public virtual EncryptedLicense ValidateLicenseKey(string licenseKey) ...{ return this.LoadLicense(LicenseManager.CurrentContext, null, licenseKey); } /**//// <summary> /// 校验许可证键值 /// </summary> /// <param name="licenseParameters"></param> /// <param name="licenseKey"></param> /// <returns></returns> public virtual EncryptedLicense ValidateLicenseKey(string licenseParameters, string licenseKey) ...{ EncryptedLicenseProvider.SetParameters(licenseParameters); return this.LoadLicense(LicenseManager.CurrentContext, null, licenseKey); } /**//// <summary> /// 写键值到许可证文件。 /// </summary> /// <param name="licenseFile"></param> /// <param name="licenseKey"></param> protected virtual void WriteKeyToFile(string licenseFile, string licenseKey) ...{ Stream stream1 = new FileStream(licenseFile, FileMode.Create, FileAccess.Write, FileShare.None); StreamWriter writer1 = new StreamWriter(stream1); writer1.WriteLine(licenseKey); writer1.Close(); } internal static EncryptedLicense SystemLicense ...{ get ...{ if (EncryptedLicenseProvider._systemLicense == null) ...{ EncryptedLicenseProvider.SetParameters(""); EncryptedLicenseProvider provider1 = new EncryptedLicenseProvider(); EncryptedLicenseProvider._systemLicense = provider1.GetLicense(LicenseManager.CurrentContext, typeof(EncryptedLicenseProvider), null, false) as EncryptedLicense; } return EncryptedLicenseProvider._systemLicense; } } }
转载请注明原文地址: https://ibbs.8miu.com/read-17915.html