• 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())
    {
    // 公钥
    stringpubkey =rsa.ToXmlString(false);
    // 私钥
    stringprikey =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);
    11 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代码,只有靠可靠的强名称以及数字证书来保证程序集不被修改了。

    http://www.cpbcw.com/article/1851.html

C#实现软件注册码算法相关推荐

  1. 蛙蛙推荐:蛙蛙牌软件注册码算法

    蛙蛙推荐:蛙蛙牌软件注册码算法 摘要:辛辛苦苦写个共享软件,又怕被人破解,所以就会想到用注册码的方式来激活软件.本蛙给大家一个简单的思路来实现软件注册码算法,当然.net做的东西很容易被人破解,反编译 ...

  2. 基于RSA算法实现软件注册码原理初讨

    https://blog.csdn.net/larryliuqing/article/details/7457200 前言 目前,商用软件和共享软件绝大部份都是采用注册码授权的方式来保证软件本身不被盗 ...

  3. 在线激活流程研究, 芯片杂烩, 软件滤波算法

    在线激活流程研究 在世界范围内,软件的盗版问题都是个令程序员苦恼的问题.相应的,很多反盗版的措施也就应运而生.其中以输入序列号.激活码的产品激活策略应用最为广泛.本文就从流程的角度粗略的描述一下这个过 ...

  4. Mac 常用软件注册码

    注册码quicktime7.1.5 注册码: name:   Pablo/nop    serial:   SMH2-6F4K-8SK9-ST5W-QKU3 Final Cut Pro 5.1正式安装 ...

  5. 头条 | 全国首家导航定位高精度软件与算法联合实验室成立

    "跟着导航走,结果发现要开到海里去了!"一位用户如此吐槽不够精准的导航. 日前,无人驾驶汽车上路测试牌照颁发,部分城市开始进行开放道路测试,自动驾驶汽车上路测试安全等问题引起更多关 ...

  6. 破解各种软件注册码【申明:来源于网络】

    破解各种软件注册码[申明:来源于网络] 地址:http://wenku.baidu.com/link?url=m6K81YIHFGSbjhs4R-hj1fVBNjg4_vlXvG01WDYzrVT4_ ...

  7. 软件工程师 算法工程师_采访100多位软件工程师后的建议

    软件工程师 算法工程师 重点 (Top highlight) This awkward and stressful thing between emerging a hero after comple ...

  8. C# 生成软件注册码

    C# 生成软件注册码 今天早上,花了一个早上弄了个生成机器码和注册码的Demo,通过生成的注册码里面包含时间信息,保证了注册码在使用后的指定时间后失效 由于数学不行所以写的比较简单,ok 上代码吧 产 ...

  9. PDF 破解软件注册码

    注册码:91PIR4SS6BV0R7305784 或 55KO17SUMVVQR4300175 PDF 破解软件注册码

最新文章

  1. 电商项目商品搜索模块 - ESik分词器安装
  2. python面试题_面试时全对这25道python面试题,成就了我月薪25K!附教程分享)
  3. 2020 年值得再读一遍的网易云信技术干货 | 上篇
  4. ElasticSearch第二天
  5. 抖音客新版UI短视频点赞任务系统完美运营级别[等级功能+信誉积分+保证金]
  6. Transformers与图神经网络的关系,我们能从transformer学习到什么?
  7. 随手记_思路历程_马原知识体系逻辑图解
  8. Axure8.0 装汉化包
  9. C++网络编程实例(socket)
  10. JavaScript简单入门教程学习篇
  11. C#获取汉字的区位码的方法
  12. 升级计算机的图形卡和驱动程序,Win10更新显卡驱动程序后无法开机怎么办?解决方案...
  13. 【JDBC】JDBC入门汇总及范例讲解
  14. 刚挣钱的程序员同学该如何花钱?
  15. 面试回忆之二:MLY公司的面试题
  16. 办公软件excel表格_Office 办公软件教程丨Word,Excel,PPT
  17. java中modifier_java中关于.lang.reflect.Modifier.isInterface()方法的实例详解
  18. NOI2014魔法森林--LCT
  19. 中国网文出海先行者阅文集团四度入选国家文化出口重点企业名单
  20. html游戏转wxw,wf.html · wxw婉/flowChart - Gitee.com

热门文章

  1. 苹果AirTag发布2A36固件更新,Find My功能应用越来越广泛
  2. 编写函数has(arr , 60) 判断数组中是否存在60这个元素,返回布尔类型
  3. 数据结构-数组(Array)
  4. PHP实现单人多人聊天源码免费分享 | 电脑报修系统
  5. Multisim实现简易数码管数显
  6. BLOCK层代码分析(6)IO下发之SGL聚散列表
  7. 软件工程导论笔记(同步更新)(已结束更新)
  8. awstats 配置
  9. Excel中插入柱状图以及在图下方显示数据表
  10. 震撼!这群人已经先富了,到底发生了什么?