`
wyf
  • 浏览: 442011 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

C# 注册码

阅读更多

Microsoft .Net的应用程序的代码文件,与Java生成的文件类似,它们都没有本地代码,而是一种类似于汇编的代码。这样,只要有合适的工具,就可以完整的把别人写出来的程序反编译成自己需要的程序文件。 

我所知道的.Net下的反汇编程序是Salamander 和 Refelector 两个工具,他们都可以对.Net的程序集反编译成你需要的语言。 

那么,我们写的程序,做的项目,如何进行正版的许可证管理,有许多方法。 

最好的方案,是几个方法的综合。下面我说一下单独的许可验证方法。 

最简单的方法,就是使用许可存储。方法是用户输入正版的注册码,通过程序中专门的算法程序进行验算,得出的结果与事先保存在程序中的结果比对,比对一致表示输入正确。然后把结果保存在存储中,如注册表或者专门的许可文件中,程序许可通过。 

这个方法使用的人/公司最多,但是缺点也是最多的,只要使用上面的工具把验算注册码的算法给弄清楚,就可以自己写一个生成序列号的注册机,这个注册方法就形同虚设了。 

还有一个比较好的方法,就是仿照WindowsXP的激活机制,客户的程序自动访问互联网的一个专门设定的服务器,通过Tcp/Ip或者WebService远程访问服务器上的许可程序,许可后把结果保存在客户端计算机上。这个方法的好处是许可验证代码保存在开发者控制的计算机上,客户端无法获取验证算法,而且可以通过数据库管理用户,非常方便。 

但是这个方法也有缺点,首先是可靠的Internet连接。如果要防止用户使用盗版,则必须在客户端的程序中添加一个随机访问远程许可服务器验证的功能,这样不但需要一个24小时的Internet连接,而且经常进行验证也会干扰程序的正常运行。还有就是如果有人通过研究客户端的接收返回信息的代码,弄一个虚拟的验证服务器,这个功能也会完蛋。 

那么,所有的焦点都聚集在客户端的验证算法上,只要这个客户端的验证算法被人弄清楚了,整个程序的许可可以说就不存在了,所以许多开发者/开发公司费好大的力气,弄一个足够复杂的验证算法出来,用算法的复杂度来抵抗破解。但是再复杂的算法,只要有人写得出来,就有人能破解得出来,这个道理我想大家都明白。 

那是否有加密算法与解密算法不同的办法呢?有。而且.Net自带的类库里面就有这个算法。 
这个算法的原理是不对称加密的原理。不对称加密原理大家基本上都了解。加密的密码(密钥)分为两个部分,公钥和私钥。通过私钥加密的密文只能通过公钥解密。根据这个特性,我们可以发现只要开发者保存好私钥,即使算法代码被客户端破解,因客户端不知道保存在开发者处的私钥,也无法生成注册码。 

这个算法就是 System.Security.Cryptography 名称空间的 RSAPKCS1SignatureFormatter 类(用来生成注册码)和 RSAPKCS1SignatureDeformatter 类(用来在客户端验证注册码)。验证过程如下: 
首先,需要生成一个公钥和私钥对,当然,依靠人是无法生成的,我们可以通过 System.Security.Cryptography 名称空间的RSACryptoServiceProvider 类来生成公钥/私钥对。 


using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
// 公钥 
string pubkey = rsa.ToXmlString(false); 

// 私钥 
string prikey = rsa.ToXmlString(true); 
} 
获取私钥以后,可以用 RSAPKCS1SignatureFormatter 类来生成注册码,代码如下(引用名称空间略) 

using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
rsa.FromXmlString(prikey); 
// 加密对象 
RSAPKCS1SignatureFormatter f = new RSAPKCS1SignatureFormatter(rsa); 
f.SetHashAlgorithm("SHA1"); 
byte[] source = System.Text.ASCIIEncoding.ASCII.GetBytes(txtIn.Text); 
SHA1Managed sha = new SHA1Managed(); 
byte[] result = sha.ComputeHash(source); 

byte[] b = f.CreateSignature(result); 

msg.Text = Convert.ToBase64String(b); 
} 
上面的代码是一个示例aspx页面的代码,页面包括一个id为msg的Label控件,一个ID为txtIn的TextBox控件,一个ID为btnOK的Button控件,上面的代码就是btnOK的事件处理程序的内容。大家可以非常清楚的看出处理流程,生成一个RsaCryptoServiceProvider类实例,然后把这个类实例的加密密钥指定为包含私钥的prikey字符串因为加密解密的公钥/私钥必须是对应的。然后获取txtIn输入的内容,生成密钥后在msg控件上显示。 

下面是使用 RSAPKCS1SignatureDeformatter 类来验证输入: 
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) 
{ 
rsa.FromXmlString(pubkey); 
RSAPKCS1SignatureDeformatter f = new RSAPKCS1SignatureDeformatter(rsa); 

f.SetHashAlgorithm("SHA1"); 

byte[] key = Convert.FromBase64String(txtKey.Text); 

SHA1Managed sha = new SHA1Managed(); 
byte[] name = sha.ComputeHash(ASCIIEncoding.ASCII.GetBytes(txtIn.Text)); 
if(f.VerifySignature(name,key)) 
msg.Text = "验证成功"; 
else 
msg.Text = "不成功"; 
} 

上面的代码也很好理解,就是多了一个ID为txtKey的TextBox控件,他通过同时获取用户名/加密密钥来进行验证。重点是RSA类的FromXmlString()方法,注意上面的这个方法获取的是公钥,表示这段验证代码是保存在客户端的,客户端代码是没有私钥的,即使有人把程序集的代码反编译了也没有用。 


上面两段代码需要注意的就是生成的公钥/私钥必须匹配,我使用RSA对象生成密钥对后保存成为字符串常量,就可以解决这个问题。 

上面这个方法仍然无法解决客户使用ildasm反编译后暴力修改IL代码,只有靠可靠的强名称以及数字证书来保证程序集不被修改了。 
 
分享到:
评论

相关推荐

    C#注册码生成

    总的来说,C#注册码生成涉及获取电脑硬件信息、设计注册码算法、实现生成及验证功能等多个步骤。通过合理的算法设计和安全策略,可以有效保护软件免受非法复制和滥用。在实际应用中,开发者需要不断调整和优化策略,...

    C# 注册码注册机制 实例源码(加密解密)

    本实例源码着重讲解了如何在C#中设计一个注册码注册系统,涉及到的核心知识点包括加密解密算法、序列化、哈希校验以及网络通信。 首先,我们来看加密解密部分。在软件注册过程中,通常会将用户的注册信息(如用户名...

    C#注册码注册机制完整源码示例_14.rar

    C#注册码注册机制完整源码示例_14.rarC#注册码注册机制完整源码示例_14.rar

    C#注册码注册机制完整源码示例

    在这个“C#注册码注册机制完整源码示例”中,我们可以深入理解如何在C#应用中构建一个安全、可靠的注册系统。 首先,注册码的生成通常涉及到算法。开发者会使用特定的算法,结合用户的个人信息(如姓名、电子邮件等...

    C#注册码注册机制完整源码示例.rar

    C#注册码注册机制完整源码示例.rar

    C#注册码注册机制完整源码示例{201903}

    C#注册码注册机制完整源码示例{201903}

    C#注册码注册机制完整源码示例(0520_).rar

    C#注册码注册机制完整源码示例(0520_).rar

    C#注册码注册机制完整源码示例_0520.rar

    C#注册码注册机制完整源码示例_0520.rar

    c# --注册码生成算法

    ### C# 注册码生成算法解析 #### 一、引言 在软件开发领域,为了保护软件不被非法复制和传播,很多开发者会选择为自己的软件加入注册机制。本篇文章将详细解析一个基于C#实现的注册码生成算法,该算法通过获取...

    C# 软件 机器码生成注册码

    综上所述,C#中实现机器码生成注册码的过程包括获取硬件信息、生成机器码、创建注册码以及验证注册码。这个过程中,安全性是关键,开发者需要不断调整加密策略以应对破解手段的升级。在项目"zhuceTest"中,你可以...

    C#注册码注册机制完整源码示例(测试可用)

    C#注册码注册机制完整源码示例(测试可用)

    C#注册码注册机制完整源码示例.rar.rar

    C#注册码注册机制完整源码示例.rar

    c#注册码实现知识.pdf

    本文档基于`c#注册码实现知识.pdf`的内容,深入探讨如何利用C#语言实现简单的软件注册功能。通过本篇文章的学习,您将了解软件注册的基本原理,并掌握具体的实现步骤。 #### 二、核心概念 1. **机器码**:通常是指...

    c#注册码实现.pdf

    本文将基于一份名为“c#注册码实现.pdf”的文档,深入探讨如何利用C#语言来实现简单的软件注册功能。此文档提供了关于如何通过获取计算机硬件信息(例如CPU序列号),并对其进行加密处理,从而生成注册码的基本思路...

Global site tag (gtag.js) - Google Analytics