日期:2014-05-19  浏览次数:20777 次

请教一下,最后50分,全送.谢谢!
写了一共享软件,想做成带注册功能的,用了以下的思路:

1.注册前,用户将软件号(获取主板号,并将其转换为软件号)发送给我。
2.我根据软件号,算出对应的注册码,发送给用户。
3.用户填写注册码后,将自动对注册码加密,并写入文件。
4.验证是否为注册用户时,将读取加密的文件,取出注册码。然后根据软件号(获取主板号并将其转换为软件号)算出对应的注册码。将这两个注册码进行比较,如果一致,则验证成功。

问题是:
1.我这个注册思路可行否?
2.如可行,怎样将获取的主板号转换为软件号呢?
3.怎样根据软件号,算出对应的注册码呢?

多谢了!!!

------解决方案--------------------
1.我这个注册思路可行否?
可行
2.如可行,怎样将获取的主板号转换为软件号呢?
3.怎样根据软件号,算出对应的注册码呢?
网上有例子
------解决方案--------------------
Q1:
C#中获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息,等等)
http://www.msproject.cn/Article/GetHardwareInformation.aspx
------解决方案--------------------
主板-> 软件号,随便生成,照抄也可以。
软件号传到了你手里-> 使用公钥加密软件号,获得注册号;
把注册号给用户-> 注册号随便加密一下存起来,注意必须是可逆的加密;
软件运行时候-> 读取主版号,算出软件号,读注册号(解密),用私钥解密,软件号相同,则通过。

公钥和私钥的生成,使用RSA加密。

RSA算法 :

首先, 找出三个数, p, q, r,
其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数......
p, q, r 这三个数便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1).....
这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了.....
再来, 计算 n = pq.......
m, n 这两个数便是 public key

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n....
如果 a > = n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),
则每一位数均小於 n, 然後分段编码......
接下来, 计算 b == a^m mod n, (0 <= b < n),
b 就是编码後的资料......

解码的过程是, 计算 c == b^r mod pq (0 <= c < pq),
於是乎, 解码完毕......

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b......
他如果要解码的话, 必须想办法得到 r......
所以, 他必须先对 n 作质因数分解.........
要防止他分解, 最有效的方法是找两个非常的大质数 p, q,
使第三者作因数分解时发生困难。
------解决方案--------------------
Q2:对于这种注册机制,一般都是你发用户发E_Mail开发者,附上软件号(机器码),等用户给你付款后,你再把注册号发给用户;
------解决方案--------------------
1.获取机器名:

 public string GetHostName()
{
return System.Net.Dns.GetHostName();
}

2.获取CPU编号

 public string GetCpuId()

{

ManagementClass mc = new ManagementClass( "Win32_Processor ");
ManagementObjectCollection moc = mc.GetInstances();

String strCpuID = null ;
foreach( ManagementObject mo in moc )
{
strCpuID = mo.Properties[ "ProcessorId "].Value.ToString();
break;
}
return strCpuID;

}

3.获取主硬盘编号

public string GetMainHardDiskId()

{

ManagementObjectSearcher searcher = new ManagementObjectSearcher( "SELECT * FROM Win32_PhysicalMedia ");
String strHardDiskID = null ;
foreach(ManagementObject mo in searcher.Get())
{
strHardDiskID = mo[ "SerialNumber "].ToString().Trim();
break;
}
return strHardDiskID ;

}

------解决方案--------------------
LZ可以参考一些以软件的注册方式,好象windows优化大师就是这样;(好象哈,我一般都直接到破解站点下载)
------解决方案--------------------
如果懒得自己算公钥和私钥,微软有工具可以代劳

http://msdn2.microsoft.com/zh-cn/library/6f05ezxy(VS.80).aspx
------解决方案--------------------
Q3:什么算法都行,说白了就一个加密方法;这个对于LZ来说应该不难;
------解决方案--------------------
2.获取主板和获取CPU或者是硬盘号有什么区别么
3.逆运算啊
------解决方案--------------------