using Microsoft.Win32; using System; using System.IO; using System.Management; using System.Security.Cryptography; using System.Text; namespace SWRIS.Core { /// /// 软件授权类 /// public class SoftAuth { /// /// 获取本计算机唯一的机器码(长度取前12个字符) /// /// 字符串形式的机器码 public static string GetMachineCode() { string unique = ""; //bios名称 unique += HWID.BIOS + "|"; //cpu信息 unique += HWID.CPU + "|"; //主板信息 unique += HWID.BaseBoard + "|"; //获取SMBIOS的Id ManagementClass cimobject3 = new ManagementClass("Win32_ComputerSystemProduct"); ManagementObjectCollection moc3 = cimobject3.GetInstances(); foreach (ManagementObject mo in moc3) { unique += (string)mo.Properties["UUID"].Value; break; } SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider(); var md5 = ByteToHexString(SHA1.ComputeHash(Encoding.Unicode.GetBytes(unique)), (char)0, 0); return md5.Substring(0, 12); } /// /// 获取本机激活码 /// /// public static string GetFinalCode() { return MD5Encrypt(GetMachineCode()).Substring(0, 16); } /// /// 判断是否已激活 /// /// public static bool IsAuthorizeSuccess() { if (GetFinalCode() == ReadRegistry()) { return true; } else { return false; } } /// /// 验证激活码是否正确 /// /// 用户输入的注册码 /// public static bool CheckFinalCode(string finalCode) { if (GetFinalCode() == finalCode.Trim().ToUpper()) { return true; } else { return false; } } /// /// 字节数据转化成16进制表示的字符串 /// /// 字节数组 /// 分割符 /// 每隔指定数量的时候进行换行 /// 返回的字符串 /// /// private static string ByteToHexString(byte[] InBytes, char segment, int newLineCount) { if (InBytes == null) return string.Empty; StringBuilder sb = new StringBuilder(); long tick = 0; foreach (byte InByte in InBytes) { if (segment == 0) sb.Append(string.Format("{0:X2}", InByte)); else sb.Append(string.Format("{0:X2}{1}", InByte, segment)); tick++; if (newLineCount > 0 && tick >= newLineCount) { sb.Append(Environment.NewLine); tick = 0; } } if (segment != 0 && sb.Length > 1 && sb[sb.Length - 1] == segment) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } /// /// 加密数据,采用DES对称加密的方式 /// /// 待加密的数据 /// 密钥,长度为8,英文或数字 /// 加密后的数据 public static string MD5Encrypt(string pToEncrypt, string password = "!234Qwer") { DESCryptoServiceProvider des = new DESCryptoServiceProvider(); byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt); des.Key = Encoding.ASCII.GetBytes(password); des.IV = Encoding.ASCII.GetBytes(password); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); StringBuilder ret = new StringBuilder(); foreach (byte b in ms.ToArray()) { ret.AppendFormat("{0:X2}", b); } ret.ToString(); return ret.ToString(); } /// /// 激活码写入注册表 /// /// /// public static bool WriteRegistry(string code) { try { RegistryKey regkeySetKey = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\HenDai\SoftAuthorize\Common", true); regkeySetKey.SetValue("Code", code); regkeySetKey.SetValue("Time", DateTime.Now.ToString()); return true; } catch { return false; } } /// /// 读取注册表内激活码 /// /// public static string ReadRegistry() { try { RegistryKey regkey = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\HenDai\SoftAuthorize\Common"); return regkey?.GetValue("Code", string.Empty).ToString(); } catch { return string.Empty; } } private class HWID { public static string BIOS { get { return GetWMIIdent("Win32_BIOS", "Manufacturer", "SerialNumber", "SMBIOSBIOSVersion"); } } public static string CPU { get { return GetWMIIdent("Win32_Processor", "ProcessorId"); } } public static string HDD { get { return GetWMIIdent("Win32_DiskDrive", "Model"); } } public static string BaseBoard { get { return GetWMIIdent("Win32_BaseBoard", "SerialNumber"); } } } private static string GetWMIIdent(string Class, string Property) { var ident = ""; var objCol = new ManagementClass(Class).GetInstances(); foreach (var obj in objCol) { if ((ident = obj.GetPropertyValue(Property) as string) != "") break; } return ident; } private static string GetWMIIdent(string Class, params string[] Propertys) { var ident = ""; Array.ForEach(Propertys, prop => ident += GetWMIIdent(Class, prop) + " "); return ident; } } }