当前位置:首页 > 共享经济 > 正文内容

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

wxianyue3年前 (2021-02-07)共享经济635

[资料是从免费网站上获取的,上载在这里,只为交流学习目的,文章原作者保留所有权力,

如本博客的内容侵犯了你的权益,请与以下地址联系,本人获知后,马上删除。同时本人深表歉意,并致以崇高的谢意!]

网上大多数共享软件的注册码(又称为序列号)的设计都不是很好,比较容易被破解者做出注册机来。下面介绍一种利用公钥算法(又称为非对称算法)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([url][/url])来实现RSA。该库是用C写的,商业使用需要许可证。

1、首先随机生成密钥对。可以自己编程随机搜索大素数。此处由于是举例,我们采用RSATool([url][/url])生成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[ ] = "1885916733262625188591673328"; //用户输入的注册码

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

{

共享软件注册_共享服务软件_9158共享室软件

//正确的注册码

}

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

1、Crypto++:~weidai/cryptlib.html(C++)

2、MIRACL:~mscott/(C/C++)

3、GNU MP:(C)

4、Piologie:

5、cryptlib:~pgut001/cryptlib/

6、RSAEuro:

7、OpenSSL:

9、RSARef:

10、GInt:(Delphi)

扫描二维码推送至手机访问。

版权声明:本文由共享商业学院发布,如需转载请注明出处。

本文链接:http://pplcom.com/post/4438.html

分享给朋友:

相关文章

2019共享充电宝排名前十名是什么?共享充电宝怎么加盟赚钱

2019共享充电宝排名前十名是什么?共享充电宝怎么加盟赚钱

从当时陈欧发展共享充电宝“街电”完全不被大家理解,到现在共享充电宝发展势头高涨!就可以看出共享充电宝2020年的前景十分光明,有不少朋友都有想要加盟共享充电宝的想法,下面给大家介绍一下目前国内排名比较...

移动电源:江阴店里安装共享充电宝需要什么条件需要出钱买设备吗

移动电源:江阴店里安装共享充电宝需要什么条件需要出钱买设备吗

移动电源:江阴店里安装共享充电宝需要什么条件需要出钱买设备吗 共享充电宝的成功说明了小产品也能大有可为,随着行业的高速发展以及使用的频率越来越高,活跃用户数持续增长,引来了更多的投资者入场,形成了一定...

警惕共享充电宝信息安全“陷阱”

警惕共享充电宝信息安全“陷阱”

● 部分共享充电宝不仅可能存在质量隐患,还可能被不法分子植入“木马”程序,导致手机里的通讯录、文本信息甚至照片、视频等隐私数据被泄露 ● 一些黑色产业利用“木马”等恶意程序,控制用户的终端设备窃取数据...

共享充电宝贴牌订制OEM定制方案介绍

共享充电宝贴牌订制OEM定制方案介绍

越来越多关注共享充电宝的同学准备入局这个行业,很多人看到了市场的机会,想要自己贴牌定制自己的充电宝, 但是也有很多问题和需要提前了解的问题,慢慢充作为共享充电宝的源头工厂,为大家详细介绍一下订制 OE...

上海首家共享厨房落户闵行 可容纳十家餐饮店

上海首家共享厨房落户闵行 可容纳十家餐饮店

上海首家共享厨房落户闵行 可容纳十家餐饮店2018.07.06 07:58:30上海闵行摘要:如今,越来越多人享受着外卖的便捷,很多实体饭店也纷纷推出了线上外卖服务。但是你见过“只外卖不堂吃”的饭店吗...

黑谷餐饮系统共享店铺 避免员工流失的利器

黑谷餐饮系统共享店铺 避免员工流失的利器

餐饮最怕的是什么?菜品平平?生意不好?装修一般?还是。。。 nonono,这些问题都是可以改善的,餐饮最怕的是没有人! 菜品一般,可以改进菜单,或者换一个厨师!生意不好,可以做营销活动!装修一般黑谷...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。