简述关于软件加密软件注册通用技术

在我们编写好一款软件后,我们不想别人盗用我们的软件,这时候我们可以采用注册的方式来保护我们的作品。这时候我们可能就需要简单了解一下加密解密技术,下面是我的简单总结:
第一步:程序获得运行机的唯一标示(比如:网卡号,CPU编号,硬盘号等等)。
第二步:程序将获得的唯一标示加密,然后有用户或者程序将加密后的标示发送给你。
第三步:你将加密后的标示解密(其实这时候你获得的就是:网卡号,CPU编号,硬盘号)然后你再将网卡号,CPU编号,硬盘号加密发送给客户注册。
第四步:程序将你发送的注册号进行解密,解密后的编号其实也是:网卡号,CPU编号,硬盘号。
第五步:每当程序启动,首先解密你发送的注册号,然后读取网卡号,CPU编号,硬盘号等等,最好进行验证,看两个标示是否一样。
具体实例看代码:
第一步:程序获得运行机的唯一标示:硬盘号,CPU信息

  1.         //获取硬盘号
  2.         private string GetDiskID()
  3.         {   
  4.             try
  5.             {
  6.                 //获取硬盘ID
  7.                 String HDid = "";
  8.                 ManagementClass mc = new ManagementClass("Win32_DiskDrive");
  9.                 ManagementObjectCollection moc = mc.GetInstances();
  10.                 foreach (ManagementObject mo in moc)
  11.                 {
  12.                     HDid = (string)mo.Properties["Model"].Value;
  13.                 }
  14.                 moc = null;
  15.                 mc = null;
  16.                 return HDid;
  17.             }
  18.             catch
  19.             {
  20.                 return "";
  21.             }
  22.             finally
  23.             {
  24.             }
  25.         }
  26.         //获取CPU信息
  27.         private string GetCpuInfo()
  28.         {
  29.             try
  30.             {
  31.                 string cpuInfo = "";//cpu序列号
  32.                 ManagementClass cimobject = new ManagementClass("Win32_Processor");
  33.                 ManagementObjectCollection moc = cimobject.GetInstances();
  34.                 foreach (ManagementObject mo in moc)
  35.                 {
  36.                     cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
  37.                 }
  38.                 return cpuInfo;
  39.             }
  40.             catch
  41.             {
  42.                 this.senRegeditID.Enabled = false;
  43.                 this.GetId.Enabled = true;
  44.             }
  45.       
  46.             return "";
  47.         }

第二步:程序将获得的唯一标示加密

  1.         //加密
  2.        static public string Encrypt(string PlainText)
  3.         {
  4.             string KEY_64 = "dafei250";
  5.             string IV_64 = "DAFEI500";
  6.             byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
  7.             byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
  8.             DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  9.             int i = cryptoProvider.KeySize;
  10.             MemoryStream ms = new MemoryStream();
  11.             CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
  12.             StreamWriter sw = new StreamWriter(cst);
  13.             sw.Write(PlainText);
  14.             sw.Flush();
  15.             cst.FlushFinalBlock();
  16.             sw.Flush();
  17.             return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
  18.         }

第三步:你将加密后的标示解密(注册的时候解密)

  1.         //解密
  2.         public static string Decrypt(string CypherText)
  3.         {
  4.             string KEY_64 = "haeren55"//必须是8个字符(64Bit)
  5.             string IV_64 = "HAEREN55";  //必须8个字符(64Bit)
  6.             try
  7.             {
  8.                 byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64);
  9.                 byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64);
  10.                 byte[] byEnc;
  11.                 try
  12.                 {
  13.                     byEnc = Convert.FromBase64String(CypherText);
  14.                 }
  15.                 catch
  16.                 {
  17.                     return null;
  18.                 }
  19.                 DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
  20.                 MemoryStream ms = new MemoryStream(byEnc);
  21.                 CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
  22.                 StreamReader sr = new StreamReader(cst);
  23.                 return sr.ReadToEnd();
  24.             }
  25.             catch { return "无法解密!"; }
  26.         }

第四步第五步就不用具体说了吧。另外:如需转载请注明出处:半支烟阿杰http://blog.csdn.net/gisfarmer/ 谢谢。

posted on 2012-09-26 01:09  poir  阅读(266)  评论(0编辑  收藏  举报

导航