设为首页 加入收藏

TOP

用非对称密码算法制作共享软件的注册码
2014-11-23 21:36:47 】 浏览:418
Tags:对称 密码 算法 制作 共享软件 注册码

  考试大编辑整理C++编程知识


  网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)RSA制作注册码的方法。采用这种方法,不知道密钥的话时很难写出注册机来。实际上有部分软件已经使用了这类方法。


  大家都知道RSA采用一对密钥,即公钥和私钥,从公钥难于推出私钥,反之亦然,这个难度是基于大数分解的难度。利用RSA生成共享软件注册码的思路如下:
  1、先随机生成一对公钥E和私钥D;
  2、软件作者自己写一个注册机,注册机完成的工作就是把用户名M用私钥D加密,密文C就是注册码。由于密文往往包含不可显示字符,所以最好把密文进行编码,变成可显示字符,比如采用base64、uuencode编码等。
  密文C = (M ^ D) mod N
  其中^表示乘幂,mod表示求余,N为RSA的模数。
  3、共享软件将用户输入的注册码先进行解码(如base64解码等),得到密文,然后用公钥E对密文进行解密,得到明文M\',如果明文和用户名相同(即满足M\' = M),则说明注册码正确,否则就是非法的注册码。破解者可以通过跟踪你的软件得到公钥E,但无法得到私钥D。
  明文M\' = (C ^ E) mod D


  有几点需要说明:
  1、模数N太短时不安全,容易被分解。以目前的计算能力,建议N取值在512-bit以上。但这样注册码的长度也变长了,可能给用户带来不方便。一般要采用大数运算库来实现RSA。
  2、随机生成密钥对时,要采用尽可能好的随机数生成算法,否则N还是很有可能被分解。
  3、也可以在注册机中用公钥E对用户名加密得到注册码,在软件中对用户输入的注册码用私钥D进行解密得到用户名。此时公钥E就不能取常用的3、65537等固定值,否则一旦被猜出E,则也可以写出注册机,因为此时破解者可以从你的软件中得到私钥D。
  4、这种方法只是为了防止被人写出注册机,它无法防止通过修改程序中跳转指令的方法来破解你的软件。为了防止别人修改你的程序文件,可以用注册码中的一部分来加密你的程序代码或数据。
  5、这种方法稍加改动即可防止正版用户散发注册码,即采用一机一码的方法,将用户名替换成用户机器的硬软件信息即可,这个硬软件信息应能唯一地表示用户的机器,否则也容易被伪造。
  6、采用了上面的方法之后,只有知道至少一个合法注册码的人才能将程序破解。


  下面举一个例子,采用大数运算库Freelip(http://www.und.nodak.edu/org/crypto/crypto/numbers/programs/freelip/freelip_1.1.tar.gz)来实现RSA。该库是用C写的,商业使用需要许可证。
  1、首先随机生成密钥对。可以自己编程随机搜索大素数。此处由于是举例,我们采用RSATool(http://www.secretashell.com/TMG/RSATool2v15.zip)生成64-bit RSA的参数:
  大素数P = A57F2B33, 大素数Q = E7C441B3, 模数N = 95D49FD119EF27A9, 私钥D = 76D2A6E2AC86CC99, 公钥E = 65537
  2、制作注册机。将用户名用私钥D进行加密,得到的密文作为注册码:


  首先定义宏WIN32(VC自带,但BCB中需要自己定义),然后包含头文件\"lip.h\":
  #ifndef WIN32
  #define WIN32
  #endif


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇BCB中用Sender参数实现代码重用 下一篇堆排序算法的过程演示

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目