请教一下,最后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.逆运算啊
------解决方案--------------------