using System; using System.Globalization; using System.Security.Cryptography; using System.Text; using System.Windows; namespace IoTKeyGen { /// /// Interaction logic for MainWindow.xaml /// public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { if(string.IsNullOrEmpty(deviceNumber.Text)) { MessageBox.Show("设备编号不能为空"); return; } if (string.IsNullOrEmpty(this.days.Text)) { MessageBox.Show("过期时间不能为空"); return; } var sn = deviceNumber.Text; if(!int.TryParse(this.days.Text, out int days)||days<0) { MessageBox.Show("过期时间必须是非负整数"); return; } var endTime = days == 0 ? 0 : new DateTimeOffset(DateTime.UtcNow.Date.AddDays(days + 1).AddSeconds(-1)).ToUnixTimeSeconds(); keyCode.Text = DESEncrypt($"{sn}-{endTime}",sn); } public static string DESEncrypt(string value, string key) { using var des = new DESCryptoServiceProvider(); var inputByteArray = Encoding.Default.GetBytes(value); var md5Key = Md5(key).Substring(0, 8); des.Key = ASCIIEncoding.ASCII.GetBytes(md5Key); des.IV = ASCIIEncoding.ASCII.GetBytes(md5Key); using var ms = new System.IO.MemoryStream(); using var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); var ret = new StringBuilder(); foreach (var item in ms.ToArray()) { ret.AppendFormat("{0:X2}", item); } return ret.ToString(); } public static string Md5(string input) { using MD5 md5 = MD5.Create(); byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); return BitConverter.ToString(hash).Replace("-", string.Empty, StringComparison.CurrentCulture).ToLower(CultureInfo.CurrentCulture); } } }