根据USB 序列号 生成USB Key

在软件安装的时候,常常要验证软件的有效性,这时候发行产品的时候会附带一个USB Key,主程序运行的时候检查这个Key的合法性,如果通过验证,那么启动主程序。

下面的代码提供了实现该方法的途径:
  1. /// <summary>
  2.     /// USB 操作相关
  3.     /// </summary>
  4.     public class UsbUtility
  5.     {
  6.         const string Key_File_Name = "Usb.key";
  7.         /// <summary>
  8.         /// 获取优盘唯一序列号,可能需要以管理员身份运行程序
  9.         /// </summary>
  10.         /// <returns></returns>
  11.         public static string GetUSBId()
  12.         {
  13.             ManagementObjectSearcher wmiSearcher = new ManagementObjectSearcher("Select * From Win32_USBHub");
  14.             string id = "";
  15.             foreach (ManagementObject wmi_USB in wmiSearcher.Get())
  16.             {
  17.                 string strPath = wmi_USB.Path.RelativePath;
  18.                 string[] strArr = strPath.Split('/"');
  19.                 string strTemp = strArr[1];
  20.                 //VID_ 是真正的优盘标示
  21.                 if (strTemp.StartsWith("USBVID_"))
  22.                     id += strTemp + ";";
  23.             }
  24.             return id.TrimEnd(';');
  25.         }
  26.         /// <summary>
  27.         /// 获取当前UsbKey,根据当前附加的序列号,生成 "序列号,UsbId"格式的字符串,并返回加密后的结果
  28.         /// 如果没有找到设备,那么返回空字符串
  29.         /// 如果返回值为空,请检查 message 的值。
  30.         /// </summary>
  31.         /// <param name="sourceNumber">要附加的序列号</param>
  32.         /// <param name="message">生成的操作信息</param>
  33.         /// <returns>当前加密后的UsbKey字符串</returns>
  34.         public static string  GetCurrentUsbKey(string sourceNumber,out string message)
  35.         {
  36.             string strUsbId = GetUSBId();
  37.             if (strUsbId != "")
  38.             {
  39.                 if (strUsbId.Split(';').Length == 1)
  40.                 {
  41.                     CheckCode cc = new CheckCode();
  42.                     message = "OK";
  43.                     string strTemp = sourceNumber+","+strUsbId ;
  44.                     return cc.Encode(strTemp);
  45.                 }
  46.                 else
  47.                 {
  48.                     message = "当前有多个U盘,请拨除其它U盘。";
  49.                     return "";
  50.                 }
  51.                 
  52.             }
  53.             message = "未找到U盘或者U盘没有物理序列号。";
  54.             return "";
  55.         }
  56.         /// <summary>
  57.         /// 将一个新的UsbKey写到当前U盘上
  58.         /// </summary>
  59.         /// <param name="sourceNumber">U盘所在盘符</param>
  60.         /// <param name="sourceNumber">要附加的序列号</param>
  61.         /// <param name="message">生成的操作信息</param>
  62.         /// <returns></returns>
  63.         public static bool WriteUsbKeyFile(string driveName, string sourceNumber,out string message)
  64.         {
  65.            string strCurrentUsbKey = GetCurrentUsbKey(sourceNumber, out message);
  66.            if (strCurrentUsbKey != "")
  67.            {
  68.                if (driveName.EndsWith("//"))
  69.                    driveName += "//";
  70.                string strCurrKeyFileName = driveName + Key_File_Name;
  71.                try
  72.                {
  73.                    using (StreamWriter writer = File.CreateText(strCurrKeyFileName))
  74.                    {
  75.                        writer.Write(strCurrentUsbKey);
  76.                        writer.Flush();
  77.                    }
  78.                    message = "OK";
  79.                    return true;
  80.                }
  81.                catch (Exception ex)
  82.                {
  83.                    message = ex.Message;
  84.                }
  85.            }
  86.            return false;
  87.         }
  88.         /// <summary>
  89.         /// 读取UsbKey文件的内容,返回内容格式为 "序列号,UsbId"格式的字符串
  90.         /// 如果未能正确读取文件,返回空字符。
  91.         /// </summary>
  92.         /// <param name="driveName">U盘所在盘符</param>
  93.         /// <param name="message">操作的消息</param>
  94.         /// <returns>UsbKey文件的内容</returns>
  95.         public static string  ReadUsbKeyFile(string driveName, out string message)
  96.         {
  97.             if (driveName.EndsWith("//"))
  98.                 driveName += "//";
  99.             string strCurrKeyFileName = driveName + Key_File_Name;
  100.             message = "";
  101.             try
  102.             {
  103.                 string strResult = "";
  104.                 using (StreamReader reader = File.OpenText(strCurrKeyFileName))
  105.                 {
  106.                     strResult = reader.ReadToEnd();
  107.                 }
  108.                 if (strResult != "")
  109.                 {
  110.                     message = "OK";
  111.                     CheckCode cc = new CheckCode();
  112.                     return cc.Decode(strResult);
  113.                 }
  114.                 else
  115.                 {
  116.                     message = "未能正确读取文件,文件内容可能为空!";
  117.                 }
  118.                
  119.             }
  120.             catch (Exception ex)
  121.             {
  122.                 message = ex.Message;
  123.             }
  124.             return "";
  125.         }
  126.     }
  127.     /// <summary>
  128.     /// 检查编码情况
  129.     /// </summary>
  130.     class CheckCode
  131.     {
  132.         const string KEY_64 = "fasfgew";
  133.         const string IV_64 = "JDLJMAMI"//注意了,是8个字符,64位 
  134.         /// <summary>
  135.         /// 加密
  136.         /// </summary>
  137.         /// <param name="data"></param>
  138.         /// <returns></returns>
  139.         public string Encode(string data)
  140.         {
  141.             byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
  142.             byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
  143.             DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  144.             int i = cryptoProvider.KeySize;
  145.             MemoryStream ms = new MemoryStream();
  146.             CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
  147.             StreamWriter sw = new StreamWriter(cst);
  148.             sw.Write(data);
  149.             sw.Flush();
  150.             cst.FlushFinalBlock();
  151.             sw.Flush();
  152.             return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
  153.         }
  154.         /// <summary>
  155.         /// 解密
  156.         /// </summary>
  157.         /// <param name="data"></param>
  158.         /// <returns></returns>
  159.         public string Decode(string data)
  160.         {
  161.             byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
  162.             byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
  163.             byte[] byEnc;
  164.             try
  165.             {
  166.                 byEnc = Convert.FromBase64String(data);
  167.             }
  168.             catch
  169.             {
  170.                 return null;
  171.             }
  172.             DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  173.             MemoryStream ms = new MemoryStream(byEnc);
  174.             CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
  175.             StreamReader sr = new StreamReader(cst);
  176.             return sr.ReadToEnd();
  177.         }
  178.     }
在主窗体,使用下面的代码调用:
  1. private void btnMakeUsbKey_Click(object sender, EventArgs e)
  2.         {
  3.             string strMessage = "";
  4.             MakeProductNumbers();
  5.             if (UsbUtility.WriteUsbKeyFile(CurrentUSBDriveName, ProductNumbers, out strMessage))
  6.             {
  7.                 MessageBox.Show("Usb Key File 生成成功!");
  8.             }
  9.             else
  10.             {
  11.                 MessageBox.Show(strMessage);
  12.             }
  13.         }
  14.         private void btnShowUsbKey_Click(object sender, EventArgs e)
  15.         {
  16.             string strMessage = "";
  17.             string strText = UsbUtility.ReadUsbKeyFile(CurrentUSBDriveName, out strMessage);
  18.             if (strText!="")
  19.             {
  20.                 MessageBox.Show(strText,"查看USBKEY");
  21.             }
  22.             else
  23.             {
  24.                 MessageBox.Show(strMessage,"Error");
  25.             }
  26.         }
  27.         private string _CurrentUSBDriveName = "";
  28.         /// <summary>
  29.         /// 当前USB 驱动器号
  30.         /// </summary>
  31.         public string CurrentUSBDriveName
  32.         {
  33.             get
  34.             {
  35.                 if (_CurrentUSBDriveName == "")
  36.                 {
  37.                     string[] strDrivers = Environment.GetLogicalDrives();
  38.                     _CurrentUSBDriveName = strDrivers[strDrivers.Length - 1];
  39.                 }
  40.                 return _CurrentUSBDriveName;
  41.             }
  42.             set
  43.             {
  44.                 _CurrentUSBDriveName = value ;
  45.             }
  46.         }
属性 CurrentUSBDriveName 会返回当前最后一个驱动器号,我们认为它是优盘,但是这不是很保险。为此,我们需要监视系统合适插入了U盘,并取得它的盘符。
在主窗体中(一定要在主窗体中,不能再用户控件中),加入下面的代码:
  1. public const int WM_DEVICECHANGE = 0x219;
  2.         public const int DBT_DEVICEARRIVAL = 0x8000;
  3.         public const int DBT_CONFIGCHANGECANCELED = 0x0019;
  4.         public const int DBT_CONFIGCHANGED = 0x0018;
  5.         public const int DBT_CUSTOMEVENT = 0x8006;
  6.         public const int DBT_DEVICEQUERYREMOVE = 0x8001;
  7.         public const int DBT_DEVICEQUERYREMOVEFAILED = 0x8002;
  8.         public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
  9.         public const int DBT_DEVICEREMOVEPENDING = 0x8003;
  10.         public const int DBT_DEVICETYPESPECIFIC = 0x8005;
  11.         public const int DBT_DEVNODES_CHANGED = 0x0007;
  12.         public const int DBT_QUERYCHANGECONFIG = 0x0017;
  13.         public const int DBT_USERDEFINED = 0xFFFF;
  14.         protected override void WndProc(ref Message m)
  15.         {
  16.             try
  17.             {
  18.                 if (m.Msg == WM_DEVICECHANGE)
  19.                 {
  20.                     switch (m.WParam.ToInt32())
  21.                     {
  22.                         case WM_DEVICECHANGE:
  23.                             break;
  24.                         case DBT_DEVICEARRIVAL://U盘插入
  25.                             DriveInfo[] s = DriveInfo.GetDrives();
  26.                             foreach (DriveInfo drive in s)
  27.                             {
  28.                                 if (drive.DriveType == DriveType.Removable)
  29.                                 {
  30.                                     mpnUC.CurrentUSBDriveName  = drive.Name.ToString();
  31.                                     //
  32.                                     MessageBox.Show("U盘已插入,盘符为:" + drive.Name.ToString() + "/r/n");
  33.                                     break;
  34.                                 }
  35.                             }
  36.                             break;
  37.                         case DBT_CONFIGCHANGECANCELED:
  38.                             break;
  39.                         case DBT_CONFIGCHANGED:
  40.                             break;
  41.                         case DBT_CUSTOMEVENT:
  42.                             break;
  43.                         case DBT_DEVICEQUERYREMOVE:
  44.                             break;
  45.                         case DBT_DEVICEQUERYREMOVEFAILED:
  46.                             break;
  47.                         case DBT_DEVICEREMOVECOMPLETE: //U盘卸载
  48.                             MessageBox.Show("U盘已卸载!");
  49.                             break;
  50.                         case DBT_DEVICEREMOVEPENDING:
  51.                             break;
  52.                         case DBT_DEVICETYPESPECIFIC:
  53.                             break;
  54.                         case DBT_DEVNODES_CHANGED:
  55.                             break;
  56.                         case DBT_QUERYCHANGECONFIG:
  57.                             break;
  58.                         case DBT_USERDEFINED:
  59.                             break;
  60.                         default:
  61.                             break;
  62.                     }
  63.                 }
  64.             }
  65.             catch (Exception ex)
  66.             {
  67.                 MessageBox.Show(ex.Message);
  68.             }
  69.             base.WndProc(ref m);
  70.         }

mpnUC 是一个用户控件,我们设置了它的  CurrentUSBDriveName  属性。
OK,允许程序,我们就生成了一个USB Key 了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
USB设备序列号修改工具是一种能够修改USB设备序列号的软件工具。USB设备序列号是由制造商为区分不同设备而赋予的唯一标识符。通过修改USB设备序列号,用户可以改变设备的身份和识别信息。 使用USB设备序列号修改工具可以为不同目的提供便利。首先,该工具可以用于设备调试和测试。在开发过程中,为了模拟不同的设备,调试人员可以使用该工具修改设备序列号以达到测试的目的,确认设备的稳定性和兼容性。其次,这也是一种应对设备复制和盗版的手段。通过修改设备序列号,能够防止非法复制和盗版行为,保护制造商和消费者的权益。另外,一些需要唯一标识的应用场景,如在线支付、加密狗等,也可以使用该工具为不同设备设置独一无二的序列号,以确保信息的安全性和设备的唯一性。 然而,需要注意的是,修改USB设备序列号可能涉及到违反制造商规定的行为。如果未经授权地修改设备序列号,可能会引起法律纠纷和设备无法正常使用的问题。因此,在使用USB设备序列号修改工具时,务必遵守法律法规和相关合规规定。 总之,USB设备序列号修改工具是一种功能强大的软件工具,能够修改USB设备的序列号。使用该工具可以用于设备调试和测试、防止盗版行为以及满足某些特定应用场景的需求。然而,需要谨慎使用,遵守法律法规和相关规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值