日期:2014-05-18  浏览次数:21012 次

WinForm 实现注册码
想实现一个软件注册的功能,我将软件给用户之后用户必须有我给的注册码才可以使用,这个注册码一定要是我给的,并且这

个注册码只能在一台电脑上面使用,下面的代码基本上实现了注册的功能,注册码是根据硬盘和CPU的编号来生成的,但是关

键的问题来了,这个注册码如何能在我手里面?不然的话用户只要拿到了这个软件就可以自行注册了,比如两个用户,其中一

个用户买了这个软件,然后复制给另一个用户,那么另一个用户可以自行注册了使用,那就惨了,期待大神的质指点。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace SystemTools.Register
{
  public class SoftReg
  {
  ///<summary>
  /// 获取硬盘卷标号
  ///</summary>
  ///<returns></returns>
  public string GetDiskVolumeSerialNumber()
  {
  ManagementClass mc = new ManagementClass("win32_NetworkAdapterConfiguration");
  ManagementObject disk = new ManagementObject("win32_logicaldisk.deviceid=\"c:\"");
  disk.Get();
  return disk.GetPropertyValue("VolumeSerialNumber").ToString();
  }

  ///<summary>
  /// 获取CPU序列号
  ///</summary>
  ///<returns></returns>
  public string GetCpu()
  {
  string strCpu = null;
  ManagementClass myCpu = new ManagementClass("win32_Processor");
  ManagementObjectCollection myCpuCollection = myCpu.GetInstances();
  foreach (ManagementObject myObject in myCpuCollection)
  {
  strCpu = myObject.Properties["Processorid"].Value.ToString();
  }
  return strCpu;
  }

  ///<summary>
  /// 生成机器码
  ///</summary>
  ///<returns></returns>
  public string GetMNum()
  {
  string strNum = GetCpu() + GetDiskVolumeSerialNumber();
  string strMNum = strNum.Substring(0, 24); //截取前24位作为机器码
  return strMNum;
  }

  public int[] intCode = new int[127]; //存储密钥
  public char[] charCode = new char[25]; //存储ASCII码
  public int[] intNumber = new int[25]; //存储ASCII码值

  //初始化密钥
  public void SetIntCode()
  {
  for (int i = 1; i < intCode.Length; i++)
  {
  intCode[i] = i % 9;
  }
  }

  ///<summary>
  /// 生成注册码
  ///</summary>
  ///<returns></returns>
  public string GetRNum()
  {
  SetIntCode();
  string strMNum = GetMNum();
  for (int i = 1; i < charCode.Length; i++) //存储机器码
  {
  charCode[i] = Convert.ToChar(strMNum.Substring(i - 1, 1));
  }
  for (int j = 1; j < intNumber.Length; j++) //改变ASCII码值
  {
  intNumber[j] = Convert.ToInt32(charCode[j]) + intCode[Convert.ToInt32(charCode[j])];
  }
  string strAsciiName = ""; //注册码
  for (int k = 1; k < intNumber.Length; k++) //生成注册码
  {

  if ((intNumber[k] >= 48 && intNumber[k] <= 57) || (intNumber[k] >= 65 && intNumber[k]
  <= 90) || (intNumber[k] >