rd5+EjU6QxaTY/AalU9g6ugAquN0ahJSgeahnf2CrfvUAWFNJ+SH7Qr0RcvOTyAbWfvLWoBDACKaPsg+8nRQcO3EZdFyjJ9oycLNrw38+gSB2+/79Axys/8MHtSXVUw9WN2e9LxeHOQGtcaoSsp+bPGaXswthovQ2CkvBTmCokcAOX6UaR7Av4npaXyEoGCUsZLEiSydMsNbQ+wLsumVg1H2o/cpkO0s4DiJHoF66zUuxA+pYSjSCn5KTUsOemf+gBsob6Sw+7WOToyiOkMdO9Op6esf8yL7DJ1Yd40XaKd5IeLQmEX/b+n1EV2JEkGO0p9q9MQRp6NrEc9LvfMJWQ==AQAByR+R5ofKJenqgMvXxT/Tqxka4jeuPz+Uta9WXYVyzIeyjESOEe1B9uM+DkhM27zw8XsG143KpzUp8jy5Gh6z14ivfUbv09GN5ICFWeqEOQJ8JSPfqcq5YKpFNY+zJGNgUfKdLwMUvu55O6Y2BdB2yLFwAUztUAW0qT+ZmINI3xM=
3U84e83rhoi5o4kR9I4JllM1ys/43uvJSVDwkqAo+p7R1uFUsl1STNHVo/d0mJKXLOf8J4fI0yVz1H73XBHjEzJqJPWlycOArA+c8eKtLvvIlauSh1ulAJbSKlINxjr6aVjXH9ztGKRVIRU2EuUPKQKwnxScKrqNbeGqRKHPx2M=
ktj9I3AkFfisIywyuC+5MeUbru5uyHl48As8qP4l6tZtdGMdxFMSZdxX0//QNmTHG9nzDfHWdK2pmdfiYwLl1spTL8pak7Mewidgtl03+5Qn5spBpWyCW+UWsVvhtgDlNBBL2iaKwDnIxNe//BDQmgqMODbd0x7HYQgx8pxw2Yc=dblkhIcfmKs2hQWvJXZBJ1QQM1i6PGsU4glKT9Uet2KwoSuwUElQNEkS6mwB+/9Op7an7adPbvJnUUxQ7QsezeFtkUeS72cuFVkg1ZMNKQcKxoNEKPjZJx0ToyuO5DoPZua5WNu+y/LuzfBomVh73gbuSVE/WYNvJFp8ppGk450=gSHzvMS0Fu4j/yuzjOjLXYxR8qP3AweEbLlM8/SBjpT5qq+R+j/m3q7vTvYZwwMqAMamGWmTHAlQvOjnSeV2Qnb2C/bqs5jTTiDGyY/xqGV8pFlkegieBl+zJYrOyisUP/xNk4ckKhGfGUIan91N8R5M9Dk2x0hOTCY7m4Tv2SI=polHLj+Hh7z2/jF79OnsRfRkt0pYNkVIfB4hTYgGBIoCfjPpyD0wKM9mO/hDqyxwplb0Z8IU6us53MrG6EqaxiAoDvJ4CtOhdie+BV+boQpyK+0I4rCNqXSw8lLkhRIabKUSXQ6UAo4zEyeuCL0+LTGZkBV3wbjoGDQSUqnMQ4uzvuGsWUU76Y/nnpYf6VVajCsLAseQbdAbeLuL0WPmNqO+E3SLsL72z5lgqkk5yyEQYDTWZMEuFUsyGmP+XC4EBp44IW3eQmPPBfUqxRvCAq2Gvk95Q+9H9FZlTW4ctMSezOZaH9pAaJvG5QL2ggw+KXh+pljnM8bYtL2I+KWtNQ==";
public ControlTestWindow()
{
InitializeComponent();
}
private void LicenseClick(object sender, RoutedEventArgs e)
{
PrivateKey = PrivateKeyTextBox.Text;
LicenseManager.PublicKey = PublicKeyTextBox.Text;
DateTime issueDate = DateTime.Now;
//DateTime expiryDate = issueDate.AddYears(1);
DateTime expiryDate = ExpiryDatePicker.DisplayDate;
if (expiryDate < issueDate)
{
MessageBox.Show("授权到期时间有误,应比发码日期晚");
return;
}
string mCode = MachineCodeTextBox.Text.Trim().ToUpper();
if (string.IsNullOrEmpty(mCode))
{
MessageBox.Show("请先获取机器码");
return;
}
string key = CreateLicense(mCode, issueDate, expiryDate);
LicenseTextBox.Text = key;
Clipboard.SetText(key);
MessageBox.Show("激活码已复制!");
}
private string CreateLicense(string machineCode, DateTime issue, DateTime expiry)
{
string issueStr = issue.ToString("yyyyMMdd");
string expiryStr = expiry.ToString("yyyyMMdd");
// 签名原始数据:机器码 + 发码日期 + 过期日期
string dataToSign = $"{machineCode}|{issueStr}|{expiryStr}";
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(PrivateKey);
var formatter = new RSAPKCS1SignatureFormatter(rsa);
formatter.SetHashAlgorithm("SHA256");
byte[] dataBytes = Encoding.UTF8.GetBytes(dataToSign);
using (var sha = SHA256.Create())
{
byte[] hash = sha.ComputeHash(dataBytes);
string signature = Convert.ToBase64String(formatter.CreateSignature(hash));
// 最终格式:签名|机器码|发码日期|过期日期
return $"{signature}|{machineCode}|{issueStr}|{expiryStr}";
}
}
}
private void GenerateKeyClick(object sender, RoutedEventArgs e)
{
using var rsa = new RSACryptoServiceProvider(2048);
PublicKeyTextBox.Text = rsa.ToXmlString(false); // 放在插件里
PrivateKeyTextBox.Text = rsa.ToXmlString(true); // 自己妥善保存
}
private void ValidateClick(object sender, RoutedEventArgs e)
{
var result = LicenseManager.Validate();
MessageBox.Show(result.msg);
}
private void RemoveLicenseClick(object sender, RoutedEventArgs e)
{
LicenseManager.RemoveLicense();
MessageBox.Show("授权已注销");
}
private void ActivateClick(object sender, RoutedEventArgs e)
{
LicenseManager.Activate(LicenseTextBox.Text);
}
private void MachineCodeClick(object sender, RoutedEventArgs e)
{
MachineCodeTextBox.Text = HardwareInfo.GetMachineCode();
}
private void SaveKeysClick(object sender, RoutedEventArgs e)
{
VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog();
if (dialog.ShowDialog())
{
string publicKeyPath = System.IO.Path.Combine(dialog.SelectedPath, "PublicKey.txt");
File.WriteAllText(publicKeyPath, PublicKeyTextBox.Text);
string privateKeyPath = System.IO.Path.Combine(dialog.SelectedPath, "PrivateKey.txt");
File.WriteAllText(privateKeyPath, PrivateKeyTextBox.Text);
MessageBox.Show($"公私密钥已保存到:{dialog.SelectedPath}");
}
}
private void SaveLicenseClick(object sender, RoutedEventArgs e)
{
VistaFolderBrowserDialog dialog = new VistaFolderBrowserDialog();
if (dialog.ShowDialog())
{
string path = System.IO.Path.Combine(dialog.SelectedPath, "license.txt");
File.WriteAllText(path, LicenseTextBox.Text);
MessageBox.Show($"激活码已保存到:{path}");
}
}
}
public static class HardwareInfo
{
public static string GetMachineCode()
{
try
{
string cpu = GetWmiInfo("Win32_Processor", "ProcessorId");
string board = GetWmiInfo("Win32_BaseBoard", "SerialNumber");
string disk = GetWmiInfo("Win32_PhysicalMedia", "SerialNumber"); // 物理硬盘序列号
// 拼接并哈希,只取前16位,方便复制
string raw = $"{cpu}@{board}@{disk}";
using (var sha = SHA256.Create())
{
byte[] bytes = sha.ComputeHash(Encoding.UTF8.GetBytes(raw));
return BitConverter.ToString(bytes).Replace("-", "").Substring(0, 16).ToUpper();
}
}
catch
{
return "ERROR-HARDWARE-ID";
}
}
private static string GetWmiInfo(string table, string prop)
{
try
{
using (var mc = new ManagementClass(table))
foreach (var mo in mc.GetInstances())
{
string val = mo[prop]?.ToString();
if (!string.IsNullOrWhiteSpace(val)) return val.Trim();
}
}
catch { }
return "UNKNOWN";
}
}
public class LicenseManager
{
// 【重要】替换为你生成的公钥
public static string PublicKey = @"