使用.NET自带的功能制作简单的注册码

加密可以帮助保护数据不被查看和修改,并且可以帮助在本不安全的信道上提供安全的通信方式。例如,可以使用加密算法对数据进行加密,在加密状态下传输数据,然后由预定的接收方对数据进行解密。如果第三方截获了加密的数据,解密数据是很困难的。

为了达到这些目的,您可以使用算法和惯例的组合(称作加密基元)来创建加密方案。包括私钥加密(对称加密)、公钥加密(不对称加密)、加密签名和加密哈希。

我们使用公钥加密(不对称加密)来实现注册码的算法。

公钥加密使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联;用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。

对于注册码来说,我们使用私钥来对一个字符串(用户名)签名,然后使用公钥对这个签名(注册码)进行验证。由于公钥只能用于验证,所以我们可以放心把公钥分发出去;私钥匙用来进行签名的,所以私钥匙要保存在开发者手中的。这样就达到了注册认证的目的。目前使用“用户名、注册码”模式注册的软件都应该是使用这一技术。

首先我们生成自己要使用的一个公钥和私钥。

Private rsa As New Security.Cryptography.RSACryptoServiceProvider

RSACryptoServiceProvider类提供RSA算法的实现执行不对称加密和解密。通过ToXMLString就可以生成我们需要的公钥和私钥。

rsa.ToXmlString(False)

rsa.ToXmlString(True)

当参数为False的时候,仅生成公钥;True的时候将会把公钥和私钥全部生成。我们一般通过ToXmlString(False)得到一个公钥字符串;通过ToXmlString(True)得到一个私钥字符串(虽然其中含有公钥)。我们可以将这两个密钥保存在本机上面,通过字符串常量定义并使用。也就是说我们的注册信息将使用唯一的公钥和私钥。

然后我们通过公钥和私钥对指定的字符串进行签名。

rsa.FromXmlString(PRIVATE_KEY)

Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)

f.SetHashAlgorithm("SHA1")

Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)

Dim sha As New Security.Cryptography.SHA1Managed

Dim result() As Byte = sha.ComputeHash(source)

Dim regkey() As Byte = f.CreateSignature(result)

SerialNumber = Convert.ToBase64String(regkey)

通过刚才得到的私钥重新初始化rsa对象,然后通过RSAPKCS1SignatureFormatter类来进行签名。我们将输入的字符串转化成字节数组(我们这里默认用户名只能由ASCII字符组成),通过SHA1哈西算法计算其哈希值。再使用CreateSignature方法将得到的哈西值进行签名。最后我们将得到的字节数组转化成字符串作为注册码。这就是生成注册码的过程。我们可以重复使用这一段程序对不同的用户名进行签名,从而得到与之对应的不同注册码。

最后我们把刚才得到的用户名和注册码进行验证。

rsa.FromXmlString(PUBLIC_KEY)

Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)

f.SetHashAlgorithm("SHA1")

Dim key() As Byte = Convert.FromBase64String(SerialNumber)

Dim sha As New Security.Cryptography.SHA1Managed

Dim name() As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))

Result = f.VerifySignature(name, key)

这一次我们使用公钥来初始化rsa对象,然后通过RSAPKCS1SignatureDeformatter类来验证签名。我们将得到的注册码反向转化为字节数组;并将用户名进行哈西计算得到哈西值。最后通过VerifySignature进行验证。

 
从上面的程序可以看出,生成注册码需要私钥(私钥内附带公钥信息),而且可以生成任意多的用户名、注册码对。而通过公钥,我们只能进行验证而不能生成。所以公钥可以放心的发放给所有的用户进行验证,而私钥却不能。所以在发行的版本中可以附带公钥和验证算法。因为即便用户得到了公钥和验证算法也无法简单的破解。

现在网络上流行的注册机,很大程度上是破解了软件的私钥,从而达到无限制的生成所需要的注册信息。但是如果用户反编译你的产品,并且修改了中间代码,那么它将会绕过注册的判断逻辑。这就不是这一篇所能解决的问题了。因为即是你使用了Web Service技术进行在线激活或注册,还是可以通过网络侦听来分析服务器的信息,模拟一个假的服务器来进行的。

时间: 2024-09-26 06:49:08

使用.NET自带的功能制作简单的注册码的相关文章

最简单查询带分页功能的代码

晚上,应一位网友的求助,偶写了个最简单的查询带分页功能的页面(跳转分页时查询条件不丢失),希望对大家有所帮助.先建立一个Access的数据库Db1.mdb,里面有一个数据表Dicky,共4个字段:字段名 数据类型ID AutoNumberName TextSex TextAge NumberQQ Number建立完库后请自行添加几条数据作为测试.Page.asp代码如下:<html><head><title>分页测试</title><script la

PS使用滤镜功能制作火焰字

  很多朋友都对火焰字特效感兴趣,但总找不到好的方法,而PS很多的特效都是通过滤镜和图层样式的混合使用而实现的,下面小编为大家介绍了这个简单的方法,就是利用PS使用滤镜功能制作火焰字方法,感兴趣的朋友可以跟着教程来学习,一起来看看吧! 第一步 启动PS软件,使用组合键ctrl+n,新建一个文件,如图所示,文档大小没有太大的要求,写上字能看的清楚就可以了,也可以安装图中的参数进行设置. 第二步 无论什么特殊效果的字,都要使用到文字工具,如图所示,点击文件工具--选择"横排文字工具".剩下

Flash绘图功能制作奶瓶标志

核心提示:Flash绘图功能制作奶瓶标志 随着flash的发展,现在已经到了CS3的时代,而且对于AS的支持一带比一带强,可是大家(特别是新手)可能会忽略了一点,其实flash最开始是用来做动画的软件,他也有一定的绘图能力,因此为大家收集了不少flash制作动画的教程,虽然过程可能简单但是对熟悉flash的图片处理功能很有好处. 本教程从基本形状开始,完全使用FLASH画一个小奶瓶的图标,先看看效果图吧: 效果图 首先我们从一个圆角的矩形开始,把它的底部调节成圆形. 图1 图2 再把顶部调成突起

利用PHP制作简单的内容采集器

采集器,通常又叫小偷程序,主要是用来抓取别人网页内容的.关于采集器的制作,其实并不难,就是远程打开要采集的网页,然后用正则表达式将需要的内容匹配出来,只要稍微有点正则表达式的基础,都能做出自己的采集器来的. 前几天做了个小说连载的程序,因为怕更新麻烦,顺带就写了个采集器,采集八路中文网的,功能比较简单,不能自定义规则,不过大概思路都在里面了,自定义规则可以自己来扩展. 用PHP来做采集器主要用到两个函数:file_get_contents()和preg_match_all(),前一个是远程读取网

XP系统自带“计算机管理”功能在什么位置?

  XP系统自带"计算机管理"功能在什么位置?          方法一: 1.第一种方法是小编介绍方法当中最简单的.打开Windows XP系统,鼠标右键右键点击"我的电脑",然后点击"管理". 2.这样,"计算机管理"轻轻松松就被打开了. 方法二: 1.第二种方法是利用控制面板打开.打开Windows XP系统中的"开始",然后点击"控制面板". 2.打开"控制面板&quo

PHP实现的带超时功能get

这篇文章主要介绍了PHP实现的带超时功能的get_headers函数,本文直接给出实现代码,需要的朋友可以参考下 代码比较多,但是比较简单,一眼就看穿的,so,文字尽量少写了. 因为众所周知的网络原因,gavatar也开始越来越慢,写了一个小东西来解决这个问题,过程中遇到了get_headers这个函数,甚是忧伤,记录下来,以免后来人踩坑. 更新记录,函数稍微改了一下,返回值基本和之前序列化后的结果一致,暂时没考虑支持子项也支持数组等(考虑细节性能,还想把没用的http头砍掉-.) 需求很简单:

YII CGridView CListView 返回列表带记忆功能

我们知道Yii 中的CGridview 很好用,但是有时候不能满足我们的页面高制定性,这个时候更加灵活的CListView(只支持CActiveDataProvider) 就可以帮助我们解决这些问题CListView好更容易排版面和样式. CGridView是Yii中的一个灵活的插件GridView的每列为一个CGridColumn对象,通过Column加class来调用 例如它使用CButtonColumn来为每行生成按钮.在这里我们会介绍怎么根据需求自定义按钮. 默认按钮默认情况下 CBut

带分页功能的SSH整合,DAO层经典封装

任何一个封装讲究的是,使用,多状态.Action:     任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然后在继承ServiceManage,ServiceManage类是用来 存放共用的东西:response,重要的是Service的get set 具体讲一下PageManage,    totalPages;//总页数    totalRecord;//总记录数    showRecordNum=D

调用Android自带日历功能(日历列表单、添加一个日历事件)

调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历.  不幸的是,没有文档和Android手机的日历应用集成,因为有另外一个联系人应用程序.相反,本文所提供的所有信息,将会通过逆向工程的谷歌日历内容提供商.该接口