软件加密-防止非法注册机制作

作者:狂风来临 来自:http://www.bitencrypt.com

现在很多软件在软件加密部分采用的基本都是明码比较的方式,或者是简单的加密算法,很容易就被别人破解然后写出注册机。为了提供软件的加密强度,本文从基本的加密知识开始说起,使你对自己的软件要怎么加密、或是要怎么改进现有加密方法心里有个数。

从算法说起,现在有太多的加密算法,如:Hash算法(包括MD5、SHA、CRC等)、对称算法又可以分为流密码(SEAL、RC4等)和分组算法(DES、AES等)、公开密钥算法(RSA等)、椭圆曲线算法(ECC)等。Hash类算法是不可逆的算法,一般用于作为数据的校验算法;对称算法属于可逆算法,可以用于加密解密;公开密钥算法也用于加密、解密和数字签名;椭圆曲线算法也用于加密、解密。

那么我把上面的算法引申到软件加密里面来看,首先是Hash算法
if Hash(UserName)=Serial then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’注册提示’,MB_OK);
看上面例子不难发现,采用Hash算法对用户信息进行运算,用得到的Hash值与用户输入的注册码比较,如果相等就表示注册成功,否则注册失败。在这个例子里面存在的问题就是Hash(UserName)得到的Hash值与用户输入的注册码比较,那么正确的注册码就会以明文的方式出现在内存中,只要在这个跳转的的地方下断就能轻松的得到正确的注册码,这个也就是我们上面所说的明文比较了。

接下来我们看一下对称算法
if DesEncrypt(UserName)=Serial then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
大家看了这种方式也许会发现和上面Hash方式的很相似,对,是一样的方式,也是先加密用户信息然后和用户输入的注册码进行比较,这样的话真正的注册也会以明文的方式存在以内存,在这个跳转的地方下断也能轻松得到正确的注册码。既然都是这样,那我们应该怎么来改正呢?
If UserName=DesDecrypt(Serial) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
上面这段代码是先把用户输入的注册码解密以后和用户信息比较,如果相同那么就注册成功,否则注册码。这样的话注册码比较就不是以明码的方式存在了,如果别人要写注册机的话就要去分析DesDecrypt是什么算法,然后才能写出注册了,难度是不是就提供了很多?这也就是所谓的非明码比较。上面这个采用的是对称算法,它的安全主要是依赖以密钥,那么我们在使用的时候应该怎么来保护密钥呢?
If UserName=DesDecrypt(Serial,MD5(Key)) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’ 软件注册成功!’,’注册提示’,MB_OK);
利用Hash类算法对密钥进行运算,运算得到的值才是最后的密钥,别人如果只是得到Key那么应用同样的算法做出的注册机也是不正确的,因为真正的Key是MD5(Key)。这样就起到了保护Key的作用的。

如果别人分析程序,找出真正的Key,那么用这样的方式加密也是不安全的,那到底什么样的算法才安全呢?在这里极力推荐使用公开密钥算法(如RSA等),为什么呢?因为这类算法用做加密的密钥不同于用做解密的密钥,而且解密密钥不能根据加密密钥计算出来。加密密钥可以公开,也就是公钥,而解密密钥是不能公开的,也就是私钥。RSA的的安全性是基于数学难题的,也就是大整数因子分解。下面我们来看看怎么用RSA来是显示软件加密。
if UserName=RSADecrypt(Serila,PubicKey) then
  MessageBox(Handle,’软件注册成功!’,’注册提示’,MB_OK)
Else
  MessageBox(Handle,’软件注册失败!’,’ 注册提示’,MB_OK);
对RSA最有效的攻击方法就是分解N,为了在短时间内N被分解,建议密钥是用1024位(比如2048位、4096位)以上。上面说了这么多概念性的东西,下面我们用一个实际的例子来表述一下。

由于使用RSA的密钥的位数越多速度越慢,读者在使用的时候应该有选择性的使用,在这里推荐BitEncrypt安全实验室开发的BEWorkShop,为什么?因为他们做的这套组件提供了RSA1024、RSA2048、RSA4096,运算速度都非常快、调用也很方便。下面是本文作者亲自测试给出的运算速度的数据:
RSA1024 1秒以内
RSA2048 2秒以内
RSA4096 5秒以内
看了这些数据是不是有点心动呢?就因为他们组件的速度比较快,并且他们的客户服务态度极好,个人认为选择他们的组件是不会错的。我买的就是他们的组件,感觉好用才写出来与各位分享的,如果有兴趣的读者可以下载来看看。
主页:http://www.bitencrypt.com
邮件:bitencrypt@163.com
客户服务QQ:136284742

本文的例子使用BEWorkShop组件来进行演示。
注册验证例子:
//获取硬盘系列号,作为加解密依据
procedure TMainFrm.FormCreate(Sender: TObject);
begin
  GetHDSerial();
  Edit2.Text:=TempResult;
end;

//由于注册码太长,所以采用文件的方式导入
procedure TMainFrm.Button1Click(Sender: TObject);
var
  FileName:String;
begin
  OpenDialog1.Filter:='授权文件(*.dat)|*.dat';
  if OpenDialog1.Execute then
    FileName:=OpenDialog1.FileName;
  if FileName='' then//如果没有选择文件退出
    Exit; 
  Memo1.Lines.LoadFromFile(FileName);
end;

//注册验证模块
procedure TMainFrm.Button2Click(Sender: TObject);
var
  InStr:String;
begin
  if Edit1.Text='' then
    begin
      MessageBox(Handle,'用户名不能空请重新输入!','注册提示',MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  if Memo1.Text='' then
    begin
      MessageBox(Handle,'注册码不能空请重新输入!','注册提示',MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  InStr:=Memo1.Text;
  RSADecrypt(PChar(InStr),PChar('11'),PChar('A7F4FDEC1F2DD8773A18AD32FC212593DD6A2C64227CF3726720189BF8558703E74504E02084A56ECC1130C0F4AE31271B4E77BE58A39BD0A7C5CA501AD8027D87C4C8291835'+'CA6B0150C8209213B74439F710D8C92F6BDDC4A1F1A999B9FAC6C62BE339612FC52F150F514431071026BFE6376F5260B5C44B07E4E25D502265'));
  if TempResult=(Edit1.Text+Edit2.Text) then
    Button2.Enabled:=False;
end;
上面程序实现了注册码验证例子,介绍一下RSADecrypt函数,第一个参数是输入的注册码,第二个参数是公密钥,第三个参数是模数。接口我是调用他们已经定义好的。

下面我们来实现注册机例子:
procedure TForm1.Button2Click(Sender: TObject);
var
  FileName,InfoStr:String;
begin
  FileName:=ExtractFilePath(Application.ExeName)+'Key.dat';
  if Edit1.Text='' then
    begin
      MessageBox(Handle,'用户名不能为空!','提示',MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  if Edit2.Text='' then
    begin
      MessageBox(Handle,'机器码不能为空!','提示',MB_OK+MB_ICONINFORMATION);
      Exit;
    end;
  InfoStr:=Edit1.Text+Edit2.Text; 
  RSAEncrypt(PChar(InfoStr),PChar('1A58A04D32113B0DAEC29DADA50A381731CA6150F659DFE9C9E6EAC321EF4C650123ECAFB4C9835CAC8F3EDD033E76244084C77D3B14A4FD97CEB652D708C92C88EE48183BDDF8EAE1F07D9B3F497C475365468F4756C7A44C8353B80BA1'+'97F7128DB6A7F9CFD2DC60BDACB621996FD5A1AD94C502B57A61E00F20BAB8364111')
                           ,PChar('A7F4FDEC1F2DD8773A18AD32FC212593DD6A2C64227CF3726720189BF8558703E74504E02084A56ECC1130C0F4AE31271B4E77BE58A39BD0A7C5CA501AD8027D87C4C8291835CA6B0150C8209213B74439F710D8C92F6BDDC4A1F1A999B9'+'FAC6C62BE339612FC52F150F514431071026BFE6376F5260B5C44B07E4E25D502265'));
  Memo1.Text:=TempResult;
  Memo1.Lines.SaveToFile(FileName);
  MessageBox(Handle,'注册码生成成功!','提示',MB_OK+MB_ICONINFORMATION);   
end;
RSADecrypt的第一个参数是需要进行加密的用户信息,比如注册码和用户名;第二个参数是私钥,第三个参数是模数。

从上面的例子可以看出,采用RSA进行加密,有效的防止了非法注册机的制作。是不是只现在这样做就可以防止软件被破解了?不是的,要做到强度高,那么需要的知识也比较多,比如反跟踪、加壳等知识。反跟踪在BEWorkShop组件里面也有接口提供,试用了一下感觉还不错,加壳工具在BEWorkShop里面也提供了,叫做BEProtect(我是购买了以后才收到的),这款壳压缩效率比较高,压缩率高达到50%,并且还有其它一些技术,在这里就不多说了,感兴趣的读者可以自己下载来看看。希望本文能给你在软件加密上带来一点帮助,这里作者只是把自己知道的写出来,如果有什么错误、建议和意见欢迎来信和我探讨。

[注:转载请注明出处,但请保留信息的完整性]
作者:狂风来临 来自:http://www.bitencrypt.com

Zprotect是新一代的软件加密保护系统,拥有多项革命性的创新技术,设计用来保护您的软件产品不被破解,减少由于盗版给您带来的经济损失!此外,Zprotect 拥有简单易用的许可控制系统,您无需更改任何代码,即可为您的软件添加注册机制。与传统软件保护系统相比,Zprotect更加注重对代码的处理,并且拥有良好的稳定性和兼容性,是您配置软件保护系统的最佳选择! Zprotect拥有简单易用、高效灵活的注册和授权管理系统: 一键试用技术. Zprotect 为您提供一键试用技术,您不必修改任何源代码,在短短几分钟之内就可以将您的完整版软件转换为“先试用后购买”的试用版软件,甚至还可以支持带硬件锁定的序列号注册。 内建注册和许可管理系统. Zprotect 内建灵活易用的注册和许可管理系统,您可以轻松创建具有时间限制、硬件锁定、水印信息的注册码。 动态算法生成引擎. 外壳所使用算法均动态生成,随机且唯一,让逆向算法变得困难和高成本。 时间限制注册密钥. 如果您需要限制注册版本的有效期,可以通过创建具有时间限制的注册密钥来实现。 硬件锁定(一机一码). 激活硬件锁定功能的注册密钥,只能在某一特定计算机上使用;您可以通过锁定用户计算机的硬件信息来控制注册码的传播,例如 CPU、硬盘序列号、网卡 MAC 地址等。 密钥黑名单. 如果您的用户泄漏了注册密钥,那么您就可以将该密钥添加进密钥黑名单,这样下一版本更新的时候您就可以锁定该密钥。 启动密码保护. 这种附加的保护可以有效防止软件未经授权的使用,必须输入正确的密码才可以运行程序。 试用次数、天数、日期和运行时间限制. 使用 Zprotect ,您可以轻松为您的应用程序添加试用次数、试用天数、试用日期和试运行时间等限制;这样您的客户就可以全功能评估您的软件产品,增大购买意向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值