首页 新闻 会员 周边

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

0
悬赏园豆:10 [已关闭问题] 关闭于 2013-01-16 17:32

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

问题补充: 这个算法就是 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 = prikey; } 上面的代码是一个示例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()方法,注意上面的这个方法获取的是公钥,表示这段验证代码是保存在客户端的,客户端代码是没有私钥的,即使有人把程序集的代码反编译了也没有用。 我搜寻了一些这样的代码,但是我还不大明白这个代码的使用,公钥和私钥的关系,使用时候老出问题,请问前辈多多指导,或者有没有相关的示例,可参考一下。2楼的朋友感觉说的很对,但是我不知道怎么实现。
阿连的主页 阿连 | 初学一级 | 园豆:136
提问于:2010-12-30 11:03
< >
分享
所有回答(3)
0

恩?注册码?这个需要加密吗?

顾晓北 | 园豆:10844 (专家六级) | 2010-12-30 11:16
恩 需要
支持(0) 反对(0) 阿连 | 园豆:136 (初学一级) | 2010-12-31 08:40
0

说说大概过程吧

首先自带的貌似不太可能,必须要自己实现rsa .net没提供的额外算法(至少我不会用),即私钥加密,公钥解密,而且自身携带的rsa算法有很多限制,以前用的时候也觉得很难搞,后来采用了codeproject上面提供的大素数算法结合一些其他代码自己实现的。

第二步:写个winform程序,用来产生公私钥(这个系统可以提供),方便产生注册码

第三步:说说注册码,验证方式,我采用的是日期到期方式,即到哪天软件过期,当然这其中还要防止系统的时间被修改等方面的东西,也是可以实现的,这里就简略了

比如某软件的使用期间是:2010一月-2011一月,就是产生这样的一个时间字符串,到期时间=datetime.now.add(1year).tostring()

第4步:将产生的公钥放置在客户端软件中,用于验证时间字符串是否在有效期间内

第五步:私钥加密 到期时间(还可能需要base64变换),产生注册码,发送给用户

 

大致就是这样的流程,希望有所帮助

 

massinger | 园豆:706 (小虾三级) | 2010-12-30 11:23
谢谢你的回答,你大概说的就是这么个意思,思路很清晰,但是具体的实现我还是有点迷惑,如果您有示例可否提供一下,谢谢您的帮助。
支持(0) 反对(0) 阿连 | 园豆:136 (初学一级) | 2010-12-31 08:43
0

这个还得自己写。

Astar | 园豆:40805 (高人七级) | 2010-12-30 13:23
请问前辈是否有相关的代码和示例可供参考。
支持(0) 反对(0) 阿连 | 园豆:136 (初学一级) | 2010-12-31 08:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册