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

八角茴香听雨

八角茴香听雨

2016-01-29 12:12

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

提交者:eastvc 发布日期:2004-1-2 20:35:28
原文出处:http://www.csdn.net/


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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

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

#include "lip.h"

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

并把"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
{
//正确的注册码
}

展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
如何用非对称密码算法制作共享软件的注册码

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

编程语言 网络编程
用非对称密码算法制作共享软件的注册码

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

共享软件的注册加密法

编程语言 网络编程
共享软件的注册加密法

利用硬件信息实现共享软件的安全注册

C语言教程 C语言函数
利用硬件信息实现共享软件的安全注册

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

xmind pro 2024注册码

电脑网络
xmind pro 2024注册码

MindManager注册码可以注册几台电脑

电脑网络
MindManager注册码可以注册几台电脑

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

《全民小镇》提高每日收取最高爱心解析

《全民小镇》提高每日收取最高爱心解析

html与jsp开发分离技术

html与jsp开发分离技术
下拉加载更多内容 ↓