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

原创 2001年11月11日 19:15:00

网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)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

#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、在软件中判断注册码。
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)

共享软件加密的一些误区

  本文发表于《电脑软件编程与维护》 2005年12期  作者:星轨(oRbIt)  E_Mail :inte2000@163.com    ...
  • orbit
  • orbit
  • 2006年06月07日 18:53
  • 6976

使用非对称加密算法的例子

using System;using System.IO;using System.Text;using System.Security.Cryptography;/// /// 一个简单的使用.NE...
  • jxufewbt
  • jxufewbt
  • 2006年05月26日 14:01
  • 3436

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

1 前言目前,商用软件和共享软件绝大部份都是采用注册码授权的方式来保证软件本身不被盗用,以保证自身的利益。尽管很多常用的许多软件系统的某些版本已经被别人破解,但对于软件特殊行业而言,注册码授权的方式还...
  • scollins
  • scollins
  • 2010年06月25日 16:11
  • 13021

软件借用RSA增加注册功能

openssl  rsautl -in hello.txt  -out hello.sign -inkey rsa_public_key.pem  -pubin  -sign A private ke...
  • shell_albert
  • shell_albert
  • 2015年04月22日 16:38
  • 963

注册登录请求中RSA加密,PHP服务器和Android客户端实现

前言客户端利用Http协议进行注册和登录等操作时,如果不做特殊处理,请求中携带的密码等敏感信息是明文传输的,有可能会被截获。解决这个问题最好的方法当然是使用Https协议,但是Https协议需要像权威...
  • kbkaaa
  • kbkaaa
  • 2017年11月28日 16:38
  • 217

使用RSA1024算法防止软件被Keygen

学习新的知识是一件很令人高兴和满足的事情,但是能和别人分享学习的经验,更令人快乐。 由于我是一个菜鸟,所以有很多说不清楚的地方,还希望高手指正,毕竟,讨论才是学习永恒的主题。 相信大家看了密码...
  • shuilan0066
  • shuilan0066
  • 2013年01月19日 16:06
  • 1995

【最新分享】网页设计大师(新电子软件+注册码)模板库

  • 2015年01月05日 17:17
  • 36.72MB
  • 下载

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

网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)RSA制作注册码的方法。采用这种方法,不知道密钥的话时很难写出注册...
  • Netguy
  • Netguy
  • 2001年11月11日 19:15
  • 1406

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

网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)RSA制作注册码的方法。采用这种方法,不知道密钥的话时很难写出注册...
  • yanghao58686763
  • yanghao58686763
  • 2008年01月12日 11:21
  • 1125

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

软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)RSA制作注册码的方法。采用这种方法,不知道密钥的话时很难写出注册机来。实际上有...
  • javaweb_research
  • javaweb_research
  • 2012年05月31日 09:45
  • 366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用非对称密码算法制作共享软件的注册码
举报原因:
原因补充:

(最多只允许输入30个字)