博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

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

Posted on 2012-12-05 14:40  Light.Yang  阅读(246)  评论(0)    收藏  举报

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

 1         //获取硬盘号 
 2 
 3   private string GetDiskID()
 4 
 5         {   
 6 
 7             try
 8 
 9             {
10 
11                 //获取硬盘ID 
12 
13                 String HDid = "";
14 
15                 ManagementClass mc = new ManagementClass("Win32_DiskDrive");
16 
17                 ManagementObjectCollection moc = mc.GetInstances();
18 
19                 foreach (ManagementObject mo in moc)
20 
21                 {
22 
23                     HDid = (string)mo.Properties["Model"].Value;
24 
25                 }
26 
27                 moc = null;
28 
29                 mc = null;
30 
31                 return HDid;
32 
33             }
34 
35             catch
36 
37             {
38 
39                 return "";
40 
41             }
42 
43             finally
44 
45             {
46 
47             }
48 
49         }
50 
51         //获取CPU信息 
52 
53         private string GetCpuInfo()
54 
55         {
56 
57             try
58 
59             {
60 
61                 string cpuInfo = "";//cpu序列号 
62 
63                 ManagementClass cimobject = new ManagementClass("Win32_Processor");
64 
65                 ManagementObjectCollection moc = cimobject.GetInstances();
66 
67                 foreach (ManagementObject mo in moc)
68 
69                 {
70 
71                     cpuInfo = mo.Properties["ProcessorId"].Value.ToString();
72 
73                 }
74 
75                 return cpuInfo;
76 
77             }
78 
79             catch
80 
81             {
82 
83                 this.senRegeditID.Enabled = false;
84 
85                 this.GetId.Enabled = true;
86 
87             }
88 
89       
90 
91             return "";
92 
93         }

 

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

 

 

 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/ 谢谢。