用非对称密码算法制作共享软件的注册码

2016-02-19 16:59 2 1 收藏

下面请跟着图老师小编一起来了解下用非对称密码算法制作共享软件的注册码,精心挑选的内容希望大家喜欢,不要忘记点个赞哦!

【 tulaoshi.com - 编程语言 】

  网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)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、这种方法只是为了防止被人写出注册机,它无法防止通过修改程序中跳转指令的方法来破解你的软件。为了防止别人修改你的程序文件,可以用注册码中的一部分来加密你的程序代码或数据。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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

  #include "lip.h"

  并把"lip.c"加入到project中。

  然后将用户名的ASCII码转换成相应的十六进制串:

  char UserName[] = "4E6574677579";

  char SerialNumber[256];

  verylong N = 0, D = 0, M = 0, C = 0; //Freelip中的大数类型为verylong。

  zhsread( UserName, &M); //初始化明文M,M等于用户名的十六进制表示

  zhsread("95D49FD119EF27A9", &N); //初始化模数N

  zhsread("76D2A6E2AC86CC99", &D); //初始化私钥D

  zexpmod(M, D, N, &C); //计算密文C = (M ^ D) mod N

  zswrite(SerialNumber, C); //将C的十进制串表示写入SerialNumber中,即为注册码

  3、在软件中判断注册码。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  char UserNameString[ ] = "4E6574677579"; //用户输入的用户名

  char SerialNumber[ ] = "1876542098762625173846272838"; //用户输入的注册码

  verylong N = 0, E = 0, C = 0, UserName = , DecryptedUserName = 0 ;

  zhsread(SerialNumber, &C); //初始化密文C

  zhsread("95D49FD119EF27A9", &N); //初始化模数N

  zsread("65537", &E); //初始化公钥E

  zexpmod(C, E, N, &DecryptedUserName); //计算明文DecryptedUserName = (C ^ E) mod N

  zhsread(UserNameString, &UserName); //用户输入的用户名

  if (zcompare(UserName, DecryptedUsername))

  {

  //错误的注册码

  }

  else

  {

  //正确的注册码

  }

  附:常用的大数运算库的地址(有些虽然不是专门的大数运算库,但是带有相关的库)

  1、Crypto++:http://www.eskimo.com/~weidai/cryptlib.html(C++)

  2、MIRACL:http://indigo.ie/~mscott/(C/C++)

  3、GNU MP:http://www.swox.com/gmp/ (C)

  4、Piologie: http://www.hipilib.de/pidownload.htm

  5、cryptlib:http://www.cs.auckland.ac.nz/~pgut001/cryptlib/

  6、RSAEuro:http://www.rsaeuro.com/products/RSAEuro/

  7、OpenSSL:http://www.openssl.org/

  9、RSARef:http://download.gale.org/rsaref20.tar.Z

  10、GInt:http://triade.studentenweb.org/GInt/gint.html (Delphi) 

来源:https://www.tulaoshi.com/n/20160219/1613783.html

延伸阅读
1、检测主程序大小,防止破解补丁之类: Function TForm1.GesSelfSf: integer; var F: file of byte; begin    Filemode:=0;    Assignfile(F,'.FileName.exe');    Reset(f);    Result:=Filesize(F);    Closefile(F); end; ...
现在,许多软件都加入了共享www.tulaoshi.com大军,而我们不少教师辛勤制作的教学课件至今仍是免费家族中的一员,大家都可免费使用。因此,我一直在寻求一种保护广大教师利益的方法,由此便想:能否用手边的Authorware为制作的课件设计一个软件注册程序,用于保护我们教师的“知识产权”呢?(是不是觉得太严肃了。^-^)。在经过一段时间的思...
//******************************************************************* //在许多情况下我们需要穷举组合的算法,比如密码词典。 //这个算法的要害是密码下标进位的问题。 //另外本例子中的写文件语句效率比较低,为了降低算法复杂度没有优化。 //假如要提高写文件的效率,可以使用缓冲区,分批写入。 //******...
算法一:O(n^3) 判断字串是否对称是从外到里, O(n) 代码如下: #include stdio.h #include string.h /*  *判断起始指针,到结束指针的字符串是否对称  */ int IsSymmetrical(char* pBegin, char* pEnd) {     if(pBegin == NULL || pEnd == NULL || pBegin pEnd)     return 0;   ...
云雀361打印共享软件打印图片很模糊怎么办   打印图片很模糊怎么办? 其实出现打印图片模糊是一般用户都会遇到的情况,一般是黑白打印机打印图片引起的,可以通过设置打印机DPI来缓解,解决办法很简单,只需要调整图形打印质量即可 设置方法: 开始-设备和打印机-云雀360网络打印机-打印机属性-首选项-高级-打印质量-设...

经验教程

211

收藏

100
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部